Oracle執行計畫不穩定

2022-09-13 03:33:11 字數 1311 閱讀 7102

前段時間,在專案中碰到乙個相當棘手的問題。我在寫一張報表時需要查詢客戶資料庫中已存在的檢視(是早期開發就有的),相對應的銷售表中已有上千萬條資料,寫完後台邏輯將對應資料查出來沒任何問題。但是在介面上再點選查詢按鈕。問題就來了:頁面直接卡死。

排除掉其他常見問題,例如語句效能,索引,快取等等。最後發現奇怪的現象,正常來講同樣的一條sql查詢語句,根據執行計畫,第一次查詢完以後,後續再執行相同的語句應該很快才對。可是,現實卻是第一次查詢不慢(優化後2秒內查詢),第二次以後就掛掉。困擾了好久不知道問題所在,也向相關群裡的大牛去諮詢也得不到結果。(資料庫為oracle11g,專案為.net ef開發模式。)

最後求助團隊老大,老大找來專業的dba終於找出原因。

其實,算是oracle11g的乙個bug。。。

11.2開始oracle有了一種新的特性cardinality feedback,cardinality feedback是乙個優化器自動優化的過程,優化器會自動修正重複執行的查詢的執行計畫。對於一些複雜的查詢,比如多欄位條件,字串範圍比較,資料skew等等,以及缺乏統計資訊,優化器可能不能夠產生乙個完全準確的基數估計, 如丟失或統計資料不準確,或複雜的謂詞的基數估計。cardinality feedback 就是基於這一原因而產生的。_optimizer_use_feedback引數預設是true,即開啟cardinality feedback,false為關閉cardinality feedback。由於在11gr2中cardinality feedback生效存在很多限制且bug較多,故沒必要啟用。

上段話是同事知道了原因後整理出來了的。 也就是說要關閉oracle的乙個引數,對於結構上不複雜的語句,其實是看不到什麼影響的。

alter system set "_optimizer_use_feedback"=false;

可以以一下方式驗證引數是否真正關閉。

結果:引數關閉後,同樣的語句,多次執行,已經不再會掛掉,跟資料庫上千萬的資料沒有多大關係,每次執行可以保證在兩秒左右。至此問題總算能解決。

穩定與不穩定

1 氣泡排序 氣泡排序就是把小的元素往前調或者把大的元素往後調。比較是相鄰的兩個元素比較,交換也發生在這兩個元素之間。所以,如果兩個元素相等,我想你是不會再無聊地把他們倆交換一下的 如果兩個相等的元素沒有相鄰,那麼即使通過前面的兩兩交換把兩個相鄰起來,這時候也不會交換,所以相同元素的前後順序並沒有改...

穩定與不穩定排序

首先,排序演算法的穩定性大家應該都知道,通俗地講就是能保證排序前2個相等的數其在序列的前後位置順序和排序後它們兩個的前後位置順序相同。在簡單形式化一下,如果ai aj,ai原來在位置前,排序後ai還是要在aj位置前。其次,說一下穩定性的好處。排序演算法如果是穩定的,那麼從乙個鍵上排序,然後再從另乙個...

網路不穩定 網路不穩定,天氣來背鍋

王者上星 深夜吃雞,那些影響你上分的因素,除了不靠譜的隊友外,你可曾知道 天氣也在偷偷影響你?不知道大家有沒有這樣一種感覺,一到下雨天,家裡wifi的網速就明顯變慢!是的,這不是你的錯覺。空氣濕度對wifi訊號有很大的影響,水分子對2.45g頻段電磁波的吸收加熱作用尤為明顯,而家用微波爐和wifi用...