60-80% of database performance issues are related to poorly performing SQL,60-80%的數據庫性能問題要歸結於生產中糟糕的SQL語句!
以此一文來總結筆者近10多年來的工作經驗並基於最基本的也是最有效的對於Oracle數據庫中的RBO、CBO、索引、WHERE條件進行講解同時配以大量案例來幫助讀者從此文中學到的相關的理論知識快速的運用到其正在從事的生產環境中的優化過程中去。
優化的理論基礎
通過Select Count(?)進入優化之旅
不看百度或者GOOGLE說出下面3者的區別?
SELECT COUNT (*)
SELECT COUNT(1)
SELECT COUNT(字段名)
SELECT Count(?)的知識
ORACLE的優化器
要說PLSQL優化,我們先需要來好好說一下Oracle優化器的知識:
優化器的優化模式
CBO模式
RBO模式
一起來看看oracle優化器的發展歷程
所以,我們知道ORACLE10後開始默認使用CBO,在CBO時ORACLE會自動來選擇最優的執行計劃,有時我們會認爲:這個應該走索引更好啊,但是對於CBO來說,一個FULL TABLE ACCESS反而比索引更有效。
因此,在CBO的模式下,我們需要做的就是:
- 做好數據庫信息的相關統計
- 合理建設我們的索引
- 優化我們的SQL
讓我們從索引的基本知識下手吧
索引按內部結構分類
索引按功能分類
索引按索引對象分類
建立索引的方法論
上面介紹了這麼多索引的分類,下面來講講建立索引的方法論吧,大家可能較關心這個,因爲這個是經驗總結也是實戰有用的利器哈。
不建議建立索引的情況
索引很神奇,可是索引不是萬能,有時你建了索引也等於沒用或者是白建、作無用功,爲什麼呢?我們看下去。
索引不會生效的情況
所以索引不要亂建,有時建了也是白建,爲什麼呢?來看看下面的案例分析吧:
以案例來說明
PLSQL優化>一個不走索引的優化案例
這個例子說明了,如果你有一字參於WHERE條件查詢的字段,但是它參於了運算符,因此它在ORACLE的內部執行計劃中是不會走索引的,因此我們做了一個小小的變化,效率提升了多少倍?5.3倍,530%,呵呵!
以上例我們可以爲建立索引作一個總結。
建立索引的總結
Table Analyze
Analyze Table VS DBMS_STATS
Import & Export
說到Import & Export命令,大家會說。。。哎,這個不是很簡單,就是:imp username/pwd@oraid file=path 嗎?嘿嘿。。。試想:
- 你需要導入一個8GB左右的.dmp文件進入數據庫
- 你需要將一個庫,其中含有至少30張表並且每張表都超過1200萬條記錄的數據進入一個.dmp文件
Import的常規做法
- 第一條,只導數據,不導索引,並且設置成10000條數據一次commit,同時設置了一個緩衝池
- 第二條,只導索引,不導數據,並且設置成10000條數據一次commit,同時設置了一個緩衝池
- 一個含有8GB文件內容的目錄,用FTP客戶端下載,你會發覺似乎永遠等不到頭,幾小時就這樣耗着,然後你改成先把這個目錄打成一個壓縮包,然後再用FTP客戶端 下載,幾十分鐘就能搞定。
- 你用JDBC寫一個FOR循環插入100萬條記錄。。。結果是ORACLE直接爆掉,而你採用批量提交。。。結果是驚人的!
以案例來說明PLSQL的優化
PLSQL優化-SELECT IN 與SELECT EXISTS
PLSQL優化-SELECT IN的幾種優化
PLSQL優化-SELECT IN、OR、UNION的互轉
PLSQL優化-分頁語句中加入索引的優化
create index IDX_WAREHOUSE_CT on T_WAREHOUSE(CREATED_DATE DESC);
PLSQL優化-INNER JOIN VS WHERE
PLSQL優化-WHERE語句優化要點
WHERE語句中選擇最有效的表名順序
PLSQL優化>共享SQL
如何自學
筆者聯繫方式: