今天來詳細說說oracle的執行計畫,所謂執行計畫,就是在執行某條sql之前作出的執行方案,或者說是執行路徑。oracle的優化器模式有兩大類,乙個是基於規則的(rbo:
rule based optimizer
),乙個是基於代價的優化器(cbo:cost
based optimizer):
又可細分為:
choose, rule ,first_rows ,all_rows
choose方式表示,如果查詢的表存在統計資訊,則基於代價來執行(first_rows),否則使用基於規則的方式來執行這條sql,即rule。(ps:在10g中已經廢除了rbo)
先來理解幾個概念:(名詞解釋來自網路加上自己的理解)
行源(row source):返回符合條件的行的集合,或者多表關聯,或者是單錶查詢返回的行資料。
謂詞(predicate):說的直白些,就是查詢中的where條件
驅動表(driving table):又稱外層表,概念用於巢狀表與hash連線中,一般指的是經過謂詞條件過濾之後返回的行源較少的表。
被探查表(probed table
組合索引(c
oncatenated index
):多列組成的索引,一般需要有先導列索引才能生效。如emp表的索引有create index ... on emp(col1,col2,col3);
那麼先導列就是col1,要使用索引,需含有欄位col1,如where col1=..或where col1=.. and col2=...而,where col2=..則不走索引。
幾種訪問資料的方法:
1.全表掃瞄(
full table scan
):顧名思義,讀取表中所有的行,可以通過設定資料庫的
db_block_multiblock_read_count引數來設定多塊讀取以提高全表掃瞄的效率,一般查詢的資料超過表的5%-10%時,可以使用全表掃瞄。
2.rowid讀取資料(
table access by rowid )
3.索引讀取(index scan):索引已經排序過了的,所以如果通過索引查詢的值還進行了排序,這裡並不需要再次進行排序,提高了效率。索引掃瞄還分為:index unique scan,index range scan,index full scan,index fast full scan
表之間的連線經常涉及到以下幾種型別:
巢狀迴圈連線(外層表作為驅動,每一行對內層表進行高效訪問,所以一般驅動表的行源較小,內層表較大,但是可以通過索引高效訪問)
排序-合併連線(對關聯的兩個行源先分別根據連線列進行排序,然後再進行連線。因為需要排序所以這種方法一般都很浪費資源,但是如果需要連線的行源已經排完序了,那麼這種方法效率還是挺高的。用於非等值連線,關聯列都有索引的情況,)
雜湊連線(兩個較大的行源進行連線時,能夠有較好的效率,但是只可用於等值連線)
ocacle 執行計畫 Oracle執行計畫
一 什麼是oracle執行計畫?執行計畫是一條查詢語句在oracle中的執行過程或訪問路徑的描述 二 怎樣檢視oracle執行計畫?因為我一直用的plsql遠端連線的公司資料庫,所以這裡以plsql為例 配置執行計畫需要顯示的項 工具 首選項 視窗型別 計畫視窗 根據需要配置要顯示在執行計畫中的列 ...
oracle執行計畫
對於一條sql語句,oracle是如何執行的,首先必須發揮你的想象,你認為它會如何去實現。是等子查詢結果全出來之後,還是子查詢每齣乙個結果,都觸發父節點去執行。沒錯,單純的 資料瀏覽當然不用等子查詢全部結束後,但涉及到排序,求和等需求的時候,就必須要等了,你可以幫它想想,全部資料不出來的話,何談去排...
Oracle 執行計畫
總結 sqlplus 下的自動顯示功能,在看執行計畫中其語句還是會被執行的。尤其在執行update delete語句時請千萬注意,oracle是先執行指令碼同時顯示執行計畫的,即使使用set autotrace on traceonly explain 這個時候推薦使用explain plan fo...