oracle的java路径,oracle学习----访问路径
什么是訪問路徑?表掃描數據的時候使用了什么方式,這個方式就是訪問路徑
1.全表掃描
TABLE ACCESS FULL 全表掃描,多塊讀,等待事件:db file scattered read
如果是并行全表掃描,等待事件: direct path read
11g 有個新特征,在進行全表掃描的時候也會產生 direct path read
在OLTP環境中要通過 10949 event 禁止該新特征
在OLAP環境中可以不用禁止
如果表上面有大量的行遷鏈接,會是單塊讀 等待事件表現為db file sequential read
如果表上面發生了一個大事物,全表掃描會從UNDO讀取前鏡像,也會是單塊讀
HINT: FULL(表名/別名)
等待事件:db file scattered read 在SGA中
等待事件:direct path read 在PGA中
禁用oracle11g的新特性,有兩種方法
a.event 10949設置后,可以禁用direct path read。
開啟
SQL> ALTER session SET EVENTS '10949 TRACE NAME CONTEXT FOREVER';
禁用
SQL> ALTER session SET EVENTS '10949 TRACE NAME CONTEXT off';
b.通過設置隱含參數_serial_direct_read來設置是否啟用direct path read
禁用
SQL>alter session set "_serial_direct_read"=never;
開啟(默認)
SQL> alter session set "_serial_direct_read"=auto;
2.索引唯一掃描
INDEX UNIQUE SCAN 索引唯一掃描。單塊讀 只可能發生在unique index/primary key 等值查找
等待事件:db file sequential read 但是你幾乎看不到,因為只讀一條數據
HINT 無需指定,有索引會自動走INDEX UNIQUE SCAN
索引唯一掃描在不回表的時候訪問幾個索引塊?
索引高度這么多個塊。
select * from t where id=10;返回一行數據,要掃描多少個塊?
索引高度+1(在不發生行遷移連接的情況下)
索引高度+2(發生行遷移連接的情況)
3.索引范圍掃描
INDEX RANGE SCAN 索引范圍掃描。單塊讀 發生在對unique index/primary key 進行范圍查找,
對non-unique index進行等值查找,范圍查找
等待事件:db file sequential read 如果你監控某個SQL出現大量該等待事件,
有可能執行計劃就有問題
HINT: INDEX(表名/別名 索引名)
在索引唯一掃描中很難捕獲等待事件,因為只返回一條數據,單塊讀的時間為12ms,索引唯一掃描掃描索引高度這么多個塊,返回一條數據
的時間小于1s,1s這個閾值是記錄等待時間的要求,所以不會記錄等待事件,這個閾值是ash的響應時間,什么是ash呢?
ASH以V$SESSION為基礎,每秒采樣一次,記錄活動會話等待的事件。不活動的會話不會采樣,采樣工作由新引入的后臺進程MMNL來完成。
那么在索引范圍掃描中怎么能看見db file sequential read等待事件呢?
12ms*100等于1.2s超過了ash的閾值,就可以記錄等待事件
100單塊讀,每個塊包含1000條數據,就是10w條數據,也就是說通過索引范圍掃描返回超過10w條數據時就會出現等待時間。
監控一個sql的等待事件
select (sysdate-logon_time)*24*60 minutes,username,machine,program,action,
status,inst_id,sid,serial#,event,p1,p2,p3,
row_wait_obj# obj#,row_wait_file# file#,row_wait_block# block#,sql_id,sql_child_number from gv$session where sql_id='XXX';
4.索引跳躍掃描
INDEX SKIP SCAN 索引跳躍掃描。單塊讀 只可能發生在組合索引上,引導列(組合索引第一列)沒有包
含在where條件中,并且引導列基數很低。INDEX SKIP SCAN
一般來說只會返回少量數據,如果返回大量數據,說明該執
行計劃可能有問題,也就是說索引建立不對。
等待事件:db file sequential read
HINT: INDEX_SS(表名/別名 索引名)
5.索引全掃描
INDEX FULL SCAN 索引全掃描。單塊讀 。它掃描的結果是有序的,因為索引是有序的。它通常發生在
下面幾種情況(注意:即使SQL滿足以下情況 不一定會走索引全掃描)
a. SQL語句有order by選項,并且order by 的列都包含
在索引中,并且order by 后列順序必須和索引列順序一致。
b. 在進行SORT MERGE JOIN的時候,如果要查詢的列通過索
引就能獲得,那就不必進行全表掃描了,另外也避免了排
序,因為INDEX FULL SCAN返回的結果已經排序。
c. 當查詢中有GROUP BY,并且GROUP BY 的列包含在索引中。
等待事件:db file sequential read
HINT: INDEX(表名/別名 索引名)
索引全表掃描會掃描blevel+leaf個塊
6.索引快速掃描
INDEX FAST FULL SCAN 索引快速全掃描。多塊讀 。當SQL要查詢的數據能夠完全從索引中獲得,那么
Oracle就不會走全表掃描了,就會走索引快速全
掃描。索引快速全掃描類似全表掃描,它可以多塊
讀,并且可以并行掃描。
等待事件:db file scattered read
HINT:INDEX_FFS(表名/別名 索引名)
總結
以上是生活随笔為你收集整理的oracle的java路径,oracle学习----访问路径的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 真的有可以赚钱的游戏吗 游戏搬砖其
- 下一篇: 了解创业板,才能增加获利的机会