Оцениваются ли аргументы таблицы подзапросов LEFT JOIN более одного раза? - PullRequest
2 голосов
/ 12 мая 2009

У меня есть запрос, который выглядит так:

SELECT  *
FROM    employees e
LEFT JOIN
        (
        SELECT  *
        FROM    timereports
        WHERE   date = '2009-05-04'
        ) t
ON      e.id = t.employee_id

Как видите, мой LEFT JOIN второй параметр таблицы генерируется подзапросом.

БД оценивает этот подзапрос только один раз или несколько раз?

спасибо. Матти

Ответы [ 4 ]

2 голосов
/ 12 мая 2009

Это зависит от RDBMS.

В большинстве из них будет использоваться HASH OUTER JOIN, и в этом случае подзапрос будет оцениваться один раз.

MySQL, с другой стороны, не способен сделать HASH JOIN, поэтому он, скорее всего, будет выдвигать предикат в подзапрос и выдаст этот запрос:

SELECT  *
FROM    timereports t
WHERE   t.employee_id = e.id
        AND date = '2009-05-04'

во вложенном цикле. Если у вас есть индекс на timereports (employee_id, date), это также будет эффективно.

0 голосов
/ 12 мая 2009

Что вы подразумеваете под оценкой?

В базе данных есть несколько вариантов выполнения объединения, два наиболее распространенных из которых

  • Вложенные циклы, в этом случае каждая строка в одной таблице будет проходить циклически, и будет выполняться поиск соответствующей строки в другой таблице, и
  • Хеш-соединение, что означает, что обе таблицы будут отсканированы один раз, а затем результаты объединены с использованием некоторого хеш-алгоритма.

Какой из этих двух вариантов будет выбран, зависит от базы данных, размера таблицы и доступных индексов (и, возможно, других вещей).

0 голосов
/ 12 мая 2009

Вы должны попросить базу данных показать план. Алгоритм для этого выбирается динамически (во время запроса) на основе многих факторов. Некоторые базы данных используют статистику распределения ключей, чтобы решить, какой алгоритм использовать. Другие базы данных имеют относительно фиксированные правила.

Далее, каждая база данных имеет меню различных алгоритмов. База данных может использовать алгоритм сортировки-слияния или вложенные циклы. В этом случае может существовать стратегия выравнивания запросов.

Вам нужно использовать уникальную функцию «Объяснить план» вашей базы данных, чтобы посмотреть план выполнения запроса.

Вам также необходимо знать, использует ли ваша база данных подсказки (обычно комментарии, встроенные в SQL) для выбора алгоритма.

Вам также необходимо знать, использует ли ваша база данных статистику (иногда называемую «оптимизатором запросов на основе затрат») для выбора алгоритма.

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

0 голосов
/ 12 мая 2009

Если вы используете SQL Server, вы можете взглянуть на План выполнения запроса. Оптимизатор запросов SQL Server оптимизирует запрос так, чтобы он занимал наименьшее время при выполнении. Лучшее время будет основано на некоторых условиях, а именно. индексация и тому подобное.

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