2013-06-17 2 views
0

http://www.sqlservercentral.com/articles/Stairway+Series/72284/Изменение порядка столбцов в составном индексе?

Я читаю эту статью sqlservercentral, где они запрашивают ее использование.

SELECT * 
    FROM Person.Contact 
    WHERE FirstName = 'Helen' 
     AND LastName = 'Meyer'; 
GO 

и для того, чтобы сделать вышеуказанный поиск быстрее, они создали следующий указатель.

CREATE NONCLUSTERED INDEX FullName 
      ON Person.Contact 
    (LastName, FirstName); 
GO 

Я не могу понять, где мы имеем первое имя, а затем фамилию. и в индексе это противоположный порядок (фамилия, имя)

Как это имеет значение здесь, когда мы создаем составной индекс. Я знаю, что фамилия будет отсортирована сначала, а затем будет отсортировано первое имя.

Я проверил статистику, создав индекс в обоих направлениях (имя, фамилия) и (имя, фамилия).

(lastname, firstname) подход немного быстрее, я хочу знать, ПОЧЕМУ, где порядок заказа и порядок столбцов индекса противоположны?

+1

В случае, не имеет значения, в каком порядке находится индекс. Тот, который у вас есть для поиска по запросу ('LastName, FirstName'), когда оба указаны, и работает одинаково хорошо при поиске, в котором указывается только' LastName '. Однако: это будет ** не ** помощь, если вы ищете только «FirstName». Чтобы работать с составным индексом, вы должны указать n самых левых столбцов индекса в разделе 'WHERE' (здесь: 1 или 2 слева). –

+0

@marc_s Если я создаю составной индекс на 5 столбцах 'Comp_IX (col1, col2, col3, col4, col5)', то либо я могу указать все 5 столбцов, либо оставить только '' col1', поэтому он будет искать индекс, mi right ? –

+2

@ VishwanathDalvi: если у вас есть такой индекс, вы можете искать в 'col1', или' col1' и 'col2', или' col1' и 'col2' и' col3' - и так далее. Но вы ** не можете ** искать только на 'col3', или на' col2' и 'col5' - в каждом WHERE должны быть включены ** n самых разных столбцов ** (как указано в определении индекса) ** пункт ** - в противном случае индекс бесполезен –

ответ

0

SQL Server (и большинство СУРБД) будет игнорировать порядок условий WHERE.

Это происходит потому, что SQL является декларативным языком: вы говорите, чего не хотите, как это сделать. Поэтому оптимизатор запросов изменит условия WHERE для соответствия подходящим индексам.

Обратите внимание, что здесь вы найдете ключевой поиск кластерного индекса в плане запроса, чтобы получить остальные столбцы, которые не находятся в индексе, потому что они не покрывают.

+0

Любая причина для нисходящего? Или указать, что не так? Или просто анонимный трус? http://stackoverflow.com/questions/1153397/besides-a-declarative-language-is-sql-a-functional-language и http://programmers.stackexchange.com/questions/200319/is-sql-declarative back я здесь ... – gbn

Смежные вопросы