永久表上临时索引的范围是什么?

时间:2018-05-08 22:13:47

标签: sql-server tsql stored-procedures

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

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

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

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

2 个答案:

答案 0 :(得分:2)

没有"临时索引"。

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

如果您被允许创建索引,为什么不保留查询所需的索引?只需评估它,并确保它是您的表的一个很好的索引。您不希望额外的索引与仅有1个附加列或其他低效方案非常相似。

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

您是在聚合此表中的项目,还是仅此表格? 你在加入其他桌子吗?多少?他们索引正确吗? 该表多久更新,删除,插入等? 我的程序多久运行一次?

考虑到这些问题的答案以及可能的其他问题,您将知道您是否应该在桌面上有一个索引。或者,如果您要创建临时表或视图以在您的过程中进行操作。在任何一种情况下,您都不希望创建索引,执行某些操作,删除索引。你失去的比你获得的还多。

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

如果你将反复使用它,使用一个视图,你不必每次都重新创建它,并且它将是你运行你的sproc时的最新版本。如果在克隆上执行聚合仍然很慢,则可以将索引放在视图或临时表上。

如果你的sproc需要连接,你可能应该索引所涉及的表。否则,无论你对一张桌子做什么,最终所涉及的未经优化的桌子都会让你失望。

答案 1 :(得分:1)

建议不要通过存储过程在永久表上创建索引。 此索引将在您的永久表上创建,除非您将其删除,否则将永远存在。请看下面的图片。

如果在临时表上创建索引,则在会话结束时将删除该索引。

enter image description here