sql-server - 永久表上的临时索引的范围是什么?
问题描述
在存储过程中,我创建了这个索引:
CREATE NONCLUSTERED INDEX #IX_MyTempIndex ON dbo.MyPermTable (ColumnA, ColumnB) INCLUDE (ColumnC);
几天后,从不同的会话中,不同的用户收到错误消息“...名称为 '#IX_MyTempIndex' 的索引或统计信息已存在于表 'dbo.MyPermTable' 上。”
1)这是在永久表上指定临时索引的正确方法吗?
2)什么事件或范围会导致临时索引消失?
解决方案
没有“临时索引”之类的东西。
您可以创建一个带有索引的临时表,并且由于该表是临时的,因此索引也是如此,但这与您所描述的不同。
如果允许您创建索引,为什么不保留查询所需的索引?只需对其进行评估并确保它是您表格的良好索引。您不希望只有 1 个附加列或其他低效方案的附加索引超级相似。
此时,您需要问自己一些有关您正在运行的查询的严肃问题:
您是否在此表中汇总项目,并且仅在此表中?您要加入其他表吗?多少?它们的索引是否正确?该表多久更新、删除、插入等?我的程序多久运行一次?
给出这些问题以及可能的其他问题的答案后,您就会知道您是否真的应该在表格上放置一个索引。或者,如果您应该创建一个临时表或视图以在您的过程中进行处理。无论哪种情况,您都不想创建索引、做一些工作、删除索引。你失去的会比得到的多。
例如,如果您只对该表中的值进行一些聚合,并且它们需要一段时间,那么将整个表简单地复制到视图或临时表中可能会有所帮助。这将比进行聚合更快地从锁中释放基表,如果没有,只需在基表上进行工作。
如果您将一遍又一遍地使用它,请使用视图,您不必每次都重新创建它,并且在您运行存储过程时它将是最新的。如果在克隆上执行聚合仍然很慢,您可以将索引放在视图或临时表上。
如果您的 sproc 需要连接,您可能应该索引相关的表。否则,无论您对一张表做什么,最终所涉及的未优化表都会拖累您。
推荐阅读
- python - 在端口上运行 WSGI Web 服务器(不使用 IIS)
- reactjs - React:Lerna React 在 monorepo 上挂钩错误
- c# - 如何打包项目和使用 NuGet 包 + 文件?
- ssh-keys - CloverETL:如何使用 ssh 密钥连接到服务器
- html - 当在 inner-div 上设置宽度时,Z-Index 不适用于border-right
- here-api - 如何将 gtfs 数据的外部源添加到传输 api?
- ios - 如何使用 Swift 创建 JSON Codable
- java - 如何使用 DOCX4J 创建内部超链接
在将 JSON 请求转换为 HTML 请求后,我需要使用 DOCX4J 在 word 文档中为 TOC 创建超链接(
String HT
- c - 在 OpenMP 中取消初始化警告
- java - 如何从命令行导入随机数量的参数?