Стол соединения против подзапроса соединения - что является более эффективным? - PullRequest
0 голосов
/ 28 января 2020

Недавно я просматривал большой код SQL, в котором разделы Соединения были заполнены сложными подзапросами, и начал интересоваться, есть ли какая-либо польза от присоединения подзапроса с ограниченным выбором столбцов по сравнению с объединением всей таблицы и выбором только необходимых столбцов.

Чтобы проиллюстрировать это:

Допустим, у нас есть 2 таблицы: Table1, Table2 каждая со столбцами (PK, FK, a, b ,c, d, e, f). Я хочу присоединиться к Таблице 1 с Таблицей 2, но получить только несколько полей из Таблицы 2.

Что является более эффективным, каковы преимущества каждого из них?

SELECT 
  Table1.*,
  Table2.a,
  Table2.b

FROM Table1
LEFT JOIN Table2 ON Table1.PK = Table2.FK

ИЛИ

SELECT
  Table1.*,
  Table2sub.*

FROM Table1
LEFT JOIN (SELECT FK, a, b FROM Table2) AS Table2sub ON Table1.PK = Table2sub.FK

1 Ответ

3 голосов
/ 28 января 2020

SQL является описательным языком, а не процедурным языком. То есть запрос SQL описывает, как выглядит результирующий набор, а не как результат.

Фактически то, что работает двигатель, называется направленным ациклом c график (DAG) - и это не похоже на запрос. Движок SQL сначала анализирует запрос, затем компилирует его, а затем оптимизирует для получения DAG.

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

Если вы посмотрите на планы выполнения, то увидите, что в этом случае они одинаковы.

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