SQL Сервер два столбца в индексе, но запрашивает только один - PullRequest
0 голосов
/ 08 мая 2020

В устаревшем коде я нашел следующий индекс:

CREATE CLUSTERED INDEX ix_MyTable_foo ON MyTable
(
    id ASC,
    name ASC
)

Если я правильно понимаю, этот индекс будет полезен для запроса только по столбцу id или id и name. Правильно ли это?

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

select someColumn from MyTable where id = 4

Но это ничего не сделает для этого запроса:

select someColumn from MyTable where name = 'test'

1 Ответ

1 голос
/ 08 мая 2020

Да, вы правы. Но в случае, когда у вас есть таблица со многими столбцами:

A
B
C
D
..
F

, где ваш индекс первичного ключа, например, (A), если у вас есть второй индекс, например (B,C), движок может решить использовать его, если вы используете такой запрос:

CREATE TABLE dbo.StackOverflow
(
    A INT
   ,B INT 
   ,C INT 
   ,D INT 
   ,E INT
   ,PRIMARY KEY (A)
   ,CONSTRAINT IX UNIQUE(B,C)
)

SELECT A     
      ,C 
FROM dbo.StackOverflow
WHERE C = 0;

enter image description here

Итак, если индекс может использоваться как covering, движок может использовать его даже вас не интересуют некоторые столбцы, потому что он решит, что будет выполнено меньше работы (меньше чтения).

В вашем случае кажется, что PK в столбце id является лучшим выбором с комбинация со вторым индексом в столбце name.

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