SQL Оптимизация производительности заказа по столбцу Server Index для - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть этот запрос:

select top 500 * from clicks 
where domainid = 'AC8BBCA4-1CC4-456E-9A85-E7A5C0D7E981' 
order by clickedOn

Интересно, какой индекс будет работать лучше?

CREATE NONCLUSTERED INDEX [IX_p2p] ON [dbo].[clicks]
(
    [domainId],
    [clickedOn] ASC
)

Или это?

CREATE NONCLUSTERED INDEX [IX_p2p] ON [dbo].[clicks]
(
    [clickedOn] ASC,
    [domainId]
)

1 Ответ

2 голосов
/ 04 апреля 2020

Первый индекс явно лучше второго для этого запроса.

В первом случае он может искать точное значение domainid и затем читать первые 500 строк, которые уже находятся в * 1004. * упорядочить, а затем остановить (плюс 500 поисков, чтобы получить значения других столбцов, если в таблице больше двух показанных столбцов).

Второй индекс может быть полезен для запроса, но только в очень ограниченных случаях. Это устраняет необходимость сортировки по clickedOn, но требует сканирования индекса по порядку и остановки после обнаружения первых 500 строк, соответствующих domainId. Если вам очень повезло, то первые 500 строк в порядке clickedOn также соответствуют предикату domainId, поэтому он должен прочитать только 500 строк. Но скорее всего, это не так. В худшем случае нет даже 500 совпадающих строк, и нужно прочитать весь индекс. Для получения значений других столбцов также необходимо выполнить 500 поисков.

Если таблица относительно мала, то нельзя использовать ни один из индексов, поскольку SQL Сервер может принять решение о сканировании индекса покрытия, и сортировка дешевле, чем 500 просмотров.

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