一次Oracle優化所想到的
我的原創連線:
有一次遇到一個問題。當然這圖已經被我塗抹的沒法看了(還是塗抹掉沒有風險)。但是依然能得出一些資訊。 (補充,該SQL根據報上來的情況是執行一次8秒以上)
1、10個表進行關聯(一個個數下來)
2、where就一個id(看數量級是一個,應該屬於點查)
3、省略了大量的列(列越多回表越大)
4、cost很大。(點查不應該這麼多)
5、用到了dblink(有remote)
要優化,這個工作其實涉及的東西非常多。索引、統計資訊、直方圖、巢狀關係、SQL寫法等等等,不瞭解資料庫的可能不以為然。可能最終我們能很快解決,但是涉及的東西不得不一一確認,可能性太多了。當然處理這個算我運氣好,只做了一個就好了。
就是上圖這個的紅框是左邊的這個列缺索引。造成了該表的全表。那麼先手工增加看看。效果顯而易見。cost從86000多將到680左右,理論提升120多倍。
實際反饋也是在80毫秒左右。速度提升也差不多是100多倍。理論和實際大體一致。
事情表面結束了,那麼帶來的思考有如下:
1、我一向反對dblink關聯(所有要用物化檢視或者ogg來解決跨庫查詢)但是上面是實在沒辦法的背景下,只能硬著頭皮優化。這個背景是一個CDB之間的PDB跨庫查詢。實際看下來也還行。畢竟跨越N個PDB擺在那裡,好在沒有外部網路。PDB之間的dblink也不差。
2、不得不說Oracle強,一個PDB上的連線N個PDB,他的執行計劃還很準。
3、我一向反對多表關聯,不管在什麼資料庫上。這次是10表關聯,我其實看到也有點發怵,不懂業務邏輯下,太難評價每個環節,對還是不對,好還是不好。但是Oracle這優化器,還是準確的搞定了。為什麼說這個難?比如我們寫select from a,b where a.id=b.id and a.id=1;資料庫不知道ab是什麼。通常會改寫成select from a,b where a.id=b.id and a.id=1 and b=1;因為是等價的。至於先找a.id=1 還是 b=1看哪個優了。但是他有兩個選擇。如果三個表呢?他有6個組合選擇。即3!3的階乘。10個表呢就是10!,10的階乘是多大,我算不過來。這在任何資料庫中都是這樣。
那麼是不是所有資料庫都能這樣跨資料庫,10表關聯出這個效果?估計不是。
4、最終在不改SQL的場景下,提升了100倍多,全靠資料庫自己的優化器和執行器完成。
5、有一次在一個PostgreSQL群中看到一位專業人士說到:說一個oracle極難被超越的地方,就是故障處理owi的思想。雖然國產很多也在借鑑,但是沒有做的很好的。即使現在,一個好的dba就是it後臺運維故障處理的入口,前臺只會說交易慢了,清算慢了,Oracle dba可以甚至可以最終定位到儲存光纖線光衰(硬體一點不報錯情況)。
業內有的大咖說Oracle領先其他有代差,10-20年。從有些各種點滴場景來看,客觀上來說,這些評價都不過分。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/637517/viewspace-2890234/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle優化的方法Oracle優化
- oracle優化Oracle優化
- oracle EM 優化Oracle優化
- oracle 效能優化Oracle優化
- oracle優化技巧Oracle優化
- Oracle效能優化-SQL優化(案例一)Oracle優化SQL
- Oracle效能優化-SQL優化(案例二)Oracle優化SQL
- Oracle效能優化-SQL優化(案例三)Oracle優化SQL
- Oracle效能優化-SQL優化(案例四)Oracle優化SQL
- Oracle in 查詢優化Oracle優化
- Oracle優化案例-使用with as優化Subquery Unnesting(七)Oracle優化
- EntityFramework優化:第一次啟動優化Framework優化
- Oracle優化案例-單表分頁語句的優化(八)Oracle優化
- Oracle 效能優化-expdp備份速度優化03Oracle優化
- Oracle 效能優化-expdp備份速度優化02Oracle優化
- 由一次最佳化聯想到認知和實時數倉的問題
- 一次簡單的分頁優化優化
- 記一次Node專案的優化優化
- Oracle優化案例-(三十四)Oracle優化
- Oracle優化案例-儲存過程的優化思路(二十三)Oracle優化儲存過程
- 記一次分頁優化優化
- 一次 Flutter WebView 效能優化FlutterWebView優化
- ? 記一次前端效能優化前端優化
- 記錄一次打包優化優化
- 你所不知道的Java效能優化之String!Java優化
- 記一次提升18倍的效能優化優化
- 一次資料庫的優化經歷資料庫優化
- Go藉助PProf的一次效能優化Go優化
- 一次生產的 JVM 優化案例JVM優化
- 從一次效能優化看https的效能優化HTTP
- Oracle優化案例-union代替or(九)Oracle優化
- oracle之優化一用group by或exists優化distinctOracle優化
- Oracle SQL效能優化的40條軍規OracleSQL優化
- Oracle優化案例-正確的使用索引(二)Oracle優化索引
- 144.從拼多多優惠券事件想到的事件
- 【Oracle】Oracle wrong result一則(優化器問題)Oracle優化
- 你所不知道的 Typescript 與 Redux 型別優化TypeScriptRedux型別優化
- 你所不知道的Typescript與Redux型別優化TypeScriptRedux型別優化