Oracle數(shù)據(jù)庫(kù)中直方圖對(duì)執(zhí)行計(jì)劃的影響
在Oracle數(shù)據(jù)庫(kù)中,CBO會(huì)默認(rèn)目標(biāo)列的數(shù)據(jù)在其最小值low_value和***值high_value之間均勻分布,并按照均勻分布原則,來(lái)計(jì)算目標(biāo)列施加查詢條件后的可選擇率以及結(jié)果集的cardinality。
如果對(duì)目標(biāo)收集了直方圖,則意味著CBO不再認(rèn)為目標(biāo)列上的數(shù)據(jù)是均勻分布的。CBO會(huì)用該列上的直方圖的統(tǒng)計(jì)信息計(jì)算返回結(jié)果集的cardinality。
驗(yàn)證直方圖對(duì)執(zhí)行計(jì)劃的影響步驟:
1、創(chuàng)建一張表T1
2、往表中插入傾斜度很高的數(shù)據(jù)
3、在B字段上創(chuàng)建索引

4、刪除表中直方圖信息
5、查看直方圖信息
HISTOGRAM:NONE 代表沒有直方圖信息
6、查詢b=2的執(zhí)行計(jì)劃
從執(zhí)行計(jì)劃可以看出:查詢走的是全表掃描,因?yàn)楸鞹1中的數(shù)據(jù)被視為了均勻分布,CBO認(rèn)為走全表比走索引會(huì)更快
7、收集直方圖信息
8、查詢直方圖信息
HISTOGRAM:FREQUENCY 頻率直方圖
可以看出此時(shí)表中已經(jīng)有直方圖信息
9、再次查看b=2的執(zhí)行計(jì)劃
這個(gè)時(shí)候可以看出,執(zhí)行計(jì)劃走了索引,結(jié)果正確!