2013-09-26 115 views
1

我對Oracle在性能調優中看到的一些常見問題有疑問。我有一個查詢,我正在測試。對於我來說,提供一個簡單的例子太複雜了,對不起! (我試圖降低它,但失去了症狀)Oracle查詢第二次更慢

我第一次運行查詢,它是2秒。隨後的時間是3,4,甚至5秒。這種情況持續發生 - 如果我改變間距,我再次得到2秒,然後它恢復。

這與我所期望的相反 - 在第一次之後,數據庫不需要解析查詢,塊應該讀入緩衝區緩存。我能想到的唯一的事情就是它在某處寫入臨時數據,以這樣的方式寫和讀它比讀它更快。但這當然沒有意義。

有誰知道爲什麼會發生這種情況?或者執行計劃中的任何紅旗會導致類似的情況?

僅供參考,這是一個SELECT,包含多個連接,聚合和視圖。沒有內部的PL/SQL。

謝謝

+0

這與我所期望的相反。解釋計劃輸出是否從運行到運行改變? – Twelfth

+0

我不認爲你應該[crossposting](http://dba.stackexchange.com/questions/50594/oracle-query-is-slower-the-second-time)這個... – mustaccio

+0

@mustaccio - 對不起,我認爲這適合於數據庫論壇,但後來我看到Stackoverflow中有多少個問題與我的標籤相匹配,並認爲我會在這裏獲得更好的運氣。此外,你是唯一一個回答你的人可能會從中得到分數! – orbfish

回答

1

查詢可能會產生由於cardinality feedback後第一次運行不同的執行計劃。在12c中,此功能更名爲statistics feedback

優化程序使用有關第一次運行的實際和預期行數的信息,並使用該信息來改進第二個執行計劃。根據我的經驗,這通常是一個很好的功能。但是所有優化器功能偶爾會適得其反。

至少有兩種方式可以判斷是否使用了基數反饋。將有在解釋計劃的說明:

Note 
----- 
    - cardinality feedback used for this statement 

而且該語句將在此查詢顯示:

select * from v$sql_shared_cursor where use_feedback_stats = 'Y'; 

您可能要同時檢查。當我嘗試創建一個示例時,查詢有use_feedback_stats = 'Y',但在解釋計劃中沒有註釋。

+0

這看起來很可能。我會看一看。 – orbfish

+0

我從來沒有能夠重現/測試,但你的答案聽起來不錯 - 謝謝! – orbfish