2010-08-06 3 views
2

Когда я объявляю кластеризованный индекс, указав: column1, column2 и column3 в этом порядке - мне нужно использовать столбцы в том же порядке?Нужно ли использовать несколько столбцов SQL Server в том же порядке, что и я объявляю?

Например, будет ли это использовать кластерный индекс выше, чтобы обновить несколько строк:

UPDATE Table1  
    WHERE column3 = 1 
     AND column2 = 1 
     AND column1 = 1 
+0

Просьба уточнить ваш вопрос, я не совсем уверен, что вы на самом деле спрашиваете здесь. – Ross

+0

И я тоже. Я не понимаю, что он пытается сказать. – ppshein

+0

Кластеризованный и некластеризованный индекс может быть индексом покрытия - индекс покрытия означает, что индекс ссылается на более чем один столбец. Кластеризованный индекс подразумевает, что это первичный ключ для таблицы, но это не обязательно так. –

ответ

3

Порядка вы используете объявят элементы в ИНЕКЕ, как вы заявили, не должно иметь значение как зависит ли сервер базы данных от использования индекса, который охватывает эти столбцы.

+0

Мой коллега только что сказал мне, что я должен использовать столбцы индекса в той же последовательности, что и я их объявляю. Но я не нашел документа для этого требования. –

+0

@Tony Bao: Заказ в запросе не имеет значения, но порядок в индексе покрытия имеет значение. –

+0

@Tony Bao - механизм запросов достаточно умен, чтобы знать, что столбцы, на которые ссылается карта, соответствуют существующему индексу. Порядок, в котором вы указываете столбцы, не имеет значения. Это достаточно легко проверить. Создайте запрос, который использует индекс и изменит порядок столбцов и посмотрит, изменится ли план выполнения (подсказка: он не будет). – Thomas

1

Это правда, что когда вы проверяете точное равенство, этот порядок не имеет значения.

Но это не означает, что порядок в индексе не имеет значения - возможно, именно это пытался сказать ваш коллега. Например, если у меня есть таблица:

PersonID FName LName 
-------- ------- ----- 
1   John  Smith 
2   Bill  Jones 
3   Frank Smith 
4   Jane  Jackson 
... 
(assume a significantly large table) 

и я определить индекс на нем в порядке (LName, FName), что индекс будет обязательно работать по-другому, чем индекс, определенный в порядке (FName, LName) , в зависимости от того, что представляет собой запрос.

Например, для запроса: SELECT * FROM People WHERE LName = 'Smith', вы, скорее всего, получите лучший план для индекса первого типа, чем для второго типа.

Аналогичным образом, SELECT * FROM People WHERE FName = 'John' будет работать лучше со второй структурой индекса по сравнению с первым.

И SELECT * FROM People WHERE FName = 'John' AND LName = 'Smith' будет выполнять то же самое независимо от того, в каком порядке создается индекс.

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