Oracle數據庫中最常用的SQL語句

  對SQL語句進行調整,往往有一項前期工作,就是定位最常用的SQL 語句。Oracle數據庫可以從多個方面取得SQL語句。如從數據庫自身的存儲過程或者函數中取得,也可以從前臺的應用程序中取得。所以,數據庫管理員必須學會如何從數據庫當前程序庫緩存中對已經存在的SQL語句進行採樣。瞭解當前使用最頻繁的SQL語句以及其對應的資源消耗情況。只有如此,數據庫管理員才能夠對症下藥,解決SQL語句執行效率不高的問題。

  在Oracle數據庫中有多種方法可以幫助數據庫管理員定位常用的SQL語句。筆者在這裏介紹比較常用的兩種方法。

  一、查詢系統表sys.wrh$_sqlsta。

  在數據庫系統中有如下一張表。這張表存儲中Oracle數據庫執行過的SQL語句的相關情況。

  二招幫你定位Oracle數據庫中最常用的SQL語句

  如上面這張表中,他會反映某個特定Sql語句的執行信息。其中第一個參數Excutions_Total參數紀錄了某條SQL語句總共執行的次數。而第二個參數Disk-Reads-Totali參數則統計了從磁盤中讀取數據的次數。當SQL語句的執行次數特別多而且又是多次從磁盤中讀取數據的話,那麼數據庫管理員就要注意了。因爲從磁盤中讀取數據要比從內存中讀取數據慢的多。此時,若數據庫管理員能夠想方設法,讓這些執行頻率高的SQL語句不直接從磁盤中讀取數據,而是從內存中讀取數據,那麼就可以非常有效的提高SQL語句的執行效率。

 

  另外數據庫可以員也可以通過Statspack方法來定位SQL語句。當我們啓用這個功能的時候,數據庫會生成一張Stats$Sql_summary的表。他的功能跟上面這張表類似,只是他會有選擇的紀錄相關的信息。

 

  在Sql_Parameter會記入相關的條件。如當SQL語句執行次數大於多少才進行紀錄;又或者當SQL語句執行磁盤讀取次數大於多少時進行統計等等。通過這個過濾,會讓數據庫管理員瞭解更多的信息。但是,這裏要注意一個問題,當任何一個指標超出(Oracle官方資料上把這個指標叫做閥值)的時候,系統就會往上面這個表中添加一條紀錄。所以如果這個指標設置的比較低,當數據庫比較繁忙的時候,我們會發現這張表會變得非常的活躍。數據庫會時不時的向這張表中添加紀錄。

 

  所以,如果數據庫管理員想用這種方法來定位SQL語句的話,那麼需要同時做好兩項工作

 

  一是需要根據SQL調整過程來隨時調整這個指標。當我們數據庫管理員需要對SQL語句進行調整的時候,就必須要降低指標值。如此才能夠定位那些不常用的SQL語句,並對其進行調整。但是,降低指標值會導致數據庫向這個表中添加更多的紀錄。此時,數據庫管理員在調整過後,就要手工刪除這表中多餘的數據。

 

  二是要定期的查看這表中的內容。因爲隨着系統應用時機的不同,有些SQL語句可能在某個時段後不再使用。所以,如果SQL調整不再使用這些內容的話,則數據庫管理員從這張表中刪除他們就顯得非常的必要了。

 

二、使用第三方工具對其進行定位。

  除了Oracle數據庫自帶的工具之外,我們數據庫管理員還可以利用一些第三方的工具或者腳本來對常用的SQL語句進行定位。

 

  如有些公司開發了一些GUI工具。這些工具可以幫助我們數據庫管理員迅速顯示程序庫緩存中的SQL 語句,並且通過一些參數,還可以抽取執行頻率比較高的或者耗用資源比較多的SQL語句。另外,我們也可以自己寫一些SQL腳本。通過這個腳本來直接讀取數據庫緩存中的SQL語句。

 

  採用第三方工具有時候會比上面這個方法更加的有用。因爲上面這個方法其紀錄的是一個過去式的結果。而直接在緩存中讀取的數據,則反映的是及時的數據。如當用戶發覺數據庫性能降低的時候,則數據庫管理員可以採用這些工具,瞭解SQL語句的執行情況,看看是否是因爲SQL語句所造成的。

 

  當數據庫管理員找到影響數據庫性能的那個SQL語句之後,我們就可以對每個可疑的SQL語句進行調整。

  如數據庫管理員可以更改優化器模式。在Oracle數據庫中,提供了不少的優化器模式,如最快優化器或者耗用資源最少優化器等等。數據庫管理員可以嘗試更改不同的優化器模式,然後讓數據庫產生多個執行計劃。通過對每個計劃進行追蹤、分析、計時,來確定那個執行計劃具有最快的執行時間。

 

  如可以添加提示,來強制改變執行計劃,來獲得最優的執行時間。調整SQL語句的過程包含多個操作。SQL語句的調整從全局水平轉移到特定的水平。SQL語句調整的終極目標是縮短SQL語句的執行時間。

 

Oracle數據庫中不同的執行計劃,其執行所需要的時間是不同的。出於調整的需要,數據庫管理員可以通過向所選擇的語句中添加提示的方式,強制對執行計劃進行修改。

 

  如可以通過添加索引來刪除不必要的全表掃描。索引是提高數據庫查詢性能的一個法寶。當SQL語句查詢效率低下,數據庫管理員想到的第一個方法就是能否對錶添加合適的索引來提高SQL語句的查詢效率。通過對錶添加索引,特別是基於位圖和基於函數的索引, 可以防止一些不必要的全表掃描。不過,在後續調整的過程中給表添加索引的話,要注意一個問題。就是添加索引後,可能會造成許多其他的SQL語句執行計劃的改變。所以,在爲某一個SQL語句調整添加或者刪除了某個索引之後,可能會發現其他的SQL語句執行效率有所改變。故一般在後期的SQL語句調整過程中,我們都不怎麼建議數據庫管理員對原來的索引進行調整。在確實有必要的情況下,數據庫管理員要能夠站在一個全局的角度,去評估索引更改後對其他SQL語句執行計劃的影響。從而最終確定這麼處理是否合適。

 

  另外在對單獨的SQL語句進行調整的時候,還需要注意一個持久化的問題。也就是說,對SQL語句的調整,無論是執行計劃的調整,還是優化器模式的改變,其效果不能夠只是暫時的。讓SQL語句調整變得更持久,只有如此,調整纔有實際意義。

 

  如何才能夠提高調整後的SQL語句的持久性呢?筆者這裏有一個小的建議。如果通過以上的定位方法,瞭解到某條SQL語句執行頻率非常高,或者耗用的資源比較多,又或者多次從磁盤中讀取數據。對於這種SQL語句,如何保證調整的持久化呢?此時,可以改變SQL語句的來源來達到持久化的目的。如當數據庫管理員發現SQL語句是來源於應用程序。此時,在調整的過程中,數據庫管理員可以考慮,把應用程序傳遞過來的SQL語句打包放入存儲過程,然後把存儲過過程放入Oracle系統的軟件包中來實現。他可以讓我們定。位SQL語句的工作來的簡單;而且,他還使得所有遠程 的應用程序更加便於移植,因爲對Oracle的調用都是封裝在數據庫函數或者過程之中。

 

  從以上的分析中我們可以看出,要對SQL語句進行調整,無論是採取何種方式,第一件工作就是要定位需要對哪些SQL語句進行調整。爲了提高調整的效果,哪些執行頻率高、耗用資源多的SQL語句,就成爲我們調整的對象。所以,如何定位這些語句就顯得至關重要。我們只要找到這些SQL語句,就可以使得我們的優化工作事半功倍。

發佈了26 篇原創文章 · 獲贊 2 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章