Как Oracle справится с условием предложения where по сравнению с подзапросом с постоянным результатом? - PullRequest
2 голосов
/ 15 декабря 2010

Допустим, у меня есть следующее:

select primary_id
from myschema.table_a
where row_changed_date > ( select last_refreshed
                           from myschema.last_refresh lr
                           where asset_type = 0 );

Результат подзапроса не изменится между активами. Технически я хочу сравнивать напрямую с постоянным значением, но я не хочу запускать отдельный запрос для получения этой константы. Будет ли Oracle запускать подзапрос для каждого прохождения итерации? Есть ли лучший способ сделать это?

Ответы [ 2 ]

3 голосов
/ 15 декабря 2010

Необходимо убедиться, что ваш подзапрос возвращает одну строку, или используйте квалифицированное сравнение:

WHERE row_changed_date > ALL ( SELECT last_refreshed ... )

Или:

WHERE row_changed_date > (SELECT MAX(last_refreshed) ...)

Предполагая, что asset_type является столбцом вlast_refresh таблица, тогда Oracle будет вычислять подзапрос один раз.Если это действительно столбец в таблице table_a, то у вас есть коррелированный подзапрос;это должно быть оценено для каждой строки.

Этот ответ фактически не зависит от СУБД - правила применяются как к Oracle, так и к другим СУБД SQL.

1 голос
/ 15 декабря 2010

В вашем примере с использованием подзапроса - нет, Oracle не будет запускать подзапрос для каждой строки.Однако коррелированный подзапрос мог бы.

Использовать:

SELECT a.primary_id
  FROM MYSCHEMA.TABLE_A a 
  JOIN MYSCHEMA.LAST_REFRESH lr ON lr.last_refreshed < a.row_changed_date
                               AND lr.asset_type = 0

Альтернативная версия с использованием WHERE:

SELECT a.primary_id
  FROM MYSCHEMA.TABLE_A a 
  JOIN MYSCHEMA.LAST_REFRESH lr ON lr.last_refreshed < a.row_changed_date
 WHERE lr.asset_type = 0

Из-за использования INNER JOIN нет различий в результатахили производительность между любой из этих версий запроса.Это не будет иметь место, если вы используете OUTER JOINS (LEFT, RIGHT).

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