我知道我们迫切需要一个数据库维护策略。
+1 用于确定需求
就我的背景而言,我是一名在这家公司兼职的大学生
继续学习,获得经验,但同时获得一位经验丰富的顾问。
该表由 24 个工作人员填充,每个工作人员运行 4 个线程
我认为这在工作日是非常关键的任务,而停机是坏消息?如果是这样,请不要附和它。
ResultID 和 Fieldname 上有一个聚集索引
正如您所指出的,ResultID 是 PK 中的第一列吗?
如果是这样,我敢打赌,它的选择性不够,并且根据查询的需求,应该交换 PK 字段的顺序(尽管这个复合键看起来对于集群 PK 来说是一个糟糕的选择)
结果是什么:
从 MyTable 中选择 COUNT(*)、COUNT(DISTINCT ResultID)
例如,如果第一个计数是第二个计数的 4 倍或更多,那么由于 ResultsID 的选择性低,您很可能会优先获得扫描而不是搜索,并且一些简单的更改将带来巨大的性能改进。
此外,Fieldname 非常宽(50 个字符),因此任何二级索引都会在每个索引条目中添加 50 + 4 个字节。这些字段真的是 CHAR 而不是 VARCHAR 吗?
我个人会考虑增加叶页的密度。在 90% 时,您只会留下一些空白 - 可能每页一个。但是对于一个包含 5 亿行的大表,更高的打包密度可能意味着树中的级别更少,因此检索的次数更少。与此相反,对于给定的页面,几乎每个插入都需要页面拆分。这将有利于集群的插入,因此可能不合适(假设您的插入数据可能未集群)。像许多事情一样,您需要进行测试以确定哪种索引键密度最有效。SQL Server 提供了一些工具来帮助分析查询是如何被解析的、它们是否被缓存、它们导致的表扫描次数、哪些查询“运行缓慢”等等。
让顾问进来看看并给你一些建议。这不是一个在这里回答的问题将为您提供一个安全的解决方案来实施。
对于每天有 5 亿行和大量插入的表,您确实需要仔细考虑维护策略。抱歉,但我对进入这种状态的公司感到非常沮丧。
该表需要进行碎片整理(如果您没有聚集索引,您的选项将变得更少,因此请保留它,直到您确定有更好的候选者)。“在线”碎片整理方法将对性能产生适度的影响,并且可能会突然消失 - 如果它们超出时间/CPU限制,可以安全地中止[尽管这很可能需要一些编程]。如果您有一个“安静”插槽,则将其用于表碎片整理和更新索引的统计信息。不要等到周末才尝试一次完成所有桌子 - 在每天的任何安静时间(大概在晚上)尽可能多地做。
对表进行碎片整理可能会导致 Transaction log 使用量大幅增加,因此请确保经常备份任何 TLog(我们有一个 10 分钟的 TLog 备份策略,我们在碎片整理期间将其增加到每分钟一次,以便碎片整理过程不会成为所需 Tlog 空间的定义!)