Использование сканирования индекса вместо поиска с поиском - PullRequest
0 голосов
/ 20 октября 2019

У меня есть таблица со следующей структурой:

CREATE TABLE Article 
(
    id UNIQUEIDENTIFIER PRIMARY KEY,
    title VARCHAR(60),
    content VARCHAR(2000),
    datePosted DATE,
    srcImg VARCHAR(255),
    location VARCHAR(255)
);

Затем я помещаю некластеризованный индекс в местоположение:

CREATE NONCLUSTERED INDEX Articles_location
ON Articles (location);

Выполнение запроса, подобного этому:

select a.content 
from Articles a 
where a.location = 'Japan, Tokyo';

приводит к: «Сканирование индекса (кластеризовано)»

Выполнение другого запроса, подобного следующему:

select a.location 
from Articles a 
where a.location = 'Japan, Tokyo';

, приводит к: «Поиск индекса (не кластеризованный)»

Итак, некластеризованный индекс работает. Почему он не выполняет поиск с поиском, когда я выполняю поиск по столбцам, а выполняет сканирование?

  • Общее количество строк в таблице составляет 200
  • Общее количествоПо этому запросу найдено 86 строк

1 Ответ

1 голос
/ 20 октября 2019

Похоже, оптимизатор запросов решает сканировать таблицу вместо того, чтобы использовать индекс, основанный на избирательности данных.

На самом деле может быть быстрее обратиться к таблице напрямую, чем искать по индексуи затем выполните KeyLookup. Это может быть не так, если в таблице больше строк (> 10 КБ). Здесь 86 из 200 - это более 40%.

select a.content from Articles a where a.location = 'Japan, Tokyo';
-- clustered index scan

select a.location from Articles a where a.location = 'Japan, Tokyo';
-- covering index

Сканирование и поиск

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

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