Почему сканирование индекса вместо поиска при использовании оператора сравнения - PullRequest
0 голосов
/ 03 ноября 2018

В базе данных есть таблица Sales.SalesOrderDetail AdventureWorks2014.

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

--Query 1 uses index IX_SalesOrderDetail_ProductID
SELECT
sod.SalesOrderID
FROM Sales.SalesOrderDetail sod
WHERE sod.SalesOrderID = 1

и:

--Query 2 uses index PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID
SELECT
sod.SalesOrderID
FROM Sales.SalesOrderDetail sod
WHERE sod.SalesOrderID > 1

План запроса: enter image description here

План запроса на Brentozar.com можно посмотреть здесь.

И индексы:

CREATE NONCLUSTERED INDEX [IX_SalesOrderDetail_ProductID] ON [Sales]. 
[SalesOrderDetail]
(
    [ProductID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, 
    DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, 
    ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

и кластерный индекс выглядит так:

ALTER TABLE [Sales].[SalesOrderDetail] ADD  CONSTRAINT 
[PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID] PRIMARY KEY CLUSTERED 
(
    [SalesOrderID] ASC,
    [SalesOrderDetailID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, 
IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, 
    ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

Мой вопрос: почему оптимизатор запросов предпочитает другой индекс? PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID вместо IX_SalesOrderDetail_ProductID?

1 Ответ

0 голосов
/ 04 ноября 2018

Ну, я имею в виду, вы выбираете все строки (кроме, может быть, одной). Здесь действительно нет разницы между поиском и сканированием. SQL Server выбирает выполнение одного сканирования самого тонкого индекса вместо 80 000 запросов (или скольких заказов в таблице).

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

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