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