Влияет ли структура запроса SQL на его производительность? - PullRequest
0 голосов
/ 09 мая 2020

Мой вопрос теоретический. Произнесите следующий запрос (вариант A):

Select *
from orders o
  inner join (
     select *
     from orderDetails 
     where product = 'shirt'
              ) od    on o.orderId = od.orderId

По сравнению со следующим (вариант B)

Select *
from orders o
  inner join orderDetails  od    on o.orderId = od.orderId
where od.product = 'shirt'

Есть ли какое-либо техническое преимущество одного перед другим? Например, у меня сложилось впечатление, что вариант A требует меньше ресурсов для БД, поскольку внутреннее соединение происходит на уже суженном количестве строк. Принимая во внимание, что вариант B дает тот же результат, однако он, кажется, выполняет внутреннее соединение для всех доступных orderId, прежде чем сузить его до рубашек.

Мне интересно узнать о конечном ударе b c, иногда хранимые процедуры становятся довольно большими, и я хотел бы убедиться, что они не влияют на время загрузки отчета без нужды.

1 Ответ

3 голосов
/ 09 мая 2020

Два запроса должны соответствовать одному и тому же плану выполнения на SQL сервере - одинаковая производительность. Это не зависит от индексов.

Почему? SQL - это описательный язык. Запрос SELECT описывает набор результатов. Он не указывает, как создается набор результатов. В большинстве баз данных работа по выяснению того, что делать, выполняется компилятором и оптимизатором SQL, которые создают ориентированный ациклический c граф операций (DAG) (некоторые базы данных также выполняют оптимизацию во время выполнения). Для новичка операции в DAG совсем не похожи на исходные SELECT.

Не все базы данных имеют такие умные оптимизаторы, как SQL Server. Например, есть разница в MySQL - особенно в старых версиях. MySQL имеет тенденцию к материализации подзапросов, что обычно отрицательно сказывается на производительности. Однако это связано с плохой стратегией оптимизации, а не с SQL в целом.

...