Подтвердить что ты не робот

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

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

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

ответы были

  • первичный запрос → вспомогательный запрос → вспомогательный запрос и т.д.
  • sub sub query → sub query → prime query
  • весь запрос интерпретируется за один раз
  • Нет фиксированной последовательности интерпретации, парсер запросов принимает решение на лету

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

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

Спасибо.

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Я думаю, что ответ 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 может меняться для каждой строки внешнего запроса, этот подзапрос может быть выполнен один раз для каждой строки внешнего запроса.

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

Ответ 3

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

Ответ 4

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

Ответ 5

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