临时表上的非聚集索引

Lea*_*ner 5 sql-server t-sql

我正在研究各种查询优化技术。我仅通过在包含一列(用于多个 where 条件)的表上添加非聚集索引将查询执行时间从 1 分钟减少到 12 秒,但 DBA 对添加索引非常挑剔。

我想知道通过在临时表而不是实际表上添加 NCI 是否有任何区别。如果是,如何?如果否,为什么?

spa*_*dba 12

当涉及到索引时,临时表遵守与永久表相同的规则。唯一的区别在于存储位置,即临时表的 Tempdb。
但是,如果要向大量写入的表添加索引,则必须考虑写入与读取之间的权衡。

由于临时表可能在过程或脚本中使用,因此您的代码将控制您写入表的难度。
INSERT 在没有索引的情况下更快:如果您在多个语句中插入大量数据,您可能希望在完全填充表后创建索引。
UPDATE 和 DELETE 必须首先找到要修改的行,因此它们可以从正确的索引中受益匪浅。

如果您的 DBA 想要支付(大量)更多的读取 + CPU + 运行时间而不是一些写入,我认为(她)应该澄清他的观点。

长话短说,如果您的代码使用 NCI 运行得更快,请继续添加它。


Lea*_*ner 0

在高流量表上动态添加 NCI 的方法概要:

在临时表上创建 NCI 所花费的时间比读取它要多得多。因此,总的来说,执行查询花费了更多时间。

实际表上的 NCI 速度要快得多。

最后,决定稍微优化一下查询并在实际表上创建 NCI。

我的问题的答案是“是”

当您在临时表和实际表上创建 NCI 时,这会产生巨大的差异。至少对于我的场景(具有数百万条记录和不断传入的数据的高流量表),在临时表上创建 NCI 不是正确的方法,因为构建索引然后读取它需要更多时间(这同样适用于我的类型)设想)。

当我问这个问题时,我对索引的理解是有限的。今天又学到了一点。

感谢大家!