Анализ производительности на SQL Query - PullRequest
0 голосов
/ 03 января 2012

Что будет лучше?

Ouery 1:

select (select a from innertable I where i.val=o.val)
       , val1, val2 
from outertable o

Запрос 2:

select i.a
       ,o.val1
       ,o.val2 
from outertable o 
     join innertable i on i.val=o.val

Почему?Пожалуйста, сообщите.

1 Ответ

4 голосов
/ 03 января 2012

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

Как правило, два отправленных вами запроса будут давать разные результаты.Если вам не гарантировано, что каждая строка в outertable имеет ровно одну соответствующую строку в innertable, два запроса вернут разное количество строк.Первый запрос вернет строку для каждой строки в outertable с NULL в качестве первого столбца, если в innertable нет соответствующей строки.Второй запрос ничего не даст, если в innertable нет подходящей строки.Аналогично, если в innertable имеется несколько совпадающих строк для какой-либо конкретной строки в outertable, первый запрос вернет ошибку, а второй запрос вернет несколько строк для этой строки в outertable.

Если вы уверены, что два запроса возвращают идентичные наборы результатов в вашем конкретном случае, потому что вы можете гарантировать, что в innertable есть ровно одна строка для каждой строки в outertable (в этом случае ваши данные как минимум несколько страннымодель разделяет таблицы), второй вариант будет гораздо более естественным способом написания запроса и, следовательно, тот, для которого оптимизатор, скорее всего, найдет более эффективный план.

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