Почему нет никакой разницы между областью фильтра для этих вложенных подзапросов?

Учитывая два приведенных ниже подзапроса, сегодня мне сказали, что запрос (1) будет неэффективным, поскольку он извлечет все данные из представления, прежде чем отфильтровать их как место предложение находится вне вложенного запроса.

(1) из ORM (где снаружи)

select * from (select * from VW_LOURD) as q  where q.Expr5 = 'SYNC_FLAG'

(2) от самого себя (где внутри)

select * from (select * from VW_LOURD where Expr5 = 'SYNC_FLAG') as q 

Я переписал запрос, как показано на (2), чтобы иметь фильтр внутри подзапроса. Я не нашел каких-либо заметных различий в производительности. Чтобы быть уверенным, я сравнил оба плана выполнения, и они полностью одинаковы.

Я пришел к выводу, что оба запроса будут извлекать одинаковое количество данных и одинаково, независимо от того, находится ли фильтр внутри или снаружи подзапроса, однако я не уверен, что мой вывод верен на 100%, также я не уверен в состоянии объяснить, почему оба запроса похожи.


person Leo M    schedule 20.05.2020    source источник


Ответы (1)


Оба запроса функционально идентичны, а это означает, что они всегда будут давать одинаковые результаты.

Я понимаю, что вы намерены применить фильтр к подзапросу для повышения эффективности. Ваша база данных в любом случае знает лучше - на самом деле, она, скорее всего, переписывает оба запроса как:

select * from vw_lourd where expr5 = 'SYNC_FLAG'

... каковы они на самом деле, на самом деле. Как следствие, оба плана выполнения идентичны.

person GMB    schedule 20.05.2020