我应该在索引中包含select中的所有列吗?

时间:2015-04-25 02:24:57

标签: sql sql-server indexing

我有一个查询需要运行它看起来像这样。

Select a.ColumnA,a.ColumnB,a.ColumnC,a.CoulmnD,a.columnE,...b.ColumnH
from Table A a
  inner join Table B b
       on a.columnB = b.ColumnB
  Where a.columnA = @VariableA

现在它在表A上有一个聚集索引,就像这样

Clustered Index on ColumnA

它在表A上也有一个非聚集索引,如此

NonClustered Index on (ColumnA,ColumnB) include (ColumnC,ColumnD)

我是否应该将ColumnsE-G添加到索引中?

1 个答案:

答案 0 :(得分:2)

  

当您在执行中看到索引扫描而不是预期的搜索时,验证比较列的数据类型 参数是否相同计划。

当数据类型不同时,SQL Server必须首先将优先级较低的操作数转换为较高优先级的数据类型(例如varcharnvarchar)。如果是必须转换的列值,则转换会阻止对列的索引进行有效使用,因为必须先转换每行的列值,然后才能进行比较。这称为不可sargable 表达式,阻止更有效的索引搜索