Пожалуйста, перед тем как отмечать дубликаты, прочитайте последние абзацы.Причина плохой производительности соединений ANSI в Oracle 9i
В базе данных Oracle 9i этот запрос выполняется в 0,18 секунды:
select
count(*)
from
dba_synonyms s,dba_objects t
where
s.TABLE_OWNER = t.OWNER(+) and
s.TABLE_NAME = t.OBJECT_NAME(+) and
s.DB_LINK is null and
t.OWNER is null;
... но это один работает в ужасном 120 секунд:
select
count(*)
from
dba_synonyms s left join dba_objects t
on (s.TABLE_OWNER = t.OWNER and s.TABLE_NAME = t.OBJECT_NAME)
where
s.DB_LINK is null and
t.OWNER is null;
Примечание единственная разница заключается в использовании проприетарного синтаксиса Oracle join против синтаксиса ANSI join.
Эти вопросы не является дубликатом из this one, потому что другой вопрос об очень сложном запросе с участием более чем 9 таблиц, и единственный ответ указывает на то, что запросы сильно отличаются, помимо использования синтаксиса (в основном порядок таблиц).
В моем случае это чрезвычайно простой запрос, простое соединение между двумя отношениями без каких-либо мэровских осложнений различий, включая порядок таблиц.
- Является ли это ошибкой в Oracle 9i?
- В чем причина такой драматической разницы в производительности?
UPDATE:
Это планы выполнения, уведомление о том, что объяснить план запроса одного не показывает кардинальности, стоимость или байты информации:
Быстрый, старый стиль Соединения: Slow, ANSI join:
Поскольку Oracle 9i больше не поддерживается, очень сложно определить, что вызывает проблемы с производительностью. Вы пытались сравнить их планы объяснений? – Sentinel
@Sentinel Планы исполнения сильно отличаются, но их не должно быть, поскольку в обоих запросах я просто делаю простое соединение. Никакой порядок таблиц не меняется, никакая функция не применяется ни к одному столбцу, никаких новых условий в предложении WHERE не было, выбранные столбцы одинаковы и т. Д.Я полагаю, что Ora9i просто разбирает версию ANSI безумным способом, что приводит к планам выполнения, который не только отличается от того, который используется для старомодного запроса, но и очень неэффективен. –
@Sentinel Я добавил планы объяснения каждого запроса на вопрос, пожалуйста, взгляните на них. Может быть, вы можете объяснить мне, почему вторая такая медленная и, самое главное, почему Ora9i выбрал такой плохой план выполнения над другим. –