#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 указан первым в этом индексе?