Sql 使用包含所有列的特性的索引是否正确?
调试SQL查询时,SQL Server Dev Studio建议我必须创建如下索引:Sql 使用包含所有列的特性的索引是否正确?,sql,sql-server,indexing,Sql,Sql Server,Indexing,调试SQL查询时,SQL Server Dev Studio建议我必须创建如下索引: CREATE INDEX IX_MY_INDEX ON T_EVENT (F_ORIGINAL_ID, F_EVENT_SEQUENCE_NO) INCLUDE (F_USER_ID, F_REVISION_NO, ... <about 30-40 columns>) 在T_事件上创建索引IX_MY_索引(F_原始ID,F_事件序列号) 包括(F_用户ID、F_版本号等) 因此,在
CREATE INDEX IX_MY_INDEX ON T_EVENT (F_ORIGINAL_ID, F_EVENT_SEQUENCE_NO)
INCLUDE (F_USER_ID, F_REVISION_NO, ... <about 30-40 columns>)
在T_事件上创建索引IX_MY_索引(F_原始ID,F_事件序列号)
包括(F_用户ID、F_版本号等)
因此,在INCLUDE
中,建议使用大量列
虽然我知道在主索引子句中使用所有列是一种糟糕的设计,但在
INCLUDE
中使用所有字段会有什么缺点?或者在INCLUDE
之后有这样一个包含许多列的索引是完全可以的(性能和优化方面)?缺点是存储和维护。只要基础数据发生变化,数据就会被复制,索引就会更新。好处是索引将避免在计划中进行键查找,以便检索查询所需的其他列
请记住,此索引是一个建议,而不是一个建议。最好将现有的聚集索引更改为非聚集索引(可能使用选择性包含的列来优化查询),并将建议的索引设置为聚集索引。这是否合适取决于您的工作负载和查询组合。一个好的索引策略需要一个整体的方法,而不是只关注一个查询/索引 这本质上就是聚集索引的作用。因此,如果表没有聚集索引,可以使用索引的相关列创建一个聚集索引 包括所有的专栏是个好主意吗?我想说,作为一种普遍做法,这不是一个好主意。但肯定有一些特定的情况下,它是有用的。基本上,索引是表上任何查询的覆盖索引。因此,如果使用索引,则不会引用数据页 有以下缺点:
- 插入、更新和删除速度较慢。即使非索引键上的更新也会影响索引。
- 索引“和”表一样大(实际上有点大,因为索引中有额外的开销)
- 在维护数据库方面,较大的索引具有级联效应,例如更长的备份/恢复时间和更长的碎片整理时间