在存储过程中,我创建了这个索引:
CREATE NONCLUSTERED INDEX #IX_MyTempIndex ON dbo.MyPermTable (ColumnA, ColumnB) INCLUDE (ColumnC);
几天后,在另一个会话中,另一个用户收到错误“......表'dbo.MyPermTable'上已存在名称为'#IX_MyTempIndex'的索引或统计信息。”
1)这是在永久表上指定临时索引的正确方法吗?
2)什么事件或范围会导致临时索引消失?
答案 0 :(得分:2)
没有"临时索引"。
你可以创建一个带有索引的临时表,并且由于该表是临时的,索引也是如此,但这与你所描述的不同。
如果您被允许创建索引,为什么不保留查询所需的索引?只需评估它,并确保它是您的表的一个很好的索引。您不希望额外的索引与仅有1个附加列或其他低效方案非常相似。
此时,您需要问自己一些关于您正在运行的查询的严重问题:
您是在聚合此表中的项目,还是仅此表格? 你在加入其他桌子吗?多少?他们索引正确吗? 该表多久更新,删除,插入等? 我的程序多久运行一次?
考虑到这些问题的答案以及可能的其他问题,您将知道您是否应该在桌面上有一个索引。或者,如果您要创建临时表或视图以在您的过程中进行操作。在任何一种情况下,您都不希望创建索引,执行某些操作,删除索引。你失去的比你获得的还多。
例如,如果您仅在此表中对值进行某些聚合,并且它们需要一段时间,则将整个表复制到视图或临时表中可能会有所帮助。这将比执行聚合更快地从锁中释放基表,如果没有,只需在基表上进行工作。
如果你将反复使用它,使用一个视图,你不必每次都重新创建它,并且它将是你运行你的sproc时的最新版本。如果在克隆上执行聚合仍然很慢,则可以将索引放在视图或临时表上。
如果你的sproc需要连接,你可能应该索引所涉及的表。否则,无论你对一张桌子做什么,最终所涉及的未经优化的桌子都会让你失望。
答案 1 :(得分:1)