Проверка индекса в запросе

#sql #indexing #sql-server-2014

#sql #индексирование #sql-server-2014

Вопрос:

У меня есть запрос, как показано ниже:

 ;With P As 
(Select CP.ProductID
From CatProduct CP
Join Product P On CP.ProductID = P.ProductID
Join ProductType pt with(nolock)     
On P.ItemType = pt.ProductTypeID    
And pt.IsOnline = 1 
Where 
CP.CategoryID = 1234
And p.Active = 1 And p.ActiveOnline = 1
And P.ApproveForOnline = 1 
)
Select P.ProductID,ISNULL(inv.QTYonHand, 0) 
From P
Join Inventory AS inv On inv.ProductID = P.ProductID and inv.WarehouseID = 1
  

Inventory таблица имеет ProductID WarehouseID в качестве своего первичного ключа.

WarehouseID значение может быть только 1 или 2 в таблице.

Общее количество записей с WarehouseID = 1 составляет около 240 тыс.

План запроса выполняет проверку индекса на ПК и использует только WarehouseID как предикат. В результате он обрабатывает все 240 тыс. записей.

Как я могу написать запрос так, чтобы оба WarehouseID и ProductID использовались в качестве предикатов, и чтобы из таблицы считывались и обрабатывались только эти 600 записей Inventory ?

Я подтвердил, что все статистические данные обновлены. —Добавление плана выполнения как из DEV, так и из PROD:

РАЗРАБОТЧИК: введите описание изображения здесь

Как вы можете видеть выше, только записи из CTE загружаются в таблицу инвентаризации. Это то, что я хочу, чтобы произошло в PROD .. но это не работает.

Пожалуйста, дайте мне знать, если мне нужно предоставить больше информации.введите описание изображения здесь

Заранее спасибо

Комментарии:

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

2. Привет, Митч, около 97% записей имеют значение WarehouseID = 1, остальные имеют значение 2. На самом деле я выбираю только столбцы ProductID и Qty. Меня беспокоит то, что мой CTE выдает только 600 записей, так почему таблица инвентаризации не работает только с этими 600 записями… Я также попытался создать другой индекс с помощью WarehouseID, ProductID INCLUDE (Кол-во). Он выполняет поиск по индексу, .. но все равно выдает 240 тыс. записей в качестве выходных данных

3. предлагаю вам опубликовать свой план

4. @a_horse_with_no_name: я использую Microsoft SQL Server версии 2014

5. Индекс в поле, содержащем только два значения, 97% из которых совпадают, редко может быть очень полезным, если у вас нет большого количества запросов для значения, содержащего только 3%. Вы уверены, что ProductID указан первым в этом индексе?