通過等待事件學習Oracle 體系結構:(二)談談PGA和臨時表空間

darren__chan發表於2015-11-19

三、通過direct path read/write temp 談談PGA和臨時表空間:


官方描述:

When a process is writing buffers directly from PGA (as opposed to the DBWR writing them from the buffer cache), the process waits on this event for the write call to complete. Operations that could perform direct path writes include sorts on disk, parallel DML operations, direct-path INSERTs, parallel create table as select, and some LOB operations.

Like direct path reads, the number of waits is not the same as number of write calls issued if the I/O subsystem supports asynchronous writes. The session waits if it has processed all buffers in the PGA and cannot continue work until an I/O request completes.

    當一個程式正從PGA直接寫入緩衝到磁碟中,相對於DBWR程式從buffer cache 寫入,這個程式要等待這個寫入呼叫的事件完成。這些能執行直接路徑寫入的操作包含了,磁碟排序,並行DML操作,直接路徑插入,並行create table as select 以及一些LOB相關的操作。


像直接路徑讀一樣,如果I / O子系統支援非同步寫入,則等待的數量不等於 寫入呼叫發起的數量。會話會等待是否已經處理了PGA中所有的緩衝區,除非I / O請求完成,否則將不能繼續工作。


    其實direct path write temp是oracle 資料塊 直接被server process 直接從PGA寫入到臨時檔案的一種直接路徑訪問的過程。

direct path read temp這是便直接從磁碟中讀取資料塊到PGA中的一個過程。

    在以上的兩種過程中發生的等待時,oracle便會產生direct path read tempdirect path write temp等待事件。

    以上的官方說明也說了,產生這些等待的操作,包括了磁碟排序,並行DML操作,直接路徑插入,並行create table as select 以及一些LOB相關的操作這些,這也是一個I/O的過程。

    那麼為什麼磁碟排序和並行等與PGA有關係呢?臨時表空間檔案,pga,buffer cache這三者在Oracle的執行中又是怎樣的關係呢?

我想我們是該先了解清楚了。

    PGA是什麼?

    是否還記得一.ORACLE 體系結構簡述中提到的server process,PGA(Program Global Area程式全域性區)便是資料庫在為一個客戶端啟動一個server process 時分配的一個非共享的記憶體區域,這個區域是用來存放私有資料和共享資訊等的,一個PGA也只能被擁有它的那個服務程式所訪問,只有這個程式中的Oracle程式碼才能讀寫它。

    PGA中有什麼?

    PGA由兩組區域組成:固定PGA和可變PGA,固定PGA的大小時固定的,包含了大量原子變數、小的資料結構和指向可變PGA的指標。可變PGA包括私有SQL區(私有SQL區包含了繫結變數值和執行時期記憶體結構資訊等資料), 遊標和SQL區和會話記憶體(一段用於儲存會話變數(如登入資訊)和其他預會話相關資訊的記憶體)。

    oracle 提供了兩種模式:專用伺服器連線模式和共享伺服器連線模式。

     專用伺服器連線模式下,UGA在PGA中分配。共享伺服器連線模式,UGA在SGA中的Shared Pool或Large Pool中分配。

     再看一下:

    PGA(Process Global Area),即程式全域性區,一個程式的專用的記憶體區。(可以理解成面向程式)

    UGA(User Global Area),即使用者全域性區,由使用者會話資料、遊標狀態和索引區組成。(相當於面向會話,專用伺服器模式下一個PGA             對一個UGA,共享伺服器模式下一個PGA可能對應多個UGA。)

     CGA  (CALL Global Area),即呼叫全域性區,如排序區,HASH JOIN區,點陣圖合併區等。(存在是瞬間的。它只存在於一個呼叫過程中,是PGA的subheap)。


    回到前面的 一條sql :select first_name,salary from HR.EMPLOYEES where first_name='Shelli';  此時,我想查詢公司所有員工的工資,並按高到低順序排序,於是我會這樣寫,select first_name,salary from HR.EMPLOYEES order by salary desc;

在最開始資料庫獲取了first_name='Shelli' 的資料在 資料庫緩衝區中,但此時,我們想查詢所有人的工資,於是,Oracle從磁碟中獲取所有人的工資資料到資料庫緩衝區中,在正常情況下,Oracle便可以把取到的資料返回給你,但別忘了,我們要的是工資按高到低順序排序,這個排序便是在PGA中完成了,更確切的說,是在UGA 的sort_area中。

    疑問:如果查詢的表特別大,是否pga便無限量容納這些排序的結果? 答案否。

    再看看,我們現在學習的等待事件是什麼?

    direct path read temp和direct path write temp,其實這是一個I/O相關的等待事件,當資料庫出現大量的排序操作時,pga無足夠空間存放這些資料時,便會通過讀寫磁碟來分擔,而這個讀寫的物件便是臨時表空間。


說說臨時表空間:

    臨時表空間用來管理資料庫排序操作以及用於儲存臨時表、中間排序結果等臨時物件,當ORACLE裡需要用到SORT的時候,並且當PGA中sort_area_size大小不夠時,將會把資料放入臨時表空間裡進行排序。像資料庫中一些操作: CREATE INDEX、 ANALYZE、SELECT DISTINCT、ORDER BY、GROUP BY、 UNION ALL、 INTERSECT、MINUS、SORT-MERGE JOINS、HASH JOIN等都可能會用到臨時表空間。當操作完成後,系統會自動清理臨時表空間中的臨時物件,自動釋放臨時段。這裡的釋放只是標記為空閒、可以重用,其實實際佔用的磁碟空間並沒有真正釋放。這也是臨時表空間有時會不斷增大的原因。(摘錄)

    

    而大家應該都知道,在計算機硬體中,磁碟的讀寫效率是遠遠不及記憶體的,在以上的過程,在Oracle 在 頻繁的讀寫臨時表空間檔案時,便容易產生了等待,這便是direct path read temp和direct path write temp等。

    不僅僅是排序,還有其他幾類操作也會引起direct path read temp和direct path write temp等待。

    

          Causes for the direct path read temp wait

To reduce the direct path read wait event and direct path read temp wait event:

High disk sorts – If the sorts are too large to fit in memory and get sent to disk, this wait can occur.

Parallel slaves – Parallel slaves are used for scanning data or parallel DML may be used to create and populate objects. These may lead to direct path read wait and direct path write wait respectively.

Direct path loads – The direct path API is used to pass data to the load engine in the server and can cause the related direct path write wait.

Server process ahead of I/O – The server process is processing buffers faster than the I/O system can return the buffers. This can indicate an overloaded I/O system

Data Warehouse – Sorts in a data warehouse environment may always go to disk leading to high waits on direct path read temp and/or direct path write temp.

Hash area size – For query plans that call for a hash join, excessive I/O could result from having HASH_AREA_SIZE too small.



   1.大量的磁碟排序操作,order by, group by, union, distinct, rollup,max() 無法在PGA中完成排序,

      需要利用temp表空間進行排序,當從臨時表空間中讀取排序結果時,會產生direct path read.

  2. SQL語句的並行處理

  3. 直接路徑載入。

    4.服務程式先於I/O,伺服器程式處理buffer的速度快於I/O返回buffer的速度。

  5. 資料倉儲,經常大資料量的排序也會引起等待。

    6.大量的Hash Join操作,利用temp表空間儲存hash區


面對這種等待事件,如何優化:
(摘錄)
1、應用程式層
檢查需要排序的sql語句是否已經最優化。不必要的排序操作會導致CPU浪費、PGA區域浪費、磁碟I/O浪費。從UNION和UNION ALL的效能差異上可以得知,只靠減少不必要的排序操作,也能解決許多問題。
2、oracle記憶體層
在程式上分配的工作區大小內一次性實現的排序稱為One pass sort。與此相反的情況稱為Multi pass sort。發生Multi pass sort時,排序工作過程中將排序結果讀寫到排序段(sort segment)區域,因此發生direct path read temp、direct path write temp等待。如果該等待大量發生,就可以適當提高pga_aggregate_target值,以此消除問題。
在Oracle 目前的版本都是使用自動 pga管理,因此針對pga_aggregate_target調整很重要,在pga是手動管理的年代,有三個引數對PGA影響最大。
SORT_AREA_SIZE:排序工作區,用於程式排序時存放排序資料的記憶體區域,它屬於PGA
SORT_AREA_RETAINED_SIZE:排序完成後用於儲存已排序資料的記憶體總量,它屬於UGA
HASH_AREA_SIZE:儲存雜湊列表所用的記憶體量。
3、系統層
提升I/O效能。


==============================================================================================

 《通過等待事件學習Oracle 體系結構》繫個人日常學習筆記積累, 存在偏差的描述,請指出,相互學習。
==============================================================================================    


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29863023/viewspace-1841242/,如需轉載,請註明出處,否則將追究法律責任。

相關文章