Performance

Oracle 9i ANSI 連接性能不佳的原因

  • August 11, 2016

請在標記為重複之前閱讀最後幾段。

在 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 克開始,兩種口味的加入都表現良好。

引用自:https://dba.stackexchange.com/questions/117300