对象统计信息描述数据是如何在数据库中存储的。统计信息是优化器的代价计算的依据,可以帮助优化器较精确地估算成本,对执行计划的选择起着至关重要的作用。
统计信息收集
1.收集表的统计信息
call dbms_stats.gather_table_stats(OWNNAME='TEST',TABNAME='student',DEGREE=3,ESTIMATE_PERCENT=50);
2.收集索引的统计信息
call dbms_stats.gather_index_stats(OWNNAME='TEST',INDNAME='I_ID',DEGREE=3,ESTIMATE_PERCENT=50);
3.收集模式下对象的统计信息
call dbms_stats.gather_schema_stats(OWNNAME='TEST',DEGREE=3,ESTIMATE_PERCENT=50);
统计信息查看
1.查看表的统计信息
call dbms_stats.table_stats_show(OWNNAME='TEST',TABNAME='student');
2.查看索引的统计信息
call dbms_stats.index_stats_show(OWNNAME='TEST',INDEXNAME='I_ID');
3.查看列统计信息
call dbms_stats.column_stats_show(OWNNAME='TEST',TABNAME='student',COLNAME='name');
统计信息更新
1.更新已有的统计信息
call dbms_stats. update_all_stats();
统计信息删除
1.删除列的统计信息
call dbms_stats.delete_column_stats(OWNNAME='TEST',TABNAME='student',COLNAME='name');
2.删除与表统计的相关对象的信息
call dbms_stats.delete_table_stats(OWNNAME='TEST',TABNAME='student');
3.删除模式下的对象统计信息
call dbms_stats.delete_schema_stats(OWNNAME='TEST');
select * from "v$dm_ini" where "para_name" like 'SEl%';
可以看到没有统计信息,对于列名='常量',选择率固定为SEL_RATE_EQU,值为2.5% (可通过执行计划的SLCT2操作符的结果集看出,该结果集为总数据数*0.025)
其他谓词一律为SEL_RATE_SINGLE, 缺省为5%(比喻>、<等)
更新表统计信息后:
该结果集明显变少
或者使用下面的语句
SP_CREATE_SYSTEM_PACKAGES (1,'DBMS_STATS'); --如果还未创建过系统包。请先调用系统过程创建系统包
dbms_stats.table_stats_show('SYSDBA','CF'); --查看表sysdba.cf的统计信息
dbms_stats.column_stats_show('SYSDBA','CF','FDMCHXM'); --查看表某列的统计信息
dbms_stats.index_stats_show('SYSDBA','I_CF_FDMCHXM'); --查看模式下索引的统计信息
call sp_db_stat_init(); --库级别的统计信息收集(包括所有用户、模式的表及表上索引的信息)
call sp_tab_index_stat_init('SYSDBA','CF');--收集CF表下的所有索引的统计信息,上面新建索引没有收集统计信息时不走索引,收集完该索引或者该索引的列后,就走索引了
call sp_col_stat_init('SYSDBA','CF','FDMCHXM');--收集表中某一列的统计信息
call sp_tab_col_stat_init('SYSDBA','CF');--收集某张表上所有列的统计信息
call sp_stat_on_table_cols('SYSDBA','CF',90);--收集某张表上所有列的统计信息,并指定采样率,采样率范围0-100
call sp_tab_stat_init('SYSDBA','CF'); --收集指定的表的统计信息
call sp_index_stat_init('SYSDBA','I_CF_FDMCHXM'); --收集指定的索引的统计信息
call sp_index_stat_deinit('SYSDBA','I_CF_FDMCHXM'); --删除模式下指定的索引统计信息
call sp_col_stat_deinit('SYSDBA','CF','FDMCHXM'); --删除指定列的统计信息
call sp_tab_col_stat_deinit('SYSDBA','CF'); --删除指定表上所有的统计信息
call sp_tab_stat_deinit('SYSDBA','CF'); --删除指定表的统计信息