oracle强制执行计划,OBA技能2-Oracle执行计划顺序表连接
小仙我在學習索引執行行為的時候,有個疑惑?那就是索引是找到一個值就馬上回表,然后再找下一個值,再回表。
比如索引唯一掃描,索引范圍掃描,索引全掃描,索引快速掃描。好像都是要回表。尤其是范圍,不范圍完后,再回表呢?像下面的索引范圍掃描
它不是把INDEX RANGE SCAN 執行完了后 再執行TABLE ACCESS BY INDEX ROWID。而是SCAN 一次,TABLE一次。這樣要反復執行好多次,具體多少次,就看評估值Cardinatily 也就是ROW值。
而表連接是,是結果集的鏈接,換言之就是先把表要的數據找出來后,再跟后面的表關聯。
那什么時候是一次一條數據,什么時候是一次全部數據呢?
這要看兩個方面,
1 是操作方法;
2 是表連接方式;
所謂操作方法 就是上面說的過程。比如說INDEX RANGE SCAN 就是一次返回一條數據,然后執行第二方法,回表找具體數據。有的方法 TABLE ACCESS FULL 全表掃描 它就是一次返回全部符合條件的數據。
表連接方法,常見的有3種分別是
1 NESTED LOOPS
2 HASH JOIN
3 SORT JOIN MERGE JOIN
第一個是嵌套循環關聯,第二個是HASH,第三個SORT 排序。
第一個鏈接 類似于JAVA開發當中的 雙循環
for a (i=1;i++;i<1000)
{
x=y*z;
for b( h=1;h++; h<10)
{
o=x*100;
}
}
先執行X=Y*Z 然后再執行內循環,外循環執行1000次,而內循環要執行10次,外乘以外循環次數 10*1000=10000次。
這圖沒有表現我要說的,我大致畫一下
NESTED LOOPS
TABLE ACCESS BY?INDEX ROWID
INDEX RANGE SCAN
TABLE ACCESS FULL
這樣的執行計劃,NESTED LOOPS 不會等 外循環返回所有數據后去執行內循環 也就是TABLE ACCESS FULL。而是外循環返回1條記錄,就執行一次內循環。而要是外循環是TABLE ACCESS FULL 那就必須等待外循環找完全部數據后才執行內循環。
所以這個NESTED LOOPS 是受到具體執行方法的影響。另外兩種不受影響。
OBA常用術語叫驅動表,它就是指外循環,也就是先被執行的表,一般都是兄長級別的表。另外兩個鏈接也是兄長級別當驅動表。
所以 驅動表 必須是小表,確切地說是返回結果集小的,也就是返回行數最少的。否則向上面的雙循環列子樣,外循環要執行1000次,而內循環執行10次,可內循環被外循環強制執行了1萬次。
你要是說顛倒過來,內循環還是要執行1萬次。可是總體來說是10次+1萬次,而不顛倒過來是1000次+1萬次。多了990次。
另外談個順序,在很多表關聯的SQL中,表與表之間的關聯是單向的,第一個表與第二個表關聯后形成了結果集,保存在PGA的數據。然后再跟第三個表關聯再形成結果集保留在PGA里,接著跟第4個表關聯。
而不是第1個表與第2個表關聯形成結果集1,然后第3個表與第4個表關聯形成結果集2,最后結果集1和結果集2關聯。執行計劃不能被并行執行。
NESTED LOOPS 是兩個表等值關聯,返回少量數據;
HASH JOIN?是兩個表等值關聯,返回大量數據;
HASH JOIN 會選擇返回數據較少的表,把表的SELECT列和JOIN列放入PGA中,然后對另外個表的JOIN列進行HASH取值,然后再跟PGA的驅動表JOIN列進行匹配關聯。
SORT MEGER JOIN 處理兩個表非等值關聯 >,>=,.
先對兩個表根據JOIN列進行排序,選擇數據較小的表作為驅動表,然后跟排好序的另外個表進行匹配。驅動表返回多少行,另外個表就要匹配多少次。
SELECT STATEMENT
MERGE JOIN
TABLE ACCESS BY?INDEX ROWID
INDEX RANGE SCAN
SORT JOIN
TABLE ACCESS FULL
并且兩個表的數據都要放進內存PGA進行匹配,如果內存放不下,就放到磁盤上。
所以這里全部數據提到內存進行匹配, 不受INDEX RANGE SCAN 單行的影響。
CARTESIAN JOIN 笛卡爾 ,這是兩個表沒有連接列造成的。
MEGER JOIN CARTESIAN 也是笛卡爾.
SEMI JOIN 叫做半連接 兩個表關聯只返回1個表的數據,一般都是IN和EXISTS。會出現 MERGE JOIN SEMI,NESTEDLOOPS SEMI的執行方法。都屬于半連接。
ANTI JOIN 是反連接。是NOT IN,NOT EXISTS,執行計劃的方法名字帶有ANTI 就是反連接,表現有 MERGE JOIN ANTI NA;NESTED LOOPS ANTI
FILTER 連接 FILTER這個字眼在執行計劃有兩個意思,1個就是過濾,另外一個是關聯,類似于NESTED LOOPS。主要看FILTER下面是否有兩個以上的兒子(后代)。
為啥不直接用NESTED LOOPS 表示呢?因為FILTER告訴你 其中子查詢沒有被展開。
總結
以上是生活随笔為你收集整理的oracle强制执行计划,OBA技能2-Oracle执行计划顺序表连接的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle数据库升级失败,Oracle
- 下一篇: oracle共享服务器模式的图,Orac