SQL присоединение и фильтрация - PullRequest
0 голосов
/ 10 июля 2020

Дают ли эти два решения одинаковый результат?

SELECT *
FROM Orders
LEFT JOIN OrderLines ON OrderLines.OrderID=Orders.ID 
    AND Orders.ID = 12345
select orderID
into #temp
from OrderLines
where orderID=12345

SELECT *
    FROM Orders
    LEFT JOIN #temp t ON t.OrderID=Orders.ID 
        

Я хотел бы использовать временные таблицы для производительности

Ответы [ 2 ]

1 голос
/ 10 июля 2020
SELECT *
FROM Orders
LEFT JOIN OrderLines ON OrderLines.OrderID=Orders.ID 
    AND Orders.ID = 12345

Этот запрос даст вам

  • Все записи из таблицы Orders
  • Соответствующие записи из таблицы OrderLines только для заказов с ID = 12345 для для всех остальных заказов вы найдете OrderLines Null.

-

select orderID
into #temp
from OrderLines
where orderID=12345

SELECT *
    FROM Orders
    LEFT JOIN #temp t ON t.OrderID=Orders.ID

Рассмотрим ваш первый запрос, в котором вы выбираете только те записи из OrderLines, где OrderId = 12345 и затем соедините его с таблицей Orders. таким образом, вывод вашего запроса будет

  • Все записи из Orders таблицы
  • Для OrderID 12345 будут доступны OrderLines, а для всех остальных Orderlines будет нулевым

Итак, да, Оба запроса дадут вам одинаковый результат .

0 голосов
/ 10 июля 2020

Я хотел бы использовать временные таблицы для повышения производительности

Моя основная c реакция: перебороть это. Временные таблицы могут быть полезны в некоторых случаях, особенно когда сценарий выполняет несколько запросов и должен совместно использовать определенный подзапрос. Однако они несут накладные расходы на создание таблицы, загрузку в нее данных и последующее ее чтение. Это может привести к большим накладным расходам.

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

Иногда оптимизатор не идеален. Большинство баз данных поддерживают использование подсказок для создания более подходящего плана запроса. При некоторых обстоятельствах вы можете обнаружить, что создание временной таблицы с соответствующими индексами дает лучший план запроса.

В большинстве случаев ваш первый запрос будет быстрее, чем ваш второй. Если это не так, вероятно, статистика по OrderLines устарела.

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