--概要
主要总结一下Oracle是如何收集统计信息的是如何选择的,有一些好的Ref可以看看
--基本概念
首先要明确系统的自动收集机制 如果insert update delete truncate发生的数据量变化大于总记录的10%系统就会自动重新统计信息.如果统计信息为null时系统蚕食OPTOMIZER_DYNAMIC_SAMPLING 能够控制如何进行收集. Hint是 /*+ dynamic_sampling (table integer) */ 详见TOP第五章1.3节
以下为收集后用来存储统计信息的视图:
user_tab_statistics --统计之后用来显示表的统计信息 3.1.2
user_tables --查看schames下所有表的统计信息
execdbms_stats.gather_schema_stats(ownname=>user, estimate_percent=>0.5);SELECTtable_name, sample_size, num_rows,round(sample_size/num_rows*100,1)AS"%"FROMuser_tablesWHEREnum_rows>0ORDERBYtable_name;
TABLE_NAME SAMPLE_SIZE NUM_ROWS%------------------------------ ----------- -------- ----------BIG_TABLE12435######5COLOCATED5087984845.2T10011001100
user_tab_col_statistics --统计之后用来显示列的统计信息 3.1.3
user_tab_histograms --统计之后用来显示直方图的统计信息 3.1.4
user_ind_statistics --统计之后用来显示索引的统计信息 3.1.5
user_indexes
Oracle的CBO的执行计划选择是基于柱状图(Histogram)的,柱状图用于记录表中的列的分布情况,有了柱状图CBO就可以选择最优的执行计划,否则就需要根据索引的选择性(selectivity)来判断是否使用该索引. 以下是建立测试环境