В какой последовательности запросы и подзапросы выполняются механизмом SQL? - PullRequest
27 голосов
/ 15 февраля 2010

Здравствуйте, я сделал SQL-тест и сомневаюсь / задаюсь вопросом об одном вопросе:

В какой последовательности запросы и подзапросы выполняются механизмом SQL?

ответов было

  1. основной запрос -> подзапрос -> подзапрос и т. Д.
  2. подзапрос -> подзапрос -> простой запрос
  3. весь запрос интерпретируется за один раз
  4. Не существует фиксированной последовательности интерпретации, анализатор запросов принимает решение на лету

Я выбрал последний ответ (просто предположив, что он наиболее надежен по сравнению с другими). Теперь любопытство:

где я могу прочитать об этом и вкратце, каков механизм этого?

Спасибо.

Ответы [ 5 ]

25 голосов
/ 15 февраля 2010

Я думаю, что ответ 4 правильный. Есть несколько соображений:

тип подзапроса - коррелирован он или нет. Рассмотрим:

SELECT *
FROM   t1
WHERE  id IN (
             SELECT id
             FROM   t2
            )

Здесь подзапрос не связан с внешним запросом. Если число значений в t2.id мало по сравнению с t1.id, вероятно, наиболее эффективно сначала выполнить подзапрос и сохранить результат в памяти, а затем сканировать t1 или индекс на t1.id, сопоставляя его с кэшированные значения.

Но если запрос:

SELECT *
FROM   t1
WHERE  id IN (
             SELECT id
             FROM   t2
             WHERE  t2.type = t1.type
            )

здесь подзапрос коррелирован - нет способа вычислить подзапрос, если не известен t1.type. Поскольку значение для t1.type может варьироваться для каждой строки внешнего запроса, этот подзапрос может быть выполнен один раз для каждой строки внешнего запроса.

Опять же, СУБД может быть очень умной и понимать, что существует только несколько возможных значений для t2.type. В этом случае он все еще может использовать подход, используемый для некоррелированного подзапроса, если он может предположить, что стоимость выполнения подзапроса будет дешевле, чем выполнение его для каждой строки.

16 голосов
/ 15 февраля 2010

Вариант 4 близок.

SQL является декларативным : вы указываете оптимизатору запросов, что вам нужно, и он работает наилучшим образом (с учетом времени / затрат и т. Д.). Это может варьироваться для внешне идентичных запросов и таблиц в зависимости от статистики, распределения данных, количества строк, параллелизма и, что Бог знает, что еще.

Это означает, что нет фиксированного заказа. Но это не совсем "на лету"

Даже с одинаковыми серверами, схемами, запросами и данными, которые я видел, планы выполнения отличаются

1 голос
/ 15 февраля 2010

Если вы хотите что-то прочитать по этим темам, получите копию Inside SQL Server 2008: T-SQL Querying. В нем есть две отдельные главы о том, как запросы обрабатываются логически и физически в SQL Server.

1 голос
/ 15 февраля 2010

Механизм SQL пытается оптимизировать порядок выполнения (под) запросов. Часть, решающая об этом, называется оптимизатором запросов. Оптимизатор запросов знает, сколько строк в каждой таблице, какие таблицы имеют индексы и по каким полям. Он использует эту информацию, чтобы решить, какую часть выполнить первым.

0 голосов
/ 15 февраля 2010

Обычно это зависит от вашей СУБД, но ... я думаю, что второй ответ более правдоподобен. Основной запрос обычно не может быть рассчитан без результатов подзапроса.

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