一個比較經(jīng)典的案例粤咪,隱式類型轉(zhuǎn)換發(fā)生在字段上叹放,會造成索引無法使用的嚴重性能問題; 隱式類型轉(zhuǎn)換發(fā)生在綁定變量上斋日,會造成acs失效的情況牲览,造成的影響比較隱蔽。
https://mp.weixin.qq.com/s/l4-Ni8opRS4DB8i6qEEfpA
數(shù)據(jù)庫突發(fā)性能問題恶守,有時可能通過重啟應用第献、重新收集統(tǒng)計信息贡必、重啟數(shù)據(jù)庫等方法得到臨時解決。
為什么要找到根因:為了避免故障再次發(fā)生庸毫,為了找到問題的責任方:運維仔拟、開發(fā)還是數(shù)據(jù)庫產(chǎn)品自身原因(缺陷或是bug),讓背鍋的一方心服口服飒赃。
很多對業(yè)務穩(wěn)定性要求非常高的行業(yè)(比如金融利花、通信、鐵路载佳、航空等)的數(shù)據(jù)庫系統(tǒng)炒事,都會購買oracle 售后高服(ACS)中的頂級服務SSC服務。
問題描述
一個時段蔫慧,重要業(yè)務的SQL執(zhí)行計劃發(fā)生改變挠乳,執(zhí)行效率嚴重下降。執(zhí)行cost變小了姑躲,效率下降了幾千倍欲侮。
根因分析
謂詞越界
1、該時段是系統(tǒng)對需要收集統(tǒng)計信息的表肋联,收集統(tǒng)計信息威蕉。
2、收集后的一段時間內(nèi)橄仍,會對該表的相關(guān)sql做硬解析韧涨。
3、硬解析時侮繁,會發(fā)生綁定變量窺視虑粥。如果窺視到的綁定變量,超出了字段上統(tǒng)計信息的最大最邢芰ā(一般是最大)值范圍娩贷,就可能發(fā)生謂詞越界。謂詞越界就可能會出現(xiàn)索引選擇錯誤锁孟,導致生成低效執(zhí)行計劃彬祖。
4、真正的謂詞越界一般發(fā)生在varchar2和number字段品抽,日期字段雖然經(jīng)常發(fā)生越界储笑,但是系統(tǒng)對于日期類型字段的越界算法,有一定的容忍度圆恤,不會認為是真正的越界突倍。這個sql發(fā)生越界的字段保存的數(shù)據(jù)是日期數(shù)據(jù),但是使用的卻是number類型。這里面涉及到一個重要的開發(fā)規(guī)范相關(guān)內(nèi)容:非常不建議用number或varchar2類型保存日期數(shù)據(jù)羽历,規(guī)范做法是使用date類型焊虏。因為按天查詢時,date類型一般需要寫兩段范圍條件秕磷,而number或varchar2類型诵闭,可以用一個等值條件即可完成,而且不用做to_date轉(zhuǎn)換跳夭。這種偷懶的不規(guī)范做法涂圆,會給SQL性能帶來較大的性能隱患。
5币叹、發(fā)生謂詞越界后润歉,數(shù)據(jù)庫優(yōu)化器在評估這個sql可以使用的兩個索引(都是以越界字段開頭的組合索引)時,就不是常規(guī)的選擇方式颈抚,而是選擇leaf blocks較少的那一個踩衩,這個案例,leaf blocks較少的那個索引贩汉,恰好是低效的那一個驱富。
6、sqlhc捕獲到了sql后面的一些執(zhí)行情況匹舞,很多使用的綁定變量已經(jīng)不再越界褐鸥,而且系統(tǒng)的自適應游標(ACS)保持開啟狀態(tài),為什么ACS沒能及時把執(zhí)行計劃調(diào)整回正常赐稽? 這里面又涉及到另一個不規(guī)范的情況:綁定變量使用的數(shù)據(jù)類型是char叫榕,剛剛我們提到字段使用的類型是number,優(yōu)化器需要對綁定變量做to_number隱式類型轉(zhuǎn)換姊舵,這種轉(zhuǎn)換導致了ACS不生效晰绎。
7、不贊成關(guān)閉ACS括丁,這個案例荞下,雖然ACS因為綁定變量類型不匹配沒有生效,但是如果綁定變量使用的數(shù)據(jù)類型也是number史飞,那么ACS就會生效尖昏,不會出現(xiàn)執(zhí)行計劃一錯到底的情況:對于后面謂詞不越界的情況,ACS還能及時調(diào)整回正常的執(zhí)行計劃祸憋。ACS在11g版本引入会宪,開始時bug較多,到了11204版本蚯窥,很多bug已經(jīng)修復了,它起到的作用遠遠高于bug帶來的一些小問題。
知識點
SQL語句的查詢條件超出了數(shù)據(jù)庫統(tǒng)計信息所記錄的范圍拦赠。謂詞越界會導致Oracle優(yōu)化器錯誤的選擇SQL語句的執(zhí)行計劃巍沙,導致性能問題。
謂詞越界一般會發(fā)生在什么場景下荷鼠?
- 臨時表
這里指的是業(yè)務上的臨時表而不是Oracle數(shù)據(jù)庫本身的temporary table句携。在某些系統(tǒng)中會根據(jù)業(yè)務條件創(chuàng)建前臺表和后臺表,數(shù)據(jù)先進入前臺表允乐,處理完畢后矮嫉,存入后臺表,并用delete語句清理前臺表的數(shù)據(jù)牍疏,前臺表起到一個臨時表的作用蠢笋。我們知道,Oracle自動收集統(tǒng)計信息的默認時間窗口是工作日晚上的22點到凌晨2點鳞陨,或者周末的早上6點到第二天凌晨2點昨寞。在自動收集統(tǒng)計信息窗口內(nèi),數(shù)據(jù)庫前臺表基本上處于無數(shù)據(jù)厦滤,或者數(shù)據(jù)量很小的情況援岩,那么產(chǎn)生的統(tǒng)計信息就會和白天實際處理業(yè)務數(shù)據(jù)時有偏差,就有可能發(fā)生謂詞越界的情況掏导。 - 巨大表
Oracle觸發(fā)自動收集某個表的統(tǒng)計信息的條件是表中修改的數(shù)據(jù)量超過該表數(shù)據(jù)總量的10%享怀,假設一個表每天新增1w條數(shù)據(jù),一年后這個表變成了365w條數(shù)據(jù)趟咆,那么這意味著這個表需要再過一個多月才會觸發(fā)一次自動收集統(tǒng)計信息的作業(yè)添瓷。那么在這個表上的謂詞查詢,尤其是時間忍啸、序列等自增條件上的查詢仰坦,就可能發(fā)生謂詞越界的情況,影響優(yōu)化器正確選擇執(zhí)行計劃计雌。
- 什么是Oracle ACS
Oracle ACS 是Oracle Advanced Customer Support (甲骨文高級客戶服務)的簡稱悄晃,這項服務由全球擁有數(shù)千名經(jīng)驗豐富的高級支持工程師團隊來運營,隸屬于Oracle Global Support Services全球支持服務業(yè)務部門凿滤。Oracle除了對于購買軟件妈橄,應用系統(tǒng),一體機集成系統(tǒng)的客戶提供Premier Support(高級服務翁脆,包括MOS網(wǎng)站24小時技術(shù)支持眷蚓,主動支持,最新軟件下載反番, 補丁下載等等)沙热,Oracle在此基礎上叉钥,20多年前即推出ACS服務來滿足客戶對于關(guān)鍵系統(tǒng)和個性化的需求。隨著云計算業(yè)務的不斷發(fā)展篙贸,Oracle又推出了Oracle Managed Cloud Servers (Oracle 托管云服務)來滿足客戶的云計算方面的需求投队。 - Oracle ACS服務的特點
√連接: 作為Oracle內(nèi)部服務部門,可以快速地與產(chǎn)品開發(fā)及全球支持部門建立溝通爵川,通過指定的的技術(shù)客戶經(jīng)理協(xié)調(diào)資源敷鸦,與客戶實現(xiàn)無縫的連接,這樣可以更加有效地滿足客戶的需要寝贡,例如緊急客戶支持扒披,24 X 7監(jiān)控,遷移等等圃泡。
√集成: 作為連接的目的碟案,Oracle ACS匯集全球的資源,包括團隊洞焙,服務蟆淀,和經(jīng)驗豐富的ACS專家團隊來滿足客戶在云計算時代的需求。
√自動化: 運營的最終目的是滿足業(yè)務的需求的同時提升效率澡匪,降低成本熔任,通過Oracle ACS團隊的長期穩(wěn)定的服務質(zhì)量,專業(yè)工具技能唁情,和最佳實踐的應用疑苔,從而達到推動客戶平臺的自動化水平和降低總擁有成本的目的。
√量身定制: ACS的服務是可以量身定制甸鸟,通過將應用系統(tǒng)生命周期內(nèi)的關(guān)鍵業(yè)務設計及不同的服務模塊及項目惦费,客戶可以靈活地根據(jù)需求選擇不同的服務內(nèi)容,從而滿足特定的業(yè)務需求抢韭。
綁定變量窺視
綁定變量窺視功能是數(shù)據(jù)庫的一個特性薪贫,自ORACLE9i版本開始引入,默認是開啟的刻恭。
“綁定變量窺視”表示瞧省,查詢優(yōu)化器在第一次調(diào)用游標時,會觀察用戶定義的綁定變量的值鳍贾,允許優(yōu)化器來確認過濾條件的選擇性鞍匾,以及是否使用綁定變量代替了常量。之后調(diào)用游標時不會出現(xiàn)窺視骑科,且會根據(jù)指針共享標準來共享游標橡淑,即使隨后的調(diào)用使用不同的綁定值。
使用綁定變量窺視咆爽,第一次解析包含綁定謂詞的SQL語句時梁棠,優(yōu)化器將查看綁定變量的值置森,并使用該值為查詢創(chuàng)建執(zhí)行計劃。然后掰茶,不管更改的綁定值如何暇藏,該計劃都將被存儲并用于未來的所有執(zhí)行蜜笤。如果初始綁定值不能很好地代表將來執(zhí)行查詢時提供的其他值濒蒋,那么,即使當前訪問路徑較優(yōu)把兔,也可能導致未來執(zhí)行變差沪伙,甚至影響某些迭代的查詢性能變慢。