全表掃描是Oracle訪問數(shù)據(jù)庫表是較為常見的訪問方式之一。很多朋友一看到SQL語句執(zhí)行計(jì)劃中的全表掃描,就要考慮對其進(jìn)行修理一番。全表掃描的存在青责,的確存在可能優(yōu)化的余地。但事實(shí)上很多時(shí)候全表掃描也并非是最低效的取具,完全要看不同的情形與場合脖隶,任一方式都是有利有弊的,也就是具體情況要具體分析暇检。本文描述了什么是全表掃描以及何時(shí)發(fā)生全表掃描产阱,何時(shí)全表掃描才低效。
1占哟、什么是全表掃描?
全表掃描就是掃表表中所有的行心墅,實(shí)際上是掃描表中所有的數(shù)據(jù)塊,因?yàn)镺racle中最小的存儲單位是Oracle block榨乎。
掃描所有的數(shù)據(jù)塊就包括高水位線以內(nèi)的數(shù)據(jù)塊,即使是空數(shù)據(jù)塊在沒有被釋放的情形下也會被掃描而導(dǎo)致I/O增加瘫筐。
在全表掃描期間蜜暑,通常情況下,表上這些相鄰的數(shù)據(jù)塊被按順序(sequentially)的方式訪問以使得一次I/O可以讀取多個(gè)數(shù)據(jù)塊策肝。
一次讀取更多的數(shù)據(jù)塊有助于全表掃描使用更少的I/O肛捍,對于可讀取的數(shù)據(jù)塊被限制于參數(shù)DB_FILE_MULTIBLOCK_READ_COUNT隐绵。
2、何時(shí)發(fā)生全表掃描?
a拙毫、表上的索引失效或無法被使用的情形(如對謂詞使用函數(shù)依许、計(jì)算、NULL值缀蹄、不等運(yùn)算符峭跳、類型轉(zhuǎn)換)
b、查詢條件返回了整個(gè)表的大部分?jǐn)?shù)據(jù)
c缺前、使用了并行方式訪問表
d蛀醉、使用full 提示
e、統(tǒng)計(jì)信息缺失時(shí)使得Oracle認(rèn)為全表掃描比索引掃描更高效
f衅码、表上的數(shù)據(jù)塊小于DB_FILE_MULTIBLOCK_READ_COUNT值的情形可能產(chǎn)生全表掃描