Должен ли я включить все мои столбцы из выбора в моем индексе?
У меня есть запрос, который занимает немного времени, чтобы выглядеть так.
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
Теперь у него есть кластерный индекс в таблице А, как это
Clustered Index on ColumnA
Он также имеет некластеризованный индекс в таблице A, например
NonClustered Index on (ColumnA,ColumnB) include (ColumnC,ColumnD)
Должен ли я добавить в индекс ColumnsE-G?
1 ответ
Убедитесь, что тип данных сравниваемых столбцов и параметров совпадают, когда вы видите сканирование индекса вместо ожидаемого поиска в плане выполнения.
Если типы данных различаются, SQL Server должен сначала преобразовать операнд с более низким приоритетом в тип данных с более высоким приоритетом (например, varchar
в nvarchar
). Когда необходимо преобразовать значение столбца, преобразование препятствует эффективному использованию индекса столбца, поскольку значение столбца каждой строки необходимо преобразовать, прежде чем можно будет выполнить сравнение. Это известно как невыражаемое выражение и препятствует более эффективному поиску по индексу.