Составной кластерный индекс и некластерный индекс в SQL Server 2005 - PullRequest
1 голос
/ 17 апреля 2011

Я создал новую таблицу с составным первичным ключом, скажем, PrmID и Type, для этого создан новый составной кластерный индекс (PrmID - первый). Я добавляю еще один некластеризованный индекс для Type.

Мой вопросэто - когда я генерирую запросы, которые выполняют какое-либо утверждение типа (например, GROUP BY), используется ли механизм SQL с использованием таблицы некластеризованного индекса или кластеризованного индекса PK (что дороже для запросов такого типа)?

Ответы [ 3 ]

3 голосов
/ 17 апреля 2011

- РЕДАКТИРОВАТЬ -

Спасибо, Марк, я пропустил это ...

- КОНЕЦ РЕДАКТИРОВАНИЯ -

Во-вторых, действительно ли PrimID не уникален в вашемтаблица, и является уникальной только в сочетании с типом?Если PrimID не дублируется в таблице, возможно, стоит пересмотреть вопрос о том, чтобы сделать его составным PK.

В-третьих, лучший способ ответить на эти типы вопросов - посмотреть план выполнения вашего запроса.Мы можем дать вам ответ о том, как мы думаем, что SQL должен обрабатывать план, но SQL Server изменит план выполнения для различных обстоятельств на основе данных в вашей базе данных, вашего оборудования и т. Д. ...

Вот как будет выглядеть план выполнения: enter image description here

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

2 голосов
/ 17 апреля 2011

Это зависит от того, как выглядит запрос, к каким столбцам обращаются, охватывает ли он и т. Д.

Простой тип GROUP BY, скорее всего, будет использовать индекс NC. Если вы используете другие столбцы, вы можете получить поиск по карте / ключу, иначе индекс будет проигнорирован, и у вас будет неэффективное сканирование PK

1 голос
/ 17 апреля 2011

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

Но, чтобы точно знать это , запустите ваш запрос с планом выполнения или даже просто с предполагаемым планом выполнения.Если вы используете SSMS, это просто нажать кнопку на панели инструментов.Это тот, который выглядит как три маленьких синих и зеленых квадрата в перевернутом "L" образце.Это скажет вам точно, какой индекс используется.И хотя планы выполнения могут меняться в течение срока действия запроса (при изменении данных), он не должен отвечать на этот вопрос.

...