Я знаю, что это распространенный вопрос, и я прочитал несколько других сообщений и статей, но не смог найти тот, который учитывал индексированные поля и объем записей, которые оба запроса могли бы вернуть.Производительность вложенного выбора
Мой вопрос прост на самом деле. Какой из двух рекомендуется здесь, написанный в синтаксисе типа SQL (с точки зрения производительности).
Первый запрос:
Select *
from someTable s
where s.someTable_id in
(Select someTable_id
from otherTable o
where o.indexedField = 123)
Второй запрос:
Select *
from someTable
where someTable_id in
(Select someTable_id
from otherTable o
where o.someIndexedField = s.someIndexedField
and o.anotherIndexedField = 123)
Я понимаю, что второй запрос будет запрашивать базу данных для каждого кортежа, что внешний запрос будет возвращать где первый запрос будет оценивать сначала выберите внутренний, а затем примените фильтр к внешнему запросу.
Теперь второй запрос может запросить суперзадачу базы данных, учитывая, что поле someIndexedField индексировано, но говорят, что у нас есть тысячи или миллионы записей, не будет ли быстрее использовать первый запрос?
Примечание: в базе данных Oracle.
. , В общем, вопрос производительности без указания базы данных не имеет смысла. SQL - это описательный язык, а не процедурный язык, поэтому оптимизатор (часть движка) свободен в выборе любого плана запроса, который лучше всего подходит для данного запроса. –
@GordonLinoff Хорошая точка. База данных - это база данных Oracle. Язык не должен иметь значения, я полагаю, просто написал его в синтаксисе SQL. – mixkat
. , По словам Тома Ките, оптимизатор Oracle достаточно умен, чтобы распознать коррелированные подзапросы и может превратить их в соответствующие объединения (http://asktom.oracle.com/pls/apex/f?p=100:11:0::NO :: P11_QUESTION_ID: 3167884300346662300). У Oracle очень хороший оптимизатор. Что забавно, так это то, что первая версия имеет абсолютно потрясающую производительность в MySQL. , , до версии 5.6, которая исправила проблему. –