萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> oracle教程 >> oracle中Shared pool深入分析及性能調整

oracle中Shared pool深入分析及性能調整

摘要:本文首先詳細介紹了oracle中shared pool的概念以及所包含的內存結構。然後深入介紹了oracle對於shared pool的管理機制。最後全面介紹了有關buffer cache監控以及調優的實用方法。

1. shared pool的概念

oracle數據庫作為一個管理數據的產品,必須能夠認出用戶所提交的管理命令(通常叫做SQL語句),從而進行響應。認出的過程叫做解析SQL語句的過程,響應的過程叫做執行SQL語句的過程。解析的過程是一個相當復雜的過程,它要考慮各種可能的異常情況,比如SQL語句涉及到的對象不存在、提交的用戶沒有權限等等。而且,還需要考慮如何執行SQL語句,采用什麼方式去獲取數據等。解析的最終結果是要產生oracle自己內部的執行計劃,從而指導SQL 的執行過程。可以看到,解析的過程是一個非常消耗資源的過程。因此,oracle在解析用戶提交的SQL語句的過程中,如果對每次出現的新的SQL語句,都按照標准過程完整的從頭到尾解析一遍的話,效率太低,尤其隨著並發用戶數量的增加、數據量的增加,數據庫的整體性能將直線下降。

oracle對SQL語句進行了概括和抽象,將SQL語句提煉為兩部分,一部分是SQL語句的靜態部分,也就是SQL語句本身的關鍵詞、所涉及的表名稱以及表的列等。另一部分就是SQL語句的動態部分,也就是SQL語句中的值(即表裡的數據)。很明顯的,整個數據庫中所包含的對象數量是有限的,而其中所包含的數據則是無限的。而正是這無限的數據導致了SQL語句的千變萬化,也就是說在數據庫運行的過程中,發生的所有SQL語句中,靜態部分可以認為數量是有限的,而動態部分則是無限的。而實際上,動態部分對解析的影響相比靜態部分對解析的影響來說是微乎其微,也就是說通常情況下,對於相同的靜態部分的SQL 語句來說,不同的動態部分所產生的解析結果(執行計劃)基本都是一樣的。這也就為oracle提高解析SQL語句的效率提供了方向。

oracle會將用戶提交來的SQL語句都緩存在內存中。每次處理新的一條SQL語句時,都會先在內存中查看是否有相同的SQL語句。如果相同則可以減少最重要的解析工作(也就是生成執行計劃),從而節省了大量的資源;反之,如果沒有找到相同的SQL語句,則必須重新從頭到尾進行完整的解析過程。這部分存放SQL語句的內存就叫做共享池(shared pool)。當然,shared pool裡不僅僅是SQL語句,還包括管理shared pool的內存結構以及執行計劃、控制信息等等內存結構。

當oracle在shared pool中查找相同的SQL語句的過程中,如果SQL語句使用了綁定變量(bind variable),那麼就是比較SQL語句的靜態部分,前面我們已經知道,靜態部分是有限的,很容易就能夠緩存在內存裡,從而找到相同的SQL語句的概率很高。如果沒有使用綁定變量,則就是比較SQL語句的靜態部分和動態部分,而動態部分的變化是無限的,因此這樣的SQL語句很難被緩存在shared pool裡。畢竟內存是有限的,不可能把所有的動態部分都緩存在shared pool裡,即便能夠緩存,管理這樣一個無限大的shared pool也是不可能完成的任務。不使用綁定變量導致的直接結果就是,找到相同的SQL語句的概率很低,導致必須完整的解析SQL語句,也就導致消耗更多的資源。從這裡也可以看出,只有我們使用了綁定變量,才真正遵循了oracle引入shared pool的哲學思想,才能夠更有效的利用shared pool.

shared pool的大小由初始化參數shared_pool_size決定。10g以後可以不用設定該參數,而只需要指定sga_target,從而oracle 將自動決定shared pool的大小尺寸。在一個很高的層次上來看,shared pool可以分為庫緩存(library cache)和數據字典緩存(dictionary cache)。Library cache存放了最近執行的SQL語句、存儲過程、函數、解析樹以及執行計劃等。而dictionary cache則存放了在執行SQL語句過程中,所參照的數據字典的信息,包括SQL語句所涉及的表名、表的列、權限信息等。dictionary cache也叫做row cache,因為這裡面的信息都是以數據行的形式存放的,而不是以數據塊的形式存放的。對於dictionary cache來說,oracle傾向於將它們一直緩存在shared pool裡,不會將它們交換出內存,因此我們不用對它們進行過多的關注。而library cache則是shared pool裡最重要的部分,也是在shared pool中進進出出最活躍的部分,需要我們仔細研究。所以,我們在說到shared pool實際上就可以認為是在指library cache.

  • 共6頁:
  • 上一頁
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 下一頁
copyright © 萬盛學電腦網 all rights reserved