Есть ли разница между идентификатором, датой или датой, идентификатором индекса на сервере SQL - PullRequest
3 голосов
/ 06 мая 2009

Я создаю индекс в sql server 2005, и с коллегой обсуждается, есть ли разница между столбцами ключа индекса: идентификатор и дата, а дата - идентификатор.

Есть ли принципиальная разница в способе создания индекса в любом сценарии?

Будет ли это иметь значение в других версиях SQL-сервера?

Спасибо

Ответы [ 3 ]

8 голосов
/ 06 мая 2009

Да, определенно. Кто-нибудь когда-нибудь запрашивал в таблице дату JUST или идентификатор? Индекс даты, id может использоваться для поиска только даты, а не только id, и наоборот

Использование даты, id:

Jan 1     4  
Jan 1     7  
Jan 2     6  
Jan 2     9  
Jan 2     33  
Jan 3     23  
Jan 4     1

Использование идентификатора, дата:

1     Jan 4  
4     Jan 1  
6     Jan 2  
7     Jan 1  
9     Jan 2  
23    Jan 3  
33    Jan 2 

Если ваше предложение WHERE или JOIN в вашем запросе использует и дату, и идентификатор, тогда любой индекс подходит. Но вы можете видеть, что если вы выполняете поиск только по дате, первый индекс для этого полезен, а второй - совершенно случайный.

В более общем смысле, индекс на A, B, C, D будет полезен для запросов на A, B, C, D, ИЛИ A, B, C ИЛИ A, B ИЛИ только A.

3 голосов
/ 06 мая 2009

Порядок столбцов имеет значение, когда дело доходит до индексов. Будет ли это иметь значение в вашем случае, зависит.

Позвольте мне объяснить.

Допустим, у вас есть личный стол с именем, фамилией и отчеством.

Итак, вы создаете этот индекс со столбцами в следующем порядке:

FirstName, MiddleName, LastName

Теперь предположим, что теперь вы делаете запрос, используя WHERE для всех этих столбцов. Он будет использовать весь индекс.

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

Однако, если вы переставили индекс, как это:

FirstName, LastName, MiddleName

Тогда приведенный выше запрос захватит диапазон индекса с одинаковыми именами и фамилиями и получит их.

Легче понять, если взглянуть на это по-другому.

Телефонная книга сортируется по фамилии, затем по имени и отчеству. Если вы поместили второе имя между именем и фамилией и отсортировали, то люди с одинаковыми именем и фамилией, по-видимому, были бы повсюду, просто потому что вы сортировали по второму имени перед именем.

Следовательно, если вы ищете мое имя, которое называется "Lasse Vågsæther Karlsen", вы найдете всех Karlsen-людей, мы будем находиться в последовательном списке в телефонной книге, но мое имя будет казалось бы, случайным образом, просто потому, что список будет отсортирован Vågsåther.

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

Теперь, если все ваши запросы используют и идентификатор, и дату, это не имеет большого значения, но если все запросы содержат дату, и только некоторые из них содержат идентификатор, то я бы поставил дату первым, а идентификатор вторым Таким образом, индекс будет использоваться в большем количестве случаев.

0 голосов
/ 06 мая 2009

Да, это важно. Предположим, вы создали индекс по столбцам (A, B). Вы можете сделать SELECT с предложением WHERE, включая оба столбца и индекс. Индекс также будет использоваться, если вы делаете SELECT с WHERE, который включает только столбец A. Но если вы делаете SELECT с WHERE, который включает только столбец B, индекс не может использоваться .

Подробнее см. здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...