Oracle執(zhí)行計(jì)劃的相關(guān)概念:
Rowid:系統(tǒng)給oracle數(shù)據(jù)的每行附加的一個(gè)偽列,包含數(shù)據(jù)表名稱(chēng),數(shù)據(jù)庫(kù)id,存儲(chǔ)數(shù)據(jù)庫(kù)id以及一個(gè)流水號(hào)等信息,rowid在行的生命周期內(nèi)唯一。
Recursive sql:為了執(zhí)行用戶(hù)語(yǔ)句,系統(tǒng)附加執(zhí)行的額外操作語(yǔ)句,譬如對(duì)數(shù)據(jù)字典的維護(hù)等。
Row source(行源):oracle執(zhí)行步驟過(guò)程中,由上一個(gè)操作返回的符合條件的行的集合。
PRedicate(謂詞):where后的限制條件。
Driving table(驅(qū)動(dòng)表):又稱(chēng)為連接的外層表,主要用于嵌套與hash連接中。一般來(lái)說(shuō)是將應(yīng)用限制條件后,返回較少行源的表作為驅(qū)動(dòng)表。在后面的描述中,將driving table稱(chēng)為連接操作的row source 1。
Probed table(被探查表):連接的內(nèi)層表,在我們從driving table得到具體的一行數(shù)據(jù)后,在probed table中尋找符合條件的行,所以該表應(yīng)該為較大的row source,并且對(duì)應(yīng)連接條件的列上應(yīng)該有索引。在后面的描述中,一般將該表稱(chēng)為連接操作的row source 2.
Concatenated index(組合索引):一個(gè)索引如果由多列構(gòu)成,那么就稱(chēng)為組合索引,組合索引的第一列為引導(dǎo)列,只有謂詞中包含引導(dǎo)列時(shí),索引才可用。
可選擇性:表中某列的不同數(shù)值數(shù)量/表的總行數(shù)如果接近于1,則列的可選擇性為高。
Oracle訪(fǎng)問(wèn)數(shù)據(jù)的存取方法:
Full table scans, FTS(全表掃描):通過(guò)設(shè)置db_block_multiblock_read_count可以設(shè)置一次IO能讀取的數(shù)據(jù)塊個(gè)數(shù),從而有效減少全表掃描時(shí)的IO總次數(shù),也就是通過(guò)預(yù)讀機(jī)制將將要訪(fǎng)問(wèn)的數(shù)據(jù)塊預(yù)先讀入內(nèi)存中。只有在全表掃描情況下才能使用多塊讀操作。
Table access by rowed(通過(guò)rowid存取表,rowid lookup):由于rowid中記錄了行存儲(chǔ)的位置,所以這是oracle存取單行數(shù)據(jù)的最快方法。
Index scan(索引掃描index lookup):在索引中,除了存儲(chǔ)每個(gè)索引的值外,索引還存儲(chǔ)具有此值的行對(duì)應(yīng)的rowid值,索引掃描分兩步1,掃描索引得到rowid;2,通過(guò) rowid讀取具體數(shù)據(jù)。每步都是單獨(dú)的一次IO,所以如果數(shù)據(jù)經(jīng)限制條件過(guò)濾后的總量大于原表總行數(shù)的5%-10%,則使用索引掃描效率下降很多。而如果結(jié)果數(shù)據(jù)能夠全部在索引中找到,則可以避免第二步操作,從而加快檢索速度。
根據(jù)索引類(lèi)型與where限制條件的不同,有4種類(lèi)型的索引掃描:
Index unique scan(索引唯一掃描):存在unique或者primary key的情況下,返回單個(gè)rowid數(shù)據(jù)內(nèi)容。
Index range scan(索引范圍掃描):1,在唯一索引上使用了range操作符(>,<,<>,>=,<=,between);2,在組合索引上,只使用部分列進(jìn)行查詢(xún);3,對(duì)非唯一索引上的列進(jìn)行的查詢(xún)。
Index full scan(索引全掃描):需要查詢(xún)的數(shù)據(jù)從索引中可以全部得到。
Index fast full scan(索引快速掃描):與index full scan類(lèi)似,但是這種方式下不對(duì)結(jié)果進(jìn)行排序。
目前為止,典型的連接類(lèi)型有3種:
Sort merge join(SMJ排序-合并連接):首先生產(chǎn)driving table需要的數(shù)據(jù),然后對(duì)這些數(shù)據(jù)按照連接操作關(guān)聯(lián)列進(jìn)行排序;然后生產(chǎn)probed table需要的數(shù)據(jù),然后對(duì)這些數(shù)據(jù)按照與driving table對(duì)應(yīng)的連接操作列進(jìn)行排序;最后兩邊已經(jīng)排序的行被放在一起執(zhí)行合并操作。排序是一個(gè)費(fèi)時(shí)、費(fèi)資源的操作,特別對(duì)于大表。所以smj通常不是一個(gè)特別有效的連接方法,但是如果driving table和probed table都已經(jīng)預(yù)先排序,則這種連接方法的效率也比較高。
Nested loops(NL嵌套循環(huán)):連接過(guò)程就是將driving table和probed table進(jìn)行一次嵌套循環(huán)的過(guò)程。就是用driving table的每一行去匹配probed table 的所有行。Nested loops可以先返回已經(jīng)連接的行,而不必等待所有的連接操作處理完成才返回?cái)?shù)據(jù),這可以實(shí)現(xiàn)快速的響應(yīng)時(shí)間。
Hash join(哈希連接):較小的row source被用來(lái)構(gòu)建hash table與bitmap,第二個(gè)row source用來(lái)被hashed,并與第一個(gè)row source生產(chǎn)的hash table進(jìn)行匹配。以便進(jìn)行進(jìn)一步的連接。當(dāng)被構(gòu)建的hash table與bitmap能被容納在內(nèi)存中時(shí),這種連接方式的效率極高。但需要設(shè)置合適的hash_area_size參數(shù)且只能用于等值連接中。
Cartesian product(笛卡爾積):表的每一行依次與另外一表的所有行匹配。
|
新聞熱點(diǎn)
疑難解答
圖片精選