我正在研究各种查询优化技术。我仅通过在包含一列(用于多个 where 条件)的表上添加非聚集索引将查询执行时间从 1 分钟减少到 12 秒,但 DBA 对添加索引非常挑剔。
我想知道通过在临时表而不是实际表上添加 NCI 是否有任何区别。如果是,如何?如果否,为什么?
spa*_*dba 12
当涉及到索引时,临时表遵守与永久表相同的规则。唯一的区别在于存储位置,即临时表的 Tempdb。
但是,如果要向大量写入的表添加索引,则必须考虑写入与读取之间的权衡。
由于临时表可能在过程或脚本中使用,因此您的代码将控制您写入表的难度。
INSERT 在没有索引的情况下更快:如果您在多个语句中插入大量数据,您可能希望在完全填充表后创建索引。
UPDATE 和 DELETE 必须首先找到要修改的行,因此它们可以从正确的索引中受益匪浅。
如果您的 DBA 想要支付(大量)更多的读取 + CPU + 运行时间而不是一些写入,我认为(她)应该澄清他的观点。
长话短说,如果您的代码使用 NCI 运行得更快,请继续添加它。
在高流量表上动态添加 NCI 的方法概要:
在临时表上创建 NCI 所花费的时间比读取它要多得多。因此,总的来说,执行查询花费了更多时间。
实际表上的 NCI 速度要快得多。
最后,决定稍微优化一下查询并在实际表上创建 NCI。
我的问题的答案是“是”
当您在临时表和实际表上创建 NCI 时,这会产生巨大的差异。至少对于我的场景(具有数百万条记录和不断传入的数据的高流量表),在临时表上创建 NCI 不是正确的方法,因为构建索引然后读取它需要更多时间(这同样适用于我的类型)设想)。
当我问这个问题时,我对索引的理解是有限的。今天又学到了一点。
感谢大家!