2015-10-08 2 views
1

Пожалуйста, перед тем как отмечать дубликаты, прочитайте последние абзацы.Причина плохой производительности соединений 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:

Это планы выполнения, уведомление о том, что объяснить план запроса одного не показывает кардинальности, стоимость или байты информации:

Быстрый, старый стиль Соединения: enter image description here Slow, ANSI join: enter image description here

+0

Поскольку Oracle 9i больше не поддерживается, очень сложно определить, что вызывает проблемы с производительностью. Вы пытались сравнить их планы объяснений? – Sentinel

+0

@Sentinel Планы исполнения сильно отличаются, но их не должно быть, поскольку в обоих запросах я просто делаю простое соединение. Никакой порядок таблиц не меняется, никакая функция не применяется ни к одному столбцу, никаких новых условий в предложении WHERE не было, выбранные столбцы одинаковы и т. Д.Я полагаю, что Ora9i просто разбирает версию ANSI безумным способом, что приводит к планам выполнения, который не только отличается от того, который используется для старомодного запроса, но и очень неэффективен. –

+0

@Sentinel Я добавил планы объяснения каждого запроса на вопрос, пожалуйста, взгляните на них. Может быть, вы можете объяснить мне, почему вторая такая медленная и, самое главное, почему Ora9i выбрал такой плохой план выполнения над другим. –

ответ

1

Ну, после долгого времени без ответов. Я провел некоторое тестирование.

Я выполнил тот же запрос в 10g и 11g, и обе версии, с ANSI-соединениями, и те, с которыми соединяются WHERE, работают менее чем за 1 секунду.

Поскольку проблемы существуют только в 9i, в той же версии поддерживается объединение ANSI, где введено , это ошибка в 9i, которая могла или не могла быть решена в патче.

С радостью, как я уже говорил, начиная с 10-го года оба вкуса соединений хорошо работают.