Oracle數(shù)據(jù)庫中最常用的SQL語句

          SQL語句進(jìn)行調(diào)整,往往有一項前期工作,就是定位最常用的SQL 語句。Oracle數(shù)據(jù)庫可以從多個方面取得SQL語句。如從數(shù)據(jù)庫自身的存儲過程或者函數(shù)中取得,也可以從前臺的應(yīng)用程序中取得。所以,數(shù)據(jù)庫管理員必須學(xué)會如何從數(shù)據(jù)庫當(dāng)前程序庫緩存中對已經(jīng)存在的SQL語句進(jìn)行采樣。了解當(dāng)前使用最頻繁的SQL語句以及其對應(yīng)的資源消耗情況。只有如此,數(shù)據(jù)庫管理員才能夠?qū)ΠY下藥,解決SQL語句執(zhí)行效率不高的問題。  在Oracle數(shù)據(jù)庫中有多種方法可以幫助數(shù)據(jù)庫管理員定位常用的SQL語句。筆者在這里介紹比較常用的兩種方法。
            一、查詢系統(tǒng)表sys.wrh$_sqlsta。
            在數(shù)據(jù)庫系統(tǒng)中有如下一張表。這張表存儲中Oracle數(shù)據(jù)庫執(zhí)行過的SQL語句的相關(guān)情況。
            
            如上面這張表中,他會反映某個特定Sql語句的執(zhí)行信息。其中第一個參數(shù)Excutions_Total參數(shù)紀(jì)錄了某條SQL語句總共執(zhí)行的次數(shù)。而第二個參數(shù)Disk-Reads-Totali參數(shù)則統(tǒng)計了從磁盤中讀取數(shù)據(jù)的次數(shù)。當(dāng)SQL語句的執(zhí)行次數(shù)特別多而且又是多次從磁盤中讀取數(shù)據(jù)的話,那么數(shù)據(jù)庫管理員就要注意了。因為從磁盤中讀取數(shù)據(jù)要比從內(nèi)存中讀取數(shù)據(jù)慢的多。此時,若數(shù)據(jù)庫管理員能夠想方設(shè)法,讓這些執(zhí)行頻率高的SQL語句不直接從磁盤中讀取數(shù)據(jù),而是從內(nèi)存中讀取數(shù)據(jù),那么就可以非常有效的提高SQL語句的執(zhí)行效率。
            另外數(shù)據(jù)庫可以員也可以通過Statspack方法來定位SQL語句。當(dāng)我們啟用這個功能的時候,數(shù)據(jù)庫會生成一張Stats$Sql_summary的表。他的功能跟上面這張表類似,只是他會有選擇的紀(jì)錄相關(guān)的信息。
            在Sql_Parameter會記入相關(guān)的條件。如當(dāng)SQL語句執(zhí)行次數(shù)大于多少才進(jìn)行紀(jì)錄;又或者當(dāng)SQL語句執(zhí)行磁盤讀取次數(shù)大于多少時進(jìn)行統(tǒng)計等等。通過這個過濾,會讓數(shù)據(jù)庫管理員了解更多的信息。但是,這里要注意一個問題,當(dāng)任何一個指標(biāo)超出(Oracle官方資料上把這個指標(biāo)叫做閥值)的時候,系統(tǒng)就會往上面這個表中添加一條紀(jì)錄。所以如果這個指標(biāo)設(shè)置的比較低,當(dāng)數(shù)據(jù)庫比較繁忙的時候,我們會發(fā)現(xiàn)這張表會變得非常的活躍。數(shù)據(jù)庫會時不時的向這張表中添加紀(jì)錄。
            所以,如果數(shù)據(jù)庫管理員想用這種方法來定位SQL語句的話,那么需要同時做好兩項工作
            一是需要根據(jù)SQL調(diào)整過程來隨時調(diào)整這個指標(biāo)。當(dāng)我們數(shù)據(jù)庫管理員需要對SQL語句進(jìn)行調(diào)整的時候,就必須要降低指標(biāo)值。如此才能夠定位那些不常用的SQL語句,并對其進(jìn)行調(diào)整。但是,降低指標(biāo)值會導(dǎo)致數(shù)據(jù)庫向這個表中添加更多的紀(jì)錄。此時,數(shù)據(jù)庫管理員在調(diào)整過后,就要手工刪除這表中多余的數(shù)據(jù)。
            二是要定期的查看這表中的內(nèi)容。因為隨著系統(tǒng)應(yīng)用時機的不同,有些SQL語句可能在某個時段后不再使用。所以,如果SQL調(diào)整不再使用這些內(nèi)容的話,則數(shù)據(jù)庫管理員從這張表中刪除他們就顯得非常的必要了。

          二、使用第三方工具對其進(jìn)行定位。  除了Oracle數(shù)據(jù)庫自帶的工具之外,我們數(shù)據(jù)庫管理員還可以利用一些第三方的工具或者腳本來對常用的SQL語句進(jìn)行定位。
            如有些公司開發(fā)了一些GUI工具。這些工具可以幫助我們數(shù)據(jù)庫管理員迅速顯示程序庫緩存中的SQL 語句,并且通過一些參數(shù),還可以抽取執(zhí)行頻率比較高的或者耗用資源比較多的SQL語句。另外,我們也可以自己寫一些SQL腳本。通過這個腳本來直接讀取數(shù)據(jù)庫緩存中的SQL語句。
            采用第三方工具有時候會比上面這個方法更加的有用。因為上面這個方法其紀(jì)錄的是一個過去式的結(jié)果。而直接在緩存中讀取的數(shù)據(jù),則反映的是及時的數(shù)據(jù)。如當(dāng)用戶發(fā)覺數(shù)據(jù)庫性能降低的時候,則數(shù)據(jù)庫管理員可以采用這些工具,了解SQL語句的執(zhí)行情況,看看是否是因為SQL語句所造成的。
            當(dāng)數(shù)據(jù)庫管理員找到影響數(shù)據(jù)庫性能的那個SQL語句之后,我們就可以對每個可疑的SQL語句進(jìn)行調(diào)整。
            如數(shù)據(jù)庫管理員可以更改優(yōu)化器模式。在Oracle數(shù)據(jù)庫中,提供了不少的優(yōu)化器模式,如最快優(yōu)化器或者耗用資源最少優(yōu)化器等等。數(shù)據(jù)庫管理員可以嘗試更改不同的優(yōu)化器模式,然后讓數(shù)據(jù)庫產(chǎn)生多個執(zhí)行計劃。通過對每個計劃進(jìn)行追蹤、分析、計時,來確定那個執(zhí)行計劃具有最快的執(zhí)行時間。
            如可以添加提示,來強制改變執(zhí)行計劃,來獲得最優(yōu)的執(zhí)行時間。調(diào)整SQL語句的過程包含多個操作。SQL語句的調(diào)整從全局水平轉(zhuǎn)移到特定的水平。SQL語句調(diào)整的終極目標(biāo)是縮短SQL語句的執(zhí)行時間。Oracle數(shù)據(jù)庫中不同的執(zhí)行計劃,其執(zhí)行所需要的時間是不同的。出于調(diào)整的需要,數(shù)據(jù)庫管理員可以通過向所選擇的語句中添加提示的方式,強制對執(zhí)行計劃進(jìn)行修改。
            如可以通過添加索引來刪除不必要的全表掃描。索引是提高數(shù)據(jù)庫查詢性能的一個法寶。當(dāng)SQL語句查詢效率低下,數(shù)據(jù)庫管理員想到的第一個方法就是能否對表添加合適的索引來提高SQL語句的查詢效率。通過對表添加索引,特別是基于位圖和基于函數(shù)的索引, 可以防止一些不必要的全表掃描。不過,在后續(xù)調(diào)整的過程中給表添加索引的話,要注意一個問題。就是添加索引后,可能會造成許多其他的SQL語句執(zhí)行計劃的改變。所以,在為某一個SQL語句調(diào)整添加或者刪除了某個索引之后,可能會發(fā)現(xiàn)其他的SQL語句執(zhí)行效率有所改變。故一般在后期的SQL語句調(diào)整過程中,我們都不怎么建議數(shù)據(jù)庫管理員對原來的索引進(jìn)行調(diào)整。在確實有必要的情況下,數(shù)據(jù)庫管理員要能夠站在一個全局的角度,去評估索引更改后對其他SQL語句執(zhí)行計劃的影響。從而最終確定這么處理是否合適。
            另外在對單獨的SQL語句進(jìn)行調(diào)整的時候,還需要注意一個持久化的問題。也就是說,對SQL語句的調(diào)整,無論是執(zhí)行計劃的調(diào)整,還是優(yōu)化器模式的改變,其效果不能夠只是暫時的。讓SQL語句調(diào)整變得更持久,只有如此,調(diào)整才有實際意義。
            如何才能夠提高調(diào)整后的SQL語句的持久性呢?筆者這里有一個小的建議。如果通過以上的定位方法,了解到某條SQL語句執(zhí)行頻率非常高,或者耗用的資源比較多,又或者多次從磁盤中讀取數(shù)據(jù)。對于這種SQL語句,如何保證調(diào)整的持久化呢?此時,可以改變SQL語句的來源來達(dá)到持久化的目的。如當(dāng)數(shù)據(jù)庫管理員發(fā)現(xiàn)SQL語句是來源于應(yīng)用程序。此時,在調(diào)整的過程中,數(shù)據(jù)庫管理員可以考慮,把應(yīng)用程序傳遞過來的SQL語句打包放入存儲過程,然后把存儲過過程放入Oracle系統(tǒng)的軟件包中來實現(xiàn)。他可以讓我們定。位SQL語句的工作來的簡單;而且,他還使得所有遠(yuǎn)程 的應(yīng)用程序更加便于移植,因為對Oracle的調(diào)用都是封裝在數(shù)據(jù)庫函數(shù)或者過程之中。
            從以上的分析中我們可以看出,要對SQL語句進(jìn)行調(diào)整,無論是采取何種方式,第一件工作就是要定位需要對哪些SQL語句進(jìn)行調(diào)整。為了提高調(diào)整的效果,哪些執(zhí)行頻率高、耗用資源多的SQL語句,就成為我們調(diào)整的對象。所以,如何定位這些語句就顯得至關(guān)重要。我們只要找到這些SQL語句,就可以使得我們的優(yōu)化工作事半功倍

          posted on 2009-04-13 13:30 MichaelLee 閱讀(312) 評論(0)  編輯  收藏 所屬分類: SQL


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導(dǎo)航

          統(tǒng)計

          公告

          ====Michael Lee====
          =Java Sofware Engineer=
          =Work @ Beijing=
          ---再煩,也別忘微笑;再急,也要注意語氣;再苦,也別忘堅持;再累,也要愛自己!---
          ---低調(diào)做人,你會一次比一次穩(wěn)?。桓哒{(diào)做事,你會一次比一次優(yōu)秀---
          ---成功的時候不要忘記過去;失敗的時候不要忘記還有未來---

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 普安县| 乐至县| 芷江| 东安县| 隆回县| 乌苏市| 黎川县| 从化市| 玛曲县| 安新县| 抚松县| 漯河市| 玉山县| 平江县| 方正县| 杭州市| 玉田县| 张家川| 巨鹿县| 宣化县| 璧山县| 十堰市| 辽源市| 泸水县| 珠海市| 黔西| 璧山县| 河津市| 佛冈县| 太仓市| 平乐县| 靖远县| 麻城市| 仁寿县| 奎屯市| 莒南县| 思南县| 丹寨县| 康乐县| 手游| 隆尧县|