数据库管理员

希望提高数据库技能并向社区中的其他人学习的数据库专业人员的问答

2
在UPDATE之后触发UPDATE吗?
我想触发一个将任何更新时间记录为: CREATE TRIGGER col_update AFTER UPDATE ON col FOR EACH ROW BEGIN UPDATE col SET updated=NOW() WHERE id=NEW.id; // or OLD.id END 问题在于,当此触发器尝试更新updated列时,它也是另一个运行触发器的更新事件。这将创建一个无限循环,该循环将不起作用。 如何将更新时间存储在相应的列中? 我希望使用触发器,因为表中有很多列。如果尝试手动设置更新时间,则需要修改许多查询。

4
重建索引,数据库现在的大小是原来的10倍
我有一个大约15演出的SQL Server数据库(2008 R2 SP1)。事实证明,维护已经有一段时间没有运行了,所以我创建了一个维护计划来重建所有索引,它们非常分散。 这项工作完成了,碎片消失了,但是现在数据库已超过120个演出!我知道它会使用额外的空间来进行所有重建,但是既然工作已经完成,我认为所有空间都是可用空间,但是可用空间仅显示为3个演出,因此正在使用117个演出即使索引重建作业已完成。 我很困惑,可以使用一些指导,我已经将数据库恢复到合理的大小,我们没有足够的磁盘空间。 提前致谢! 这是发布的两个查询的结果: log_reuse_wait_desc没有 name TotalSpaceInMB UsedSpaceInMB FreeSpaceInMB LIVE_Data 152 123 28 LIVE_Log 18939 89 18849 LIVE_1_Data 114977 111289 3688 第3个文件是.ndf文件,该文件仅在未使用的空间中显示3688,但是在111289中的存储量约为15 gigs。

4
表分区以存档数据
场景: 两个数据库:DB_A和DB_Archive,其中有一个非常大的表,称为tableA。 每天都会将超过60天的记录从DB_A中删除,并移至DB_Archive,主要是为了使事情“分开”,因为过去两个月的记录都在DB_A上严重查询了tableA。 我想摆脱此过程,因为它速度慢且消耗大量资源。我正在考虑在date_Column上使用分区功能在DB_A上实现表分区,并在一个分区上存储所有<2个月的记录,在另一个分区上存储所有> 2个月的记录。我的问题: 如果我有2个不同的数据库,这种情况的行为会如何?如果我在tableA中查询记录> getdate()-30,它将读取归档分区吗? 我以为我也必须对索引进行分区,对吗? 我要如何处理明天我的分区函数将“更改”的事实,我的意思是,如果今天创建该函数(7月2日,其范围将是5月2日,但是明天将是5月3日)。我可以创建动态分区功能吗?



2
为什么MySQL在磁盘上创建了这么多临时表?
任何配置错误都能导致mysql..mysql调谐器显示创建过多的临时表吗 Current max_heap_table_size = 200 M Current tmp_table_size = 200 M Of 17158 temp tables, 30% were created on disk table_open_cache = 125 tables table_definition_cache = 256 tables You have a total of 97 tables You have 125 open tables. Current table_cache hit rate is 3% 较早的临时表是“在23725个临时表中,有38%是在磁盘上创建的”,但我将max_heap和tmp_table从16m更改为200m,并将其降低到30%。 组态: engine myisam …
13 mysql  innodb  myisam  memory 

1
如何控制SQL Server对ram的过度使用?
我正在使用的数据库服务器正在运行6个不同的SQL Server实例。它具有48 GB RAM。其中之一正在消耗超过10 GB的RAM,目前总消耗为20 GB。RAM消耗持续增长。在使用40 GB以上的RAM之前的几天,服务器的响应速度非常慢。该应用程序显示保存数据时的崩溃问题。 因此,我重新启动了SQL Server服务。 服务重新启动后,使用率已降至4 GB,但现在正在增长。而且我担心它会在4到5天内增长到40 GB,并使服务器变慢。 我猜服务重启不是一个好选择。 我还从其他来源发现,我们可以设置SQL Server的最大内存使用大小。而且我不确定这是否会有所帮助。我无法对此进行测试,因为服务器正在使用生产数据库,如果在修改SQL Server中的设置时服务停止,则将有风险。 任何人都可以帮助解决这个问题吗?
13 sql-server 

2
定义索引时,列的某些顺序有什么好处
例如,如果我有两个索引: CREATE INDEX IDX_1 ON MY_TABLE_1 (ITEM, DATE, LOCATION) COMPUTE STATISTICS; CREATE INDEX IDX_2 ON MY_TABLE_1 (DATE, LOCATION, ITEM) COMPUTE STATISTICS; 这会变得IDX_2多余吗?如果没有,如何确定列的声明顺序? 我应该为常规查询量身定制索引吗?
13 oracle  index 

2
如何从InnoDB表中删除碎片?
我有一个具有表数量的数据库。 我想从表中删除一些记录,说记录数超过20K或50K。 所有的表都是InnoDB。而且file_per_table是关闭。 当我从多个表中删除记录时,表中会出现碎片。 有什么方法可以消除碎片吗? 4月17日更新 mysql> select TABLE_NAME, TABLE_SCHEMA, Data_free from information_schema.TABLES where TABLE_SCHEMA NOT IN ('information_schema', 'mysql') and Data_Free >0; +-----------------+--------------+-----------+ | TABLE_NAME | TABLE_SCHEMA | Data_free | +-----------------+--------------+-----------+ | City | world_innodb | 5242880 | | City_Copy | world_innodb | 5242880 | | Country | world_innodb | …

4
mysql int vs varchar作为主键(InnoDB存储引擎?
我正在构建一个Web应用程序(项目管理系统),并且在性能方面一直想知道这一点。 我有一个Issues表,里面有12个外键链接到其他各种表。在其中的8个中,我需要加入才能从其他表中获取title字段,以便使记录在Web应用程序中有意义,但是,这意味着进行8个加入似乎非常繁琐,尤其是因为我只是在拉入这些联接中的每个联接都有1个字段。 现在,出于永久性的原因,我还被告知要使用自动递增的主键(除非考虑到分片,在这种情况下我应该使用GUID),但是在性能上使用varchar(最大长度为32)有多糟糕?我的意思是,这些表中的大多数可能不会有很多记录(其中大多数应该在20以下)。另外,如果我使用标题作为主键,则不必在95%的时间内进行联接,因此对于95%的sql,我什至会发生任何性能下降(我认为)。我唯一能想到的缺点是我将拥有更高的磁盘空间使用率(但是一天下来确实是一件大事)。 我将查找表用于很多此类而不是枚举的原因是因为我需要最终用户可以通过应用程序本身配置所有这些值。 将varchar用作不包含很多记录的表的主键有什么弊端? 更新-一些测试 因此,我决定对此做一些基本测试。我有100000条记录,这些是基本查询: 基本VARCHAR FK查询 SELECT i.id, i.key, i.title, i.reporterUserUsername, i.assignedUserUsername, i.projectTitle, i.ProjectComponentTitle, i.affectedProjectVersionTitle, i.originalFixedProjectVersionTitle, i.fixedProjectVersionTitle, i.durationEstimate, i.storyPoints, i.dueDate, i.issueSecurityLevelId, i.creatorUserUsername, i.createdTimestamp, i.updatedTimestamp, i.issueTypeId, i.issueStatusId FROM ProjectManagement.Issues i 基本INT FK查询 SELECT i.id, i.key, i.title, ru.username as reporterUserUsername, au.username as assignedUserUsername, p.title as projectTitle, pc.title as ProjectComponentTitle, …

1
插槽阵列和总页面大小
我继续在许多论坛和博客中读到一个页面构成,如下所示:页面大小:16 x 512B = 8192B页面标题:= 96B最大行内行:= 8060B 这留下(8192-96-8060)B = 36B。 好的,这是合乎逻辑且正确的。我的问题是:为什么有那么多人说剩下的36B是为插槽阵列保留的? 显然,插槽数组在页面上每行提供2B的空间;因此,它可以小至2B,大至1472B: 2B:1行* 2B = 2B 1472B:8096B = n * 9B(带有开销的最小行大小...考虑单个TINYINT列)+ n * 2B(每行的插槽阵列成本)=> 8096 = 11n => n = 8096/11 = 736。 736 * 2B = 1472B。 由于使用14B版本标记,因此我的排名为20。 USE master ; GO CREATE DATABASE test ; GO USE test …

1
DBCC CHECKDB每20-60秒触发一次
我有一个开发环境,正在迅速将其部署到生产环境中,并且在日志中注意到大约每20秒我会看到以下消息: Starting up database 'dbname' CHECKDB for database 'dbname' finished without errors 我注意到了这一点,因为测试此问题的最终用户遇到了一个问题,但我将其隔离为Windows事件日志(应用程序日志)中发现的错误: The log for database 'dbname' is not available. Check event log for related messages. 顺便说一句,我没有找到相关消息,但是通过离线/在线周期解决了。 我唯一能想到的是该应用程序每1毫秒收集一次数据,但是不会将所有这些数据插入数据库中。作为开发服务器,已对其进行了配置,以使日志和数据位于同一驱动器上。考虑到这两条信息,我倾向于将其作为IO问题,并且服务器正在尝试从与存储(SAN)的连接断开中恢复。但是,即使这对我来说也没有意义,因为它不会丢失所有数据库,而只是丢失所有数据库。还有什么可能导致这种情况? 平台:Windows Server 2008 R2上的SQL Server 2008 R2(Ent。)(标准)

4
InnoDB行锁定-如何实现
我一直在四处逛逛,阅读mysql站点,但仍然看不到它是如何工作的。 我想选择结果并对其行锁定以进行写入,写入更改并释放锁定。audocommit已开启。 方案 id (int) name (varchar50) status (enum 'pending', 'working', 'complete') created (datetime) updated (datetime) 选择状态为待定的项目,然后将其更新为工作状态。使用排他性写入来确保同一物品不会被拾取两次。 所以; "SELECT id FROM `items` WHERE `status`='pending' LIMIT 1 FOR WRITE" 从结果中获取ID "UPDATE `items` SET `status`='working', `updated`=NOW() WHERE `id`=<selected id> 我是否需要做任何事情来释放锁,它是否像我上面所做的那样工作?
13 mysql  innodb  locking 

1
磁盘文件删除和清除的影响
我有一个经常更新的表,其中包含2.4亿行(并且还在不断增长)。每三小时插入150万行,删除150万行。当我将群集移至SSD时,此批量插入(使用副本)的时间从22分钟减少到2.3分钟。删除时间也得到了改善。我计划每两个小时或每小时进行一次批量更新。 尽管现在的性能(在SSD之后)可以与更频繁的更新兼容,但我已经读到了一些有关由于有限的NAND耐久性和写入放大而导致SSD死亡的恐怖故事。由于固态硬盘价格昂贵,我想将其淘汰时间推向未来。因此,我的问题是:磁盘文件在删除和随后的清理中到底发生了什么?我猜有两个磁盘写操作,一个将行标记为已删除,另一个在清理时将其标记为可覆盖。如果不是在每个批量插入/删除操作中对创建和删除表进行分区而不是删除和清理,我将使SSD的磨损最小化吗?

3
在SQL Server的表上具有多个可为空的FK是否被视为一种不好的做法
在SQL Server的数据库结构中,我有3种类型的产品,它们需要有关订单的不同信息。所以,我创建了一个Customers桌子,三个不同的顺序表:OrdersForProductAs,OrdersForProductBs,OrdersForProductCs。所有订单表在表上都有一对多的关系Customers。 我还有另一个表格,Payments里面将保存付款明细。但是我在这里对如何组织感到怀疑。 因为我有多种产品类型,并且一个客户可能同时具有多个产品的订单,所以我需要将这三个订单表与Payments表相关联。 另一个问题是,客户只能订购一种产品。因此,表上的FK列Payments需要为nullable。 我的问题是nullable,从长远来看,那些FK色谱柱是否会让我头疼?一般来说,在表上具有可空的FK列是否会被视为不好的做法?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.