oracle中创建事件的作用,Oracle常见等待事件说明(二)-direct path read/write
與直接讀取相關聯的等待事件。當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)進行判斷:
selecta.NAME,b.SID,b.VALUE,round((sysdate- c.LOGON_TIME) *24) hours_connectedfromv$statname a, v$sesstat b, v$session cwhereb.SID = c.SIDanda.STATISTIC# = b.STATISTIC#andb.VALUE>0anda.NAME='physical reads direct'orderbyb.VALUE由direct path read事件產生的原因,我們需要判斷該事件正在讀取什么段(如:散列段、排序段、一般性的數據文件),由此可判斷產生該事件的原因是什么,可使用以下語句進行查詢:
SELECTa.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)ASsegment_type,b.tablespace_name,b.file_nameFROMv$session_wait a, dba_data_files b, v$session c, x$ktsso dWHEREc.saddr = d.ktssoses(+)ANDc.serial# = d.ktssosno(+)ANDd.inst_id(+) = userenv('instance')ANDa.sid = c.sidANDa.p1 = b.file_idANDa.event ='direct path read'UNIONALLSELECTa.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)ASsegment_type,b.tablespace_name,b.file_nameFROMv$session_wait a,dba_temp_files b,v$parameter ? ?c,v$session ? ? ?d,x$ktsso ? ? ? ?eWHEREd.saddr = e.ktssoses(+)ANDd.serial# = e.ktssosno(+)ANDe.inst_id(+) = userenv('instance')ANDa.sid = d.sidANDb.file_id = a.p1 - c.VALUEANDc.NAME='db_files'ANDa.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語句:
SELECTdecode(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_degreeFROMv$px_session a, v$session bWHEREa.sid = b.sidORDERBYa.qcsid, stmt_levelDESC初始化參數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推得訪問的數據對象:
selects.segment_name, s.partition_namefromdba_extents swherebetweens.block_idand(s.block_id + s.blocks -1)ands.file_id =
注:
>> 1. 如果是Temp文件,則表示該會話正在讀取它先前用direct path write操作所創建的臨時段,查明使用的是什么類型的臨時段,有助于了解會話所做的事情。
SELECTDISTINCTdecode(t.ktssosegt,1,'SORT',2,'HASH',3,'DATA',4,'INDEX',5,'LOB_DATA',6,'LOB_INDEX','UNDEFINED')FROMsys.x$ktsso tWHEREt.inst_id = userenv('instance')ANDt.kssoses =ANDt.ktssosno =
>> 2. 如果是數據文件,則可能是并行查詢從屬操作在工作,通過P1值確定數據文件的名稱:
selects.NAMEfromv$datafile swheres.FILE# =unionallselecta.namefromv$tempfile a, v$parameter bwhereb.NAME= 'db_files'anda.FILE# + b.VALUE=
等待時間:無超時
總結
以上是生活随笔為你收集整理的oracle中创建事件的作用,Oracle常见等待事件说明(二)-direct path read/write的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vue基础语法01
- 下一篇: matlab 多项式拟合EXCEL中复杂