恆生技術之眼
作者 林景忠
大家對於乙個業務系統的執行關心有如下幾個方面:功能性、穩定性、效率、安全性。而乙個系統的效能有包含了網路效能、應用效能、中介軟體效能、資料庫效能等等。
今天從資料庫效能的角度,**oracle效能優化的一些看法。
當乙個效能問題出現時,很多人都會猜測問題各個方面的原因。
今天主要談資料庫的效能問題,就問題而言,我們針對問題經過資料庫效能分析,發現資料庫效能存在問題,那麼就需要對資料庫效能問題進行優化解決。
從效能優化角度看,每個人都希望經過優化資料庫系統執行的速度越快越好。但是希望終歸是希望,系統優化最終能到達什麼程度和資料庫系統的很多方面有關係。
從優化的角度看,資料庫的效能問題基本可以分為幾類問題:作業系統效能問題、io效能問題、資料庫系統效能問題、sql效能問題、網路效能問題等等。
而根據實際結果統計,資料庫效能問題80%以上都是sql效能問題引起。下面談sql效能問題之前,介紹乙個經常遇見的乙個系統配置問題:接到客戶**說「今天做交易系統的歷史資料歸檔,做完歷史資料歸檔後,原來歷史放了3年的歷史資料,現在歷史表只有1年不到的資料,但是查歷史的選單比原來慢了很多,看了sql執行計畫比較,原來是走索引的,現在走的是全表掃瞄,該怎麼處理?」
針對該問題,根據經驗:
▪ 首先確認歷史表是分割槽表
▪ 然後讓客戶檢查資料庫引數optimizer_index_cost_adj,根據標準引數配置optimizer_index_cost_adj=10,建議客戶把這個引數設定成5試一下,客戶根據建議改了之後,這個問題解決了。
這個問題看似sql問題,但是通過資料庫引數得到解決,說明資料庫的很多問題都是互相關聯和影響的。
既然資料庫效能問題80%以上都是sql效能問題引起,接下來聊聊對sql優化的個人一些看法。
說個人看法之前,網上或者面試的時候,大部分人對sql優化的一致解決方法都是「先從awr報告找出有效能問題的sql(awr中top sql中耗時長的、消耗邏輯讀、物理讀的sql)、看sql的執行計畫,看sql的執行計畫的時候,關注有沒有全表掃瞄、有沒有cost很大的操作,然後嘗試新建索引、調整索引、調整表的訪問順序、再執行sql試試看。」
這個步驟其實也沒有太大的問題,80%到90%的sql問題也基本能解決,個人存在的問題是優化的效果具有不確定性。
我的看法是對於sql優化應該可以通過優化方法,讓sql優化的效果有比較好的確定性,因為有很多的環境是不能讓我們這樣調整下試試看的。
我的看法是這樣的,在sql優化的時候,首先我們要像解讀程式一樣先解讀sql,如這個sql的主要作用是什麼,有沒有特殊的操作如group by、order by、sum、分頁查詢等,涉及了幾張表、表的資料規模怎麼樣,表的條件有哪些,這些條件對於表的資料的選擇性怎麼樣。了解這些資訊之後,基本也可以確定這個sql最優的執行計畫該是什麼樣的,再檢視執行計畫的時候就很容易發現執行計畫的問題並知道該如何修正。如果沒有了解以上資訊,檢視執行計畫的時候會相對比較盲目。
檢視執行計畫的時候關注那些方面,主要有如下幾點:
▪ 訪問了哪些表
▪ 表的訪問方式(表的訪問順序、表是索引掃瞄還是全表掃瞄、)
▪ 表的連線方式 (nest loop join、hash join、sort merge join、連線是否存在笛卡爾積)
▪ 字段條件的選擇性是否合理(相關字段索引情況、索引的選擇性是否合理)
▪ 排序方法(根據什麼樣的字段排序)
▪ 資料獲取方式(返回乙個結果集的大小)
確認了以上幾個方面之後,經過優化之後再確認上面的執行計畫資訊就基本可以確認優化的效果是怎麼樣的。sql優化的目的是減少sql的系統資源的消耗,在sql執行計畫中也要關注減少表的訪問次數,如a表如果在sql中訪問一次即可,不要多次訪問。
有人會說,有些sql很長,可能乙個sql裡面就有20張表的訪問,如果遇到這樣的sql,就需要根據sql的結構對sql進行拆解,然後再逐步優化,就能比較準確地進行sql優化。
對於sql優化,希望大家要像看演算法一樣去解讀sql,總結出屬於自己的sql優化方法!
oracle 的效能優化
在網上搜尋了一些oracle效能優化的文章,為了更加深層次的鞏固 邊寫邊記 也為了可以隨時檢視,所以發表這篇文章。1.oracle採用自下而上的順序解析where子句,根據這個原理,表之間的連線必須寫在其他where條件之前,那些可以過濾掉最大數量記錄的條件必須寫在where子句的末尾。這點本人曾經...
oracle效能優化
今天有個問題沒有答上來 oracle的效能優化。查了查資料,學習學習。優化心得摘抄 資料庫優化oracle9i 很多的時侯,做oracle dba的我們,當應用管理員向我們通告現在應用很慢 資料庫很慢的時侯,我們到資料庫時做幾個示例的select也發現同樣的問題時,有些時侯我們會無從下手,因為我們認...
oracle效能優化
sql共享原理 為了不重複解析相同的sql語句,在第一次解析之後,oracle將sql語句存放在記憶體中。這塊位於系統全域性區域sga systemglobal area 的共享池 shared buffer poo1 中的記憶體可以被所有的資料庫使用者共享。因此,當你執行乙個sql語句 有時被稱為...