Oracle 共享池和數據庫高速緩衝區,引出SQL執行過程

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/a756041482/article/details/51315372
        共享池在數據庫中可以說是相當重要動力資源,關係着數據庫的性能瓶頸。
什麼是共享池呢?
        共享池是內存結構中SGA(系統全局區)的一部分,包含了:庫緩衝區、數據字典緩衝區、服務器結果緩衝區、預留池,也是着四個區組成了共享池,這四個區的功能就是共享池的功能。
        庫緩衝區
        共享SQL區:存放執行計劃和解析樹,當用戶執行一條SQL語句時,共享池會根據SQL語句的複雜程度分出一定的內存給用戶,當用戶再次執行相同的SQL語句時,不必再次進行解析,提高執行語句的執行效率。類似於古代將領帶兵打仗,皇帝就是用戶,把將領當成共享池,將領帶大家走的路就是SQL語句,不用再自己摸索路線。
        私有SQL區:裏面主要存了一些SQL語句的環境設置,比如SQL語句的一些綁定變量、環境和會話參數,還有PL/SQL程序包的局部變量、全局變量和包變量。共享池裏一個SQL語句的共享SQL區能被多個私有SQL區共有。即很多人能同時走這條路。
        數據字典緩衝區
        數據字典存在於SYSTEM表空間中,數據庫中訪問最頻繁的就是它了,裏面有表、視圖等信息,數據庫會藉助數據字典對SQL語句進行解析,它分爲兩個部分存放,一部分以行(ROW)的方式存在數據字典緩衝區中,另一部分以塊(BLOCK)的方式存放在庫緩衝區中,這兩個部分共同組成數據字典緩衝區,並被所有的用戶進程共享。
       服務器結果緩衝區
       這也是共享池裏顯目的一點,將所有正確的SQL查詢和函數結果緩存到服務器結果緩衝區裏, 當多個用戶執行相同的SQL語句時,只要它有過一次解析和執行計劃,那麼速度是與第一次完全不通檔次的。
        服務器結果緩衝區和數據庫高速緩衝區有所區別,前者是緩衝到共享池裏,不經過任何加工;後者需從磁盤讀到內存,也就是經過加工。
        預留池
        如果有大片連續的內存分配,都會優先選擇預留池。
        共享池在不同的服務器模式下還有不同的結構        
                                                           
        當數據庫處於專有服務器模式時,庫緩衝區裏只有共享SQL區,私有SQL區和UGA被分到程序全局區裏;但處於共享服務器模式下,庫緩衝區包含了私有SQL區,共享池裏也有了UGA(用戶全局區)。    
        總的來說,共享池就是SQL語句的專屬區域,劃分內存區域-->SQL語句的解析-->生成解析樹-->制定執行計劃-->返回查詢結果-->被所有的用戶進程共享這條SQL語句的執行計劃和結果。
        
什麼是數據庫高速緩衝區?
        爲了避免數據庫等待磁盤I/O,Oracle設計了數據庫高速緩衝區,暫時存放用戶執行查詢語句時從數據文件(磁盤)讀取出來的數據,避免了直接對磁盤I/O,並被當前實例的其他用戶共享。
        共享池和數據庫高速緩衝區密切相關,共享池存放SQL語句的來龍去脈,數據庫高速緩衝區是磁盤和內存之間的容器,每個查詢都是要先訪問共享池再到這個容器。數據庫高速緩衝區裏包含了保持池,回收池和默認池
        可以看下面這個圖瞭解下數據庫高速緩衝區。        

       
        當發生SQL查詢時,在共享池的服務器結果緩衝區裏找不到結果,那麼就會到數據庫高速緩衝區裏查找,如果有,則產生緩衝命中(Cache Hit),讀取保持池,否則產生緩衝失誤(Cache Miss),可能會讀取默認池或者回收池,還有一種情況,如果在數據庫高速緩衝區裏找了很久,直到臨界點,那麼就會通知DBWn進程,將回收池裏的髒緩衝器寫入磁盤,再將默認池裏的空閒緩衝器轉移到回收池,變爲髒緩衝器。
        可想而知,一個SQL語句的執行過程大致如下:
    
歡迎大家指正!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章