探究 Oracle 高水位對數據庫性能影響


 

2016-08-11 陳龍 恩墨學院
 
探究 Oracle 高水位對數據庫性能影響1
大家好!我是來自雲和恩墨的陳龍,目前主要負責Oracle技術支持工作。在我開始學習Oracle 的時候就聽eygle老師說過,要想學好技術,一定要要多做實驗,多做學習記錄,理論與實踐相結合,才能真正理解吸收那些知識,所以今天我想分享一下對Oracle高水位線與SQL訪問性能相關性的研究體會。談不上很深入的研究,只是想與大家分享我的Oracle學習過程,希望能與大家交流進步。之所以分享這個學習內容,是因為在我曾經經歷的一些優化項目中,遇到由於高水位導致SQL訪問性能下降的問題,這促使我想更深入的去理解:什么是高水位線? 高水位到底會帶來哪些影響? 應該怎樣更好的解決高水位帶來的問題?在開始深入分析之前,讓我們先來了解一下高水位線HWM。
1 HWM的基本原理(概念)在Oracle中,高水位線(High-warter mark, HWM)被用來形容數據塊的使用位置,即說明那些塊是已經被使用的,那些沒有。在創建一個新的表時,Oracle 就會為這個對象分配一個段。在這個段中,第一個區的第一個塊在創建時就會被分配存儲一些表頭信息。高水位的管理機制在MSSM和ASSM中不同,下面分別介紹這兩種管理機制:手動段空間管理(MSSM)在以往的手動段空間管理中(MSSM),高水位標記HWM, 一個段分成三部分,header block,used block(row data),unused block,其中used block和unused block之間的分界線就是高水位標記HWM,當進行全表掃描的時候,會掃描到HWM下的所有數據塊,即使used block中很多數據被刪除了,全表掃描還是以HWM為准。當插入insert時,freelist中沒有空閑塊,HWM會向上移動,但是只會向上移動,不會自動收縮,即使delete大量數據,導致HWM下有很多空閑塊。如下圖:

 

第一個區的第一個塊就稱為段頭(SEGMENT HEADE),段頭中就儲存了一些信息,基中HWM的信息就存儲在此。此時,因為第一個區的第一塊用於存儲段頭的一些信息,雖然沒有存儲任何實際的記錄,但也算是被使用,此時HWM是位於第2個塊當我們不斷插入數據到PM_USER后,第1個塊已經放不下后面新插入的數據,此時,ORACLE將高水位之上的塊用於存儲新增數據。

 

在向表里插入數據后,HWM本身也向上移.也就是說,當我們不斷插入數據時,HWM會往不斷上移,這樣,在HWM之下的,就表示使用過的塊,HWM之上的就表示已分配但從未使用過的塊。

 

 當對表進行導出,導入后,或者move等操作后,HWM就會降低到真實水平上。自動段管理(ASSM)在自動段管理(ASSM)中,利用位圖來代替空閑列表,當會話向表插入數據時,數據庫只格式一個單獨的位圖塊,而不是像MSSM中那樣,會預先格式化一組塊。

 

 

在ASSM表空間中,除了一個HWM外,還有一個低HWM。在MSSM中,HWM推進時,所有的塊都會格式化並立即生效,這樣Oracle 就可以安全的讀取這些塊。但是對於ASSM,當HWM推進時,Oracle 並不會立即格式所有的塊,只是在第一次使用的時候才會對這些塊進行格式化。也就是說,在第一次使用的的時候,即進行insert 操作時,數據會插入到塊中的任意水位線,位於低水位線(LHMW)和高水位線(HHMW)之間。因此在這個區域的許多塊就不會被格式化。在一個ASSM段中的每個數據塊可能為這些狀態:◎ 在HWM之上這些塊都是沒有格式化,且沒有被使用◎在HWM之下這些塊會處於這些狀態之一:• 已經分配,但是沒有被格式化且沒有被使用• 已經格式化且包含數據• 已經格式化,但是已經刪除數據,塊為空下面來了解整個過程:

 

如圖所示,在沒進行數據插入前,段中的所有數據塊都是沒有格式化的且沒有被使用。假設這個時候某會話將數據插入時,數據庫會把數據寫到任何可以利用的空間塊中。如下圖所示:

 

數據庫也可能會選擇HWM和低HWM之間的任何數據塊,或者低HWM之下的任何可用的空間的塊。注意低HWM位置,因為HWM之下的塊只有在被使用的時候,才進行格式化,所以當存在數據掃描時,特別是全表掃描,Oracle 會讀取到低HWM的位置。如下圖所示:

 

如果某條會話將數據插入到某表中,但是在當前的HWM之下沒有足夠的可用空間,那么這個時候Oracle 會推進HWM,重新分配一組新的沒有格式化的塊。當HWM與低HWM之間的位置被填滿時,HWM會繼續往前推進,而低HWM會相應的推進到舊的HWM位置中。以此類推,當數據庫不斷的插入數據,HWM會持續往前推移,而低HWM會尾隨其后,除非重建、或縮小該對象等,否則HWM從不往回退。

 


2 HWM 演示過程(上)原理描述完了,那么現在我們來測試一下,驗證之前我們所描述的部分。我們先從MSSM管理的方式開始:

 

新建一個表,然后存儲分配較多的對象,

 

 

插入較多的數據,

 

 

現在來查詢下全表掃描所花時間,

 

從執行計划來看,該查詢走得時全表掃描,期間產生6278個物理讀,30028個邏輯讀。現在來分析該表, 查看統計信息,

 

從該表的統計信息來看,該表公有15384個塊,其中沒有用到的塊有0個,共有1003089行。現在來測試下delete對hwm的影響,

 

 

從統計信息來看,該表使用的塊還是15384個塊,但是空余塊依然是0個,按道理來說,在delete 后,應該會有空余的塊才對。其中,這里可以看出行數已經變為了0.從這里就可以驗證了之前的說法,即HWM在插入數據時,當現有空間不足而進行空間的擴展時會向上移,但刪除數據時不會往下移。這就會造成RACLE的全表掃描是讀取ORACLE高水位標記下的所有BLOCK,也就是說,不管HWM下的BLOCK現在實際有沒有存放數據,ORACLE都會一一讀取,這樣,在DELETE表后,ORACLE讀了大量的空塊,耗去了大量的時間測試環境沒有show_space 這個過程,現在聲明它:

 

 

  

 

 

那么這個就是HWM所有的BLOCK編號。
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM