Oracle常見等待事件之direct path read/write
direct path read
- 與直接讀取相關聯的等待事件。當ORACLE將資料塊直接讀入會話的PGA(程式全域性區)中,同時繞過SGA(系統全域性區)。PGA中的資料並不和其他的會話共享。即表明,讀入的這部分資料該會話獨自使用,不放於共享的SGA中。
- 在 排序操作(order by/group by/union/distinct/rollup/合併連線)時,由於PGA中的SORT_AREA_SIZE空間不足,造成需要使用臨時表空間來儲存 中間結果,當從臨時表空間讀入排序結果時,產生direct path read等待事件。
- 使用HASH連線的SQL語句,將不適合位於記憶體中的雜湊分割槽重新整理到臨時表空間中。為了查明匹配SQL謂詞的行,臨時表空間中的雜湊分割槽被讀回到記憶體中(目的是為了查明匹配SQL謂詞的行),ORALCE會話在direct path read等待事件上等待。
- 使 用並行掃描的SQL語句也會影響系統範圍的direct path read等待事件。在並行執行過程中,direct path read等待事件與從屬查詢有關,而與父查詢無關,執行父查詢的會話基本上會在PX Deq:Execute Reply上等待,從屬查詢會產生direct path read等待事件。
- 直接讀取可能按照同步或非同步的方式執行,取決於平臺和初始化引數disk_asynch_io引數的值。使用非同步I/O時,系統範圍的等待的事件的統計可能不準確,會造成誤導作用。
- 該 事件一般不可能顯示為主要的瓶頸,但它實際上也許是就是禍首。由於ORACLE統計等待時間的方式會造成統計的時間量不準確(如:從屬查詢產生的時間無法 進行統計),所以對該事件不應該使用v$session_event檢視中的total_wait或time_waited進行估計,應該使用 v$sesstat檢視中的直接讀取操作次數(physical reads direct)進行判斷:
select a.NAME,
b.SID,
b.VALUE,
round((sysdate - c.LOGON_TIME) * 24) hours_connected
from v$statname a, v$sesstat b, v$session c
where b.SID = c.SID
and a.STATISTIC# = b.STATISTIC#
and b.VALUE > 0
and a.NAME = 'physical reads direct'
order by b.VALUE
- 由direct path read事件產生的原因,我們需要判斷該事件正在讀取什麼段(如:雜湊段、排序段、一般性的資料檔案),由此可判斷產生該事件的原因是什麼,可使用以下語句進行查詢:
SELECT a.event,
a.sid,
c.sql_hash_value hash_vale,
decode(d.ktssosegt,
1,
'SORT',
2,
'HASH',
3,
'DATA',
4,
'INDEX',
5,
'LOB_DATA',
6,
'LOB_INDEX',
NULL) AS segment_type,
b.tablespace_name,
b.file_name
FROM v$session_wait a, dba_data_files b, v$session c, x$ktsso d
WHERE c.saddr = d.ktssoses(+)
AND c.serial# = d.ktssosno(+)
AND d.inst_id(+) = userenv('instance')
AND a.sid = c.sid
AND a.p1 = b.file_id
AND a.event = 'direct path read'
UNION ALL
SELECT a.event,
a.sid,
d.sql_hash_value hash_value,
decode(e.ktssosegt,
1,
'SORT',
2,
'HASH',
3,
'DATA',
4,
'INDEX',
5,
'LOB_DATA',
6,
'LOB_INDEX',
NULL) AS segment_type,
b.tablespace_name,
b.file_name
FROM v$session_wait a,
dba_temp_files b,
v$parameter c,
v$session d,
x$ktsso e
WHERE d.saddr = e.ktssoses(+)
AND d.serial# = e.ktssosno(+)
AND e.inst_id(+) = userenv('instance')
AND a.sid = d.sid
AND b.file_id = a.p1 - c.VALUE
AND c.NAME = 'db_files'
AND a.event = 'direct path read'
注: 如果是從臨時檔案中讀取排序段的會話,則表明SORT_AREA_SIZE或PGA_AGGREGATE_TARGET的設定是不是偏小。如果是從臨時文 件中讀取HASH段的會話,則表明HASH_AREA_SIZE或PAG_AGGREGATE_TARGET的設定是不是偏小。
- 當direct path read等待事件是由於並行查詢造成的(讀取的是一般的資料檔案而非臨時檔案),父SQL語句的HASHVALUE與子SQL語句的HASHVALUE不同,可以透過以下SQL查詢產生子SQL語句的父SQL語句:
SELECT decode(a.qcserial#, NULL, 'PARENT', 'CHILD') stmt_level,
a.sid,
a.serial#,
b.username,
b.osuser,
b.sql_hash_value,
b.sql_address,
a.degree,
a.req_degree
FROM v$px_session a, v$session b
WHERE a.sid = b.sid
ORDER BY a.qcsid, stmt_level DESC
- 初始化引數db_file_direct_io_count用來設定直接讀出和寫入操作設定最大的IO緩衝區大小,因此能影響direct path read的效能,該引數在9i中被隱蔽,並改以位元組數而不是塊數為單位。
>> 使用10046第8層跟蹤直接讀取操作的ORACLE會話,其中P3參數列明塊讀取的數量。
>> 也可使用strace,truss追蹤直接讀取或直接寫入操作的UNIX程式,從生成的TRACE檔案可獲得相應的直接IO大小。
>> 在第1層使用追蹤事件10357,啟動執行直接IO操作的會話的除錯資訊。
- 大量的direct path read等待事件最可能是一個應用程式的問題。
- 引數說明:
事件號:212
事件名:direct path read
引數一:讀取資料檔案的絕對檔案號碼file number
引數二:起始塊號first dba
引數三:要讀取的塊數block cnt
由引數P1與P2推得訪問的資料物件:
select s.segment_name, s.partition_name
from dba_extents s
where
注:
>> 1. 如果是Temp檔案,則表示該會話正在讀取它先前用direct path write操作所建立的臨時段,查明使用的是什麼型別的臨時段,有助於瞭解會話所做的事情。
SELECT DISTINCT decode(t.ktssosegt,
1,'SORT',
2,'HASH',
3,'DATA',
4,'INDEX',
5,'LOB_DATA',
6,'LOB_INDEX',
'UNDEFINED')
FROM sys.x$ktsso t
WHERE t.inst_id = userenv('instance') AND
t.kssoses = AND
t.ktssosno =
>> 2. 如果是資料檔案,則可能是並行查詢從屬操作在工作,透過P1值確定資料檔案的名稱:
select s.NAME from v$datafile s where s.FILE# =
union all
select a.name
from v$tempfile a, v$parameter b
where b.NAME = 'db_files'
and a.FILE# + b.VALUE =
- 等待時間:無超時
- 從PGA寫入資料檔案,一個會話可以釋出多個寫入請求和連續的處理。
- 直接寫入可以按同步或非同步方式執行,取決於平臺和DISK_ASYNC_IO引數的值。
- 通常用於在資料載入(APPEND提示、CTAS-CREATE TABLE AS SELECT)、並行DML操作時寫入到臨時段。
- 在使用非同步IO時,direct path write事件產生的等待時間不準確,所以透過v$sesstat檢視來獲得直接寫入次數來評估該事件的影響情況:
SELECT a.NAME,
b.sid,
b.VALUE,
round((SYSDATE - c.logon_time) * 24) hours_connected
FROM v$statname a, v$sesstat b, v$session c
WHERE a.statistic# = b.statistic#
AND b.sid = c.sid
AND b.VALUE > 0
AND a.NAME = 'physical writes direct'
- 引數說明:
事件號:213
事件名:direct path write
引數一:要寫入的絕對檔案號file number,可發現所進行的操作性質(如:排序/並行操作)
引數二:起始塊號first dba
引數三:塊數block cnt,可發現直接寫入IO的大小
由引數P1與P2推得訪問的資料物件:
select s.segment_name, s.partition_name
from dba_extents s
where
注:
>> 1. 如果是Temp檔案,則表示該會話正在寫入臨時表空間,查明使用臨時段的型別,有助於瞭解會話所做的事情。
SELECT DISTINCT decode(t.ktssosegt,
1,'SORT',
2,'HASH',
3,'DATA',
4,'INDEX',
5,'LOB_DATA',
6,'LOB_INDEX',
'UNDEFINED')
FROM sys.x$ktsso t
WHERE t.inst_id = userenv('instance') AND
t.kssoses = AND
t.ktssosno =
>> 2. 如果是資料檔案,則可能正在執行一項直接路徑載入操作,透過P1值確定資料檔案的名稱:
select s.NAME from v$datafile s where s.FILE# =
union all
select a.name
from v$tempfile a, v$parameter b
where b.NAME = 'db_files'
and a.FILE# + b.VALUE =
- 等待時間:無超
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29119536/viewspace-1436725/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【TUNE_ORACLE】等待事件之IO等待“direct path write”Oracle事件
- 【TUNE_ORACLE】等待事件之IO等待“direct path read”Oracle事件
- 【TUNE_ORACLE】等待事件之IO等待“direct path write temp”Oracle事件
- direct path read/read temp等待事件事件
- ORACLE 常見等待事件Oracle事件
- Oracle常見UNDO等待事件Oracle事件
- 【TUNE_ORACLE】等待事件之IO等待“read by other session”Oracle事件Session
- 【TUNE_ORACLE】等待事件之IO等待“db file parallel write”Oracle事件Parallel
- Oracle direct path read相關隱含引數Oracle
- 【TUNE_ORACLE】等待事件之IO等待“db file scattered read”Oracle事件
- 【TUNE_ORACLE】等待事件之IO等待“db file sequential read”Oracle事件
- 等待事件db file sequential read、db file scattered read和direct read的區別事件
- 【TUNE_ORACLE】等待事件之日誌等待“log file parallel write”Oracle事件Parallel
- [20180905]lob與direct path read.txt
- I/O上的等待事件 —— control file sequential read/control file parallel write事件Parallel
- 【TUNE_ORACLE】等待事件之等待事件類別Oracle事件
- read by other session等待事件Session事件
- db file scattered read等待事件事件
- db file sequential read等待事件事件
- read by other session 等待事件分析Session事件
- 【等待事件】db file sequential read事件
- 【等待事件】db file scattered read事件
- Oracle等待事件之enq: TM – contentionOracle事件ENQ
- oracle等待事件之enq: CF – contentionOracle事件ENQ
- oracle常見異常等待——latch處理思路Oracle
- 常見佇列等待事件處理思路佇列事件
- cell single block physical read等待事件BloC事件
- 常見的wait等待事件及處理(zt)AI事件
- 0316理解db file parallel read等待事件Parallel事件
- oracle等待事件之cursor:pin S wait on XOracle事件AI
- 【TUNE_ORACLE】等待事件之“library cache lock”Oracle事件
- 【TUNE_ORACLE】等待事件之“buffer busy waits”Oracle事件AI
- 【TUNE_ORACLE】等待事件之“library cache pins”Oracle事件
- 0322理解db file parallel read等待事件2Parallel事件
- [20210315]理解db file parallel read等待事件3.txtParallel事件
- [20210315]理解db file parallel read等待事件4.txtParallel事件
- 【TUNE_ORACLE】等待事件之日誌等待“log file sync”Oracle事件
- Oracle面試寶典-等待事件篇Oracle面試事件
- Linux核心同步機制之(五):Read Write spin lock【轉】Linux