Является ли операция поиска по индексу более дорогой по сравнению со сканированием по индексу при большом объеме данных? - PullRequest
0 голосов
/ 14 июня 2019

Я понимаю, что сканирование таблицы просматривает каждую запись в таблице. И поиск таблицы смотрит на конкретные записи.

Кроме того, концепция индексного сканирования / поиска такая же, как и выше, с той разницей, что значения расположены в отсортированном порядке.

Вопрос : Является ли операция поиска по индексу более дорогой по сравнению со сканированием по индексу, когда объем данных искомого элемента высок? а почему?

Пример: допустим, что статистика устарела, а оценочные строки равны 100, но фактические строки равны 100000. Механизм решает использовать поиск по индексу. Будет ли это дороже, чем индексное сканирование и почему?

SELECT StockItemID 
FROM Examples.OrderLines 
WHERE StockItemID = 1; 

Я имею в виду книгу «Экзамен № 70-762 Разработка баз данных SQL», в которой есть этот пример, и на странице 338 он гласит: «Поскольку это значение (устаревшая статистика) относительно низкое, оптимизатор запросов сгенерировал план использование поиска по индексу, который может быть менее оптимальным, чем сканирование при больших объемах данных ". Я пытаюсь понять, почему поиск считается дорогим.

1 Ответ

2 голосов
/ 14 июня 2019

Вы никогда не увидите, чтобы SQL Server выбирал сканирование для этого запроса, если у вас есть индекс на StockItemID, так как он охватывает запрос, и нет проблемы "переломного момента".

Будет всегда выбирать запрос, даже если он оценивает, что 100% строк совпадают.

Пример

CREATE TABLE OrderLines
(
OrderID     INT IDENTITY PRIMARY KEY,
StockItemID INT INDEX IX1
);

INSERT INTO OrderLines
            (StockItemID)
SELECT 1
FROM   sys.all_objects

SELECT StockItemID
FROM   OrderLines
WHERE  StockItemID = 1; 

enter image description here

В случае, когда поиск возвращает все строки в таблице, единственное различие между поиском и упорядоченным просмотром по индексу заключается в том, как расположена первая строка (путем перемещения по глубине дерева B или простого перехода к первому индексу). страница из метаданных). Это, вероятно, будет незначительным.

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

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