我正在与DBA发生一个有趣的争论,他坚持认为不应该在T-SQL中使用DELETE命令,而是删除数据的正确方法是将您想要保留的数据移动到临时表,删除并重新创建原始表。为此提供的理由是它应该防止索引碎片问题。
有没有人听说这是一种做法,任何人都可以提出为什么这可能是个好主意?这是一个相当复杂的结构,我们通常会讨论用于无限期聚合数据的表的少量选择性删除(图中,一次少于1000行)。
我无法想象这样做的理由,而不是简单地在适当的时候重新组织/重建索引,但如果我遗失某些东西,我会很乐意接受教育。谢谢!
答案 0 :(得分:6)
垃圾,除非您删除了99%的行。
有一些方面,例如事务日志效果,但删除表,键,索引以重新创建更复杂且容易出错。
难道你没有索引那些会碎片整理的维护......?
答案 1 :(得分:3)
在这种情况下,我不同意DBA。我不喜欢将我的“好”数据从物理结构中移出到临时表中,然后在重新创建后返回到新创建的结构,只是为了尝试减少索引碎片。解决方案是使用删除语句删除数据,如果碎片成为问题,则在该点重新索引。
答案 2 :(得分:1)
您应该至少每周运行一次维护计划来对索引进行碎片整理并更新统计信息,这将使他的论点完全没有实际意义。
然后,您可能需要在工作日中间创建新索引。假设任何类型的负载和一个相当大的表将影响你的性能远远超过一些索引碎片。
非常糟糕的主意。
答案 3 :(得分:1)
我同意其他所有人(前三个帖子,至少)。然而,IT是一个由“它依赖”组成的宇宙,所以我会玩一些魔鬼的推荐。
在某些情况下 - 极端情况 - 这可能是有道理的。
然后,也许,它可能有意义。但可能不是。
值得一提的是,我几乎可以看到DBA在其职业生涯早期基于上述某些情况而出现的情况,以及之后在所有类似情况下使用他们的“经验教训”。