Индексирование отдельных полей составных ключей SQL Server - PullRequest
8 голосов
/ 01 сентября 2010

Я преобразую базу данных Jet в SQL Server Express 2008 R2, и прежде чем сделать это, я переоцениваю схему (она была разработана в 1997-98 годах, и парень, который ее проектировал (то есть я), был что-то вроде дебила!).

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

Это хорошая идея в SQL Server?

(Может быть, это не очень хорошая идея в Jet?)

Ответы [ 3 ]

15 голосов
/ 01 сентября 2010

Те же правила применяются в SQL Server.Если у вас есть индекс для (ColumnA, ColumnB), запрос только для ColumnA или ColumnA и ColumnB может использовать индекс, но запрос только для ColumnB не может.Если есть необходимость присоединиться только к ColumnB, то вам обязательно нужно создать индекс.

5 голосов
/ 01 сентября 2010

Если у вас есть составной индекс для столбцов (A,B) без операций поиска, сканирования диапазона, сортировки или агрегирования, можно использовать его для выражений, которые содержат только B.Это верно для SQL Server, так же, как и для драйверов Jet (Red) (и я думаю, что для Jet Blue также).Некоторые другие механизмы могут использовать его в так называемой операции skip scan.

Поэтому ответ таков: вам нужны отдельные индексы только для (B).

4 голосов
/ 01 сентября 2010

Чтобы помочь вам больше, просто совет: на SQL-сервере, используя Managment studio, вы можете оценить производительность с помощью «Показать примерный план выполнения».Он показал, как работают индексы и объединение.

Также вы можете использовать DTA (помощник по настройке ядра СУБД) для получения дополнительной информации и оптимизации.

...