Нужно уточнить при выборе индекса SQL Server - PullRequest
0 голосов
/ 21 мая 2018

У нас есть существующая структура таблицы, как показано ниже

Имя таблицы: Поставщик #

Столбцы:

Provid
EntityId
SpecialityCode
ProvType
FedId
FullName
Status

В этой таблице ProvId является первичным ключом,Таким образом, у нас есть кластеризованный индекс на ProvId.

Помимо этого у нас есть два составных некластеризованных индекса, как показано ниже

CREATE NONCLUSTERED INDEX [Provider0] 
ON [dbo].[provider] ([fedid] ASC, [provid] ASC, [entityid] ASC, [fullname] ASC, [status] ASC)

CREATE NONCLUSTERED INDEX [XIE3Provider] 
ON [dbo].[provider] ([fedid] ASC, [entityid] ASC, [provtype] ASC, [fullname] ASC, [provid] ASC, )

Запрос 1:

SELECT provid 
FROM provider 
WHERE FedId = '123'

Для запроса 1 SQL Server использует индекс XIE3Provider для операции поиска.

Запрос 2:

SELECT provid, status 
FROM provider 
WHERE FedId = '123'

Для запроса 2 SQL Server использует индекс Provider0 для операции поиска.

Не могли бы вы предоставить более подробную информацию о том, как SQL Server переключает выбор индекса для этого случая?

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Где возможно, SQL будет игнорировать таблицу и извлекать все соответствующие данные из индекса.Поскольку индекс меньше, чем таблица, и для чтения индекса потребуется меньше IO

Status, provid и FedId находятся в индексе Provider0, поэтому SQL использует этот индекс для уменьшения IO.

0 голосов
/ 21 мая 2018

Оптимизатор запросов SQL Server пытается использовать индекс покрытия :

Индекс покрытия - это индекс, который может удовлетворить все запрошенные столбцы в запросе, не выполняя дальнейший поиск в кластеризованном индексе.index.

Select provid, status from provider where FedId  = '123';

Фильтр: FedId

Выберите: provid, status.

Поэтому он решил использовать:

CREATE NONCLUSTERED INDEX [Provider0] ON [dbo].[provider]
(
    [fedid] ASC,
    [provid] ASC,
    [entityid] ASC,
    [fullname] ASC,
    [status] ASC
);

Вы можете использовать INCLUDE предложение :

CREATE NONCLUSTERED INDEX [Provider0] ON [dbo].[provider]
(
    [fedid] ASC,
    [provid] ASC,
    [entityid] ASC,
    [fullname] ASC,
) INCLUDE (status);

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

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