2012-10-01 59 views
3

我對Oracle 10數據庫中看到的某些東西感到困惑。將'distinct'關鍵字添加到oracle查詢中無故刪除查詢性能

我有以下查詢。

select 
t2.duplicate_num 
from table1 t1, table2 t2, 

( 
    select joincriteria_0 from intable1 it1, intable2 it2 
    where it2.identifier in (4496486,5911382) 
    and it1.joincriteria_0 = it2.joincriteria_0 
    and it1.filter_0 = 1 
) tt 

where t1.joincriteria_0 = tt.joincriteria_0 
and t2.joincriteria_1 = t1.joincriteria_1 
and t2.filter_0 = 3 
and t2.filter_1 = 1 
and t2.filter_2 not in (48020) 

它並沒有真正似乎什麼特別的東西給我,這裏是從自動跟蹤基準性能數字:

CR_GETS:318

CPU:3

行數:33173

現在,如果我將'DISTINCT'關鍵字添加到查詢中(例如'select distinct t2.duplicate_num ...'),會發生這種情況

CR_GETS:152921

CPU:205

行數:305

查詢計劃並沒有改變,但是邏輯IO增長由我所期待的CPU只走了500。因素和邏輯IO大致不變。

最終結果是使用distinct關鍵字運行速度慢10-100倍的查詢。我可以將代碼放入應用程序中,這樣可以在一小部分時間內使結果集不同。這有什麼意義?特別是沒有查詢計劃改變?

+1

好讀 - http://oracle-randolf.blogspot.com/2011/01/hash-aggregation.html –

+0

你有什麼指標? –

+0

有趣的鏈接rs - 我已閱讀它,它看起來肯定可以適用於我的查詢。我正在運行10.2.0.5,似乎有時會影響HASH(UNIQUE)調用。我嘗試添加一些提示,但他們沒有效果,但我當然不會將其視爲可能性。 –

回答

0

這表示缺少索引。這也意味着,沒有獨立子句的原始查詢未優化。 「明顯」也不能優化,所以查詢計劃保持不變。由於全表掃描,未優化的查詢在性能上差別很大。

+0

如果這是一個生產場景,我會創建內部子查詢作爲視圖,並從它開始並加入其他兩個表。 –

+0

如果這是一個索引問題,我不會看到查詢計劃中的對象訪問方法更改嗎?查詢計劃在普通和「獨特」關鍵字版本之間是相同的,唯一的區別是頂級HASH(唯一)。但是,在後一種情況下,自動跟蹤中的每一步在邏輯IO中都要高出10-500倍。爲了解決你的問題,儘管我有所有的索引範圍掃描和索引獨特的掃描訪問方法。沒有完全訪問。 –