Как отфильтровать строки с предложением WHERE перед JOIN? - PullRequest
0 голосов
/ 06 июля 2019

У меня есть 2 таблицы, как показано ниже:

Заказ

Id, Name

Продукт

Id, OrderId, ...

Я хочуотфильтровать все товары по определенному названию заказа.Мой запрос T-SQL:

SELECT o.Id, o.Name, p.Id
FROM Order o
INNER JOIN Product p ON o.Id = p.OrderId
WHERE o.Name = "TEST"

В моей таблице продуктов может быть тысяча строк, поэтому я считаю, что этот SQL сначала объединяет все заказы со всеми продуктами, а затем ко всему объединенному результирующему набору применяется условие WHEREвыберите только те, которые имеют имя TEST.

Будет гораздо лучше, если SQL сначала отфильтрует таблицу Order по имени "TEST", а затем выполнит объединение только этих заказов вместо всей таблицы.

Итак, вопрос в том, как выполнить WHERE до JOIN?

Ответы [ 2 ]

3 голосов
/ 06 июля 2019

Вы не можете указать , как SQL выполняет запрос, за исключением использования подсказок оптимизатора. Стандартный запрос SQL указывает только результаты, а не план выполнения. Как правило, вы в зависимости от оптимизатора выбираете лучший план выполнения.

Для этого запроса:

SELECT o.Id, o.Name, p.Id
FROM Orders o INNER JOIN
     Product p
     ON o.Id = p.OrderId
WHERE o.Name = 'TEST'

Для производительности вам нужен индекс для Orders(Name, Id) и Product(Orderid, p.Id). Это дает оптимизатору инструменты, необходимые для поиска наилучшего плана выполнения.

Это покрывающие индексы для запроса, означающие, что все индексы находятся в индексе, поэтому страницы данных не нужно извлекать. План выполнения должен искать соответствующие заказы на основе Name и затем выбирать соответствующие строки продукта.

0 голосов
/ 06 июля 2019

Замените оператор where другим условием в части Join

что-то вроде этого

SELECT o.Id, o.Name, p.Id
FROM Order o
INNER JOIN Product p ON o.Id = p.OrderId
AND o.Name = 'TEST'

OR

SELECT o.Id, o.Name, p.Id
FROM (SELECT x.Id, x.Name Order x WHERE x.Name = 'Test') o
INNER JOIN Product p ON o.Id = p.OrderId
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...