Performance
Oracle 9i ANSI 連接性能不佳的原因
請在標記為重複之前閱讀最後幾段。
在 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 連接語法與 ANSI 連接語法。
這個問題不是這個問題的重複,因為另一個問題是關於一個涉及超過 9 個表的非常複雜的查詢,唯一的答案指出除了語法用法(主要是表的順序)之外,查詢有很大不同。
在我的情況下,這是一個非常簡單的查詢,只是兩個關係之間的連接,沒有主要的差異並發症,包括表的順序。
- 這是 Oracle 9i 中的錯誤嗎?
- 造成如此巨大的性能差異的原因是什麼?
好吧,過了很久沒有答案。我做了一些測試。
我在 10g 和 11g 以及兩個版本中執行了相同的查詢,帶有 ANSI 連接的版本和帶有 WHERE 連接的版本在不到 1 秒的時間內執行。
由於問題僅存在於 9i 中,因此對 ANSI 的支持加入了相同的版本,我認為這是 9i 中的一個錯誤,可能或不可能在更新檔中解決。
正如我所提到的,很高興從 10 克開始,兩種口味的加入都表現良好。