什么是全表掃描?全表掃描是一種“萬(wàn)能”的查詢方式。任何對(duì)數(shù)據(jù)的訪問(wèn)需求,都可以通過(guò)全表掃描的方式解決。
一個(gè)多塊讀操作可以使一次I/O能讀取多塊數(shù)據(jù)塊(db_block_multiblock_read_count參數(shù)設(shè)定),而不是只讀取一個(gè)數(shù)據(jù)塊,這極大地減少了I/O總次數(shù),提高了系統(tǒng)的吞吐量。所以利用多塊讀的方法可以十分高效地實(shí)現(xiàn)全表掃描,而且只有在全表掃描的情況下才能使用多塊讀操作。
高水位線,在前面已經(jīng)提到過(guò)了,它標(biāo)識(shí)著數(shù)據(jù)存放的最高點(diǎn)。常見(jiàn)的DELETE操作不會(huì)影響高水位線,只有使用TRUNCATE才會(huì)將高水位置為零。在10g以后的版本,可以通過(guò)shrink命令人工收縮高水位線。一般情況下,全表掃描得到的數(shù)據(jù)庫(kù)將放入緩沖區(qū)LRU鏈表的LRU端,也就是盡快被淘汰出的部分。因?yàn)镺racle認(rèn)為全表掃描得到的數(shù)據(jù)應(yīng)該是臨時(shí)訪問(wèn)的,不應(yīng)長(zhǎng)期占用緩沖區(qū)。在11g之后的版本,Oracle提供了一種新的方式來(lái)處理全表掃描,稱(chēng)為直接路徑讀取。這種方式的獨(dú)特之處在于,數(shù)據(jù)塊將不保存在緩沖區(qū)中,這將大大減少栓鎖的使用,避免對(duì)緩沖區(qū)的沖擊。當(dāng)然這種方式也不是完全沒(méi)有問(wèn)題,因此很多系統(tǒng)從10g升級(jí)到11g的時(shí)候,要特別注意這個(gè)問(wèn)題。在優(yōu)化器選擇掃描方式時(shí)實(shí)際是在尋求一個(gè)平衡,即尋找表掃描和索引掃描的損益分界點(diǎn)。對(duì)于數(shù)據(jù)量比較少的表而言,全表掃描與索引掃描的損益分界點(diǎn)為15%。對(duì)于數(shù)據(jù)量比較多的表而言,全表掃描與索引掃描的損益分界點(diǎn)可能會(huì)小于5%。而對(duì)于存儲(chǔ)著海量數(shù)據(jù)的表而言,全表掃描與索引掃描的損益分界點(diǎn)可能是1%。這里的1%是指即使通過(guò)索引掃描來(lái)從表中讀取1%的數(shù)據(jù),也沒(méi)有直接通過(guò)全表掃描讀取數(shù)據(jù)有效。當(dāng)然上面這些數(shù)字都經(jīng)驗(yàn)值,實(shí)際都以成本為最終考察因素。此外,隨著磁盤(pán)技術(shù)的不斷發(fā)展,特別是閃存技術(shù)的不斷成熟,隨機(jī)讀取的開(kāi)銷(xiāo)減少了很多,換句話說(shuō)索引訪問(wèn)的成本大大下降了,優(yōu)化器會(huì)更加傾向于使用索引掃描方式。全表掃描有哪些使用場(chǎng)景??下面來(lái)看看常見(jiàn)的使用全表掃描的場(chǎng)景:大范圍數(shù)據(jù)讀取的情況:這里的大范圍是個(gè)相對(duì)的概念。一般來(lái)說(shuō),如果訪問(wèn)表中的大部分?jǐn)?shù)據(jù),用表掃描效率較高;如果訪問(wèn)表中的小部分?jǐn)?shù)據(jù),則使用索引訪問(wèn)的效率較高。這里就涉及一個(gè)“損益點(diǎn)”的概念,當(dāng)小于損益點(diǎn)時(shí),索引訪問(wèn)效率高;當(dāng)高于損益點(diǎn)是,表訪問(wèn)效率低。這不是一個(gè)具體比例,常見(jiàn)的經(jīng)驗(yàn)在1%~10%之間。具體還是取決于當(dāng)時(shí)的成本評(píng)估。從小數(shù)據(jù)表中讀取數(shù)據(jù)的情況:如果訪問(wèn)的數(shù)據(jù)規(guī)模較小,則優(yōu)化器傾向于通過(guò)全表掃描的方式訪問(wèn)整個(gè)表。因?yàn)槿頀呙枋褂昧硕鄩K讀的機(jī)制,往往效率是很高的。當(dāng)然,如何界定小表是個(gè)問(wèn)題,后面會(huì)專(zhuān)門(mén)介紹這個(gè)問(wèn)題。按照并行處理方式讀取數(shù)據(jù)的情況:在并行處理的情況下,全表掃描的執(zhí)行速度會(huì)在更大程度上得到提高。使用FULL提示的情況:這個(gè)提示告訴優(yōu)化器,使用全表掃描訪問(wèn)表。?