我们有2个表,大约有40M行。数据库的大小约为20GB,大多数是针对这两个表。每天,我们需要删除一些数据,即大约10M行。因此,我们使用批量删除将日志文件保持在一定的大小。
最初,表没有主键。但是每个表都有唯一的聚簇索引。删除需要永远。即,在虚拟机上删除500K行需要大约2-3小时。 *删除之前,索引已重建。
现在,我们将唯一的聚簇索引转换为主键。删除2M行大约需要20-30分钟。
我知道主键和唯一聚簇索引之间存在差异,但为什么性能如此不同?
任何人都有一些见解?
感谢
答案 0 :(得分:6)
滚动我的8-Ball:如果您声明了非群集主键(因为它似乎从您的帖子中建议),那么在每个批次上您很可能会点击index tipping point 。因此,每个批次将执行40M行的完整扫描以删除批量大小。然后,在下一批次上,再次进行全扫描。依此类推,直到你的10M被删除。使用群集密钥,批处理应仅扫描要删除的实际行(当然,我假设您的批删除条件实际上将使用群集密钥...)。如你所见,当一个人开始猜测 ...
时,有许多未知数但最终......你有一个性能问题,你应该使用性能故障排除技术进行调查。捕获执行计划,wait stats,statistics io。遵循Waits and Queues等方法。测量。请勿听取互联网上刚推出guesses ...
的人的8-Ball答案 1 :(得分:1)
您可以尝试在删除之前删除索引,然后在之后重新添加。如果我没有弄错,每次删除后都会重新组织索引;这需要额外的时间。
答案 2 :(得分:1)
我想这可能就像你的索引在一次删除操作之前非常分散但在另一次之前没有。群集唯一索引有多碎片?在使用ALTER INDEX ALL ON blah REBUILD
在创建唯一聚簇索引时使用了哪些选项(具体如下设置为:PAD_INDEX,STATISTICS_NORECOMPUTE,SORT_IN_TEMPDB,IGNORE_DUP_KEY,ALLOW_ROW_LOCKS和ALLOW_PAGE_LOCKS)?