Sql 使用包含所有列的特性的索引是否正确?

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_版本号等) 因此,在

调试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_版本号等)
因此,在
INCLUDE
中,建议使用大量列


虽然我知道在主索引子句中使用所有列是一种糟糕的设计,但在
INCLUDE
中使用所有字段会有什么缺点?或者在
INCLUDE
之后有这样一个包含许多列的索引是完全可以的(性能和优化方面)?

缺点是存储和维护。只要基础数据发生变化,数据就会被复制,索引就会更新。好处是索引将避免在计划中进行键查找,以便检索查询所需的其他列


请记住,此索引是一个建议,而不是一个建议。最好将现有的聚集索引更改为非聚集索引(可能使用选择性包含的列来优化查询),并将建议的索引设置为聚集索引。这是否合适取决于您的工作负载和查询组合。一个好的索引策略需要一个整体的方法,而不是只关注一个查询/索引

这本质上就是聚集索引的作用。因此,如果表没有聚集索引,可以使用索引的相关列创建一个聚集索引

包括所有的专栏是个好主意吗?我想说,作为一种普遍做法,这不是一个好主意。但肯定有一些特定的情况下,它是有用的。基本上,索引是表上任何查询的覆盖索引。因此,如果使用索引,则不会引用数据页

有以下缺点:

  • 插入、更新和删除速度较慢。即使非索引键上的更新也会影响索引。
    • 索引“和”表一样大(实际上有点大,因为索引中有额外的开销)
  • 在维护数据库方面,较大的索引具有级联效应,例如更长的备份/恢复时间和更长的碎片整理时间

SQL查询是否以“SELECT*”开头?众所周知,SQL Server Management Studio的“索引建议”功能有其严重的弱点—有时建议已经存在的索引,或建议这些类型的“过度”索引—这些都没有意义,不要盲目地实现该工具建议的任何内容!是的,我是说选择,但是插入速度也很重要,这不是一个好的做法。如果该语句生成的建议是针对该表运行的唯一语句(不太可能),那么是的,它将或多或少地起到帮助作用,但始终要以双倍表大小为代价。对于其他数据,alter语句(insert/updates和deletes)只意味着加倍时间。对于不使用该索引的选择,您仍有存储成本。