首页 > 解决方案 > 永久表上的临时索引的范围是什么?

问题描述

在存储过程中,我创建了这个索引:

CREATE NONCLUSTERED INDEX #IX_MyTempIndex ON dbo.MyPermTable (ColumnA, ColumnB) INCLUDE (ColumnC);

几天后,从不同的会话中,不同的用户收到错误消息“...名称为 '#IX_MyTempIndex' 的索引或统计信息已存在于表 'dbo.MyPermTable' 上。”

1)这是在永久表上指定临时索引的正确方法吗?
2)什么事件或范围会导致临时索引消失?

标签: sql-servertsqlstored-procedures

解决方案


没有“临时索引”之类的东西。

您可以创建一个带有索引的临时表,并且由于该表是临时的,因此索引也是如此,但这与您所描述的不同。

如果允许您创建索引,为什么不保留查询所需的索引?只需对其进行评估并确保它是您表格的良好索引。您不希望只有 1 个附加列或其他低效方案的附加索引超级相似。

此时,您需要问自己一些有关您正在运行的查询的严肃问题:

您是否在此表中汇总项目,并且仅在此表中?您要加入其他表吗?多少?它们的索引是否正确?该表多久更新、删除、插入等?我的程序多久运行一次?

给出这些问题以及可能的其他问题的答案后,您就会知道您是否真的应该在表格上放置一个索引。或者,如果您应该创建一个临时表或视图以在您的过程中进行处理。无论哪种情况,您都不想创建索引、做一些工作、删除索引。你失去的会比得到的多。

例如,如果您只对该表中的值进行一些聚合,并且它们需要一段时间,那么将整个表简单地复制到视图或临时表中可能会有所帮助。这将比进行聚合更快地从锁中释放基表,如果没有,只需在基表上进行工作。

如果您将一遍又一遍地使用它,请使用视图,您不必每次都重新创建它,并且在您运行存储过程时它将是最新的。如果在克隆上执行聚合仍然很慢,您可以将索引放在视图或临时表上。

如果您的 sproc 需要连接,您可能应该索引相关的表。否则,无论您对一张表做什么,最终所涉及的未优化表都会拖累您。


推荐阅读