帶你輕鬆接觸Oracle執行計劃的相關概念
Rowid:系統給oracle資料的每行附加的一個偽列,包含資料表名稱,資料庫id,儲存資料庫id以及一個流水號等資訊,rowid在行的生命週期內唯一。
Recursive sql:為了執行使用者語句,系統附加執行的額外操作語句,譬如對資料字典的維護等。
Row source(行源):oracle執行步驟過程中,由上一個操作返回的符合條件的行的集合。
Predicate(謂詞):where後的限制條件。
Driving table(驅動表):又稱為連線的外層表,主要用於巢狀與hash連線中。一般來說是將應用限制條件後,返回較少行源的表作為驅動表。在後面的描述中,將driving table稱為連線操作的row source 1。
Probed table(被探查表):連線的內層表,在我們從driving table得到具體的一行資料後,在probed table中尋找符合條件的行,所以該表應該為較大的row source,並且對應連線條件的列上應該有索引。在後面的描述中,一般將該表稱為連線操作的row source 2.
Concatenated index(組合索引):一個索引如果由多列構成,那麼就稱為組合索引,組合索引的第一列為引導列,只有謂詞中包含引導列時,索引才可用。
可選擇性:表中某列的不同數值數量/表的總行數如果接近於1,則列的可選擇性為高。
Oracle訪問資料的存取方法:
Full table scans, FTS(全表掃描):通過設定db_block_multiblock_read_count可以設定一次IO能讀取的資料塊個數,從而有效減少全表掃描時的IO總次數,也就是通過預讀機制將將要訪問的資料塊預先讀入記憶體中。只有在全表掃描情況下才能使用多塊讀操作。
Table access by rowed(通過rowid存取表,rowid lookup):由於rowid中記錄了行儲存的位置,所以這是oracle存取單行資料的最快方法。
Index scan(索引掃描index lookup):在索引中,除了儲存每個索引的值外,索引還儲存具有此值的行對應的rowid值,索引掃描分兩步1,掃描索引得到rowid;2,通過 rowid讀取具體資料。每步都是單獨的一次IO,所以如果資料經限制條件過濾後的總量大於原表總行數的5%-10%,則使用索引掃描效率下降很多。而如果結果資料能夠全部在索引中找到,則可以避免第二步操作,從而加快檢索速度。
根據索引型別與where限制條件的不同,有4種型別的索引掃描:
Index unique scan(索引唯一掃描):存在unique或者primary key的情況下,返回單個rowid資料內容。
Index range scan(索引範圍掃描):1,在唯一索引上使用了range操作符(>,,>=,<=,between);2,在組合索引上,只使用部分列進行查詢;3,對非唯一索引上的列進行的查詢。
Index full scan(索引全掃描):需要查詢的資料從索引中可以全部得到。
Index fast full scan(索引快速掃描):與index full scan類似,但是這種方式下不對結果進行排序。
目前為止,典型的連線型別有3種:
Sort merge join(SMJ排序-合併連線):首先生產driving table需要的資料,然後對這些資料按照連線操作關聯列進行排序;然後生產probed table需要的資料,然後對這些資料按照與driving table對應的連線操作列進行排序;最後兩邊已經排序的行被放在一起執行合併操作。排序是一個費時、費資源的操作,特別對於大表。所以smj通常不是一個特別有效的連線方法,但是如果driving table和probed table都已經預先排序,則這種連線方法的效率也比較高。
Nested loops(NL巢狀迴圈):連線過程就是將driving table和probed table進行一次巢狀迴圈的過程。就是用driving table的每一行去匹配probed table 的所有行。Nested loops可以先返回已經連線的行,而不必等待所有的連線操作處理完成才返回資料,這可以實現快速的響應時間。
Hash join(雜湊連線):較小的row source被用來構建hash table與bitmap,第二個row source用來被hashed,並與第一個row source生產的hash table進行匹配。以便進行進一步的連線。當被構建的hash table與bitmap能被容納在記憶體中時,這種連線方式的效率極高。但需要設定合適的hash_area_size引數且只能用於等值連線中。
Cartesian product(笛卡爾積):表的每一行依次與另外一表的所有行匹配。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1384/viewspace-238998/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- (轉)執行計劃相關概念
- oracle執行計劃相關Oracle
- 輕鬆接觸Oracle資料庫中的Kill sessionOracle資料庫Session
- 帶你輕鬆接觸”DB2″資料庫中的資料型別DB2資料庫資料型別
- 【Oracle】-【索引-HINT,執行計劃】-帶HINT的索引執行計劃Oracle索引
- 帶你看懂MySQL執行計劃MySql
- Explain For理論執行計劃相關AI
- ORACLE執行計劃的一些基本概念Oracle
- 【sql調優之執行計劃】in相關的operationSQL
- Java 多執行緒 相關概念Java執行緒
- [譯]輕鬆十步走,帶你領略JS呼叫棧的執行原理JS
- 不等號影響執行計劃的相關實驗
- 帶你輕鬆瞭解C# Lock 關鍵字C#
- ORACLE關於執行計劃的簡要分析Oracle
- ORACLE執行計劃Oracle
- 四個知識點帶你輕鬆掌握執行緒飢餓利器 StampedLock執行緒
- XML相關知識全接觸(一)XML
- 【執行計劃】Oracle獲取執行計劃的幾種方法Oracle
- Oracle DB 相關常用sql彙總7【手工繫結sql執行計劃】OracleSQL
- Oracle資料庫關於SQL的執行計劃Oracle資料庫SQL
- 新霸哥帶你輕鬆玩轉Oracle資料庫Oracle資料庫
- oracle 固定執行計劃Oracle
- Oracle sql執行計劃OracleSQL
- oracle sqlprofile 固定執行計劃,並遷移執行計劃OracleSQL
- pg中與執行計劃相關的配置(ENABLE_*)引數
- 看懂Oracle中的執行計劃Oracle
- ORACLE執行計劃的介紹Oracle
- ORACLE執行計劃的檢視Oracle
- oracle執行計劃的使用(EXPLAIN)OracleAI
- Oracle資料庫關於SQL的執行計劃(轉)Oracle資料庫SQL
- C#多執行緒學習(一) 多執行緒的相關概念C#執行緒
- C# 多執行緒學習(1) :多執行緒的相關概念C#執行緒
- Oracle中檢視已執行sql的執行計劃OracleSQL
- Oracle執行計劃詳解Oracle
- oracle固定執行計劃--sqlprofileOracleSQL
- Oracle 索引和執行計劃Oracle索引
- Oracle閱讀執行計劃Oracle
- oracle 執行計劃變更Oracle