修改oracle 的统计信息

来源:这里教程网 时间:2026-03-03 18:06:46 作者:

修改表/索引的统计信息   数据库在重新分析后,统计信息可能会影响到现有的执行计划, 影响到代码的执行效率。 还有一个情况是, 我们需要oracle 在解析sql的执行计划的时候,能够按照我们的意愿走某个索引。  影响oracle 执行计划的数据主要来自于表和索引的统计信息,  我们可以手工修改这些统计值 , 下面的脚本是一个修改索引统计信息的脚本,  DECLARE M_NUMROWS NUMBER;   ---纪录的行数    M_NUMLBLKS NUMBER;  --- 数据块的数目 M_NUMDIST NUMBER; --number of distinct key 唯一键的数目, M_AVGLBLK NUMBER; --leaf 平均块数, 一个dist-key 的数据占据几个索引的叶子数据块。 M_AVGDBLK NUMBER; --data 平均块数, 一个dist-key 对应的数据表的块数。 M_CLSTFCT NUMBER; --这个这个值,不太好理解,先放下 M_INDLEVEL NUMBER; --索引的level 数。 BEGIN DBMS_STATS.GET_INDEX_STATS(OWNNAME => NULL,INDNAME => '&source_index_name', NUMROWS => M_NUMROWS,NUMLBLKS => M_NUMLBLKS, NUMDIST => M_NUMDIST,AVGLBLK => M_AVGLBLK, AVGDBLK => M_AVGDBLK,CLSTFCT => M_CLSTFCT, INDLEVEL => M_INDLEVEL); M_CLSTFCT := M_CLSTFCT-3000; DBMS_STATS.SET_INDEX_STATS(OWNNAME => NULL,INDNAME => '&target_index_name', NUMROWS => M_NUMROWS,NUMLBLKS => M_NUMLBLKS, NUMDIST => M_NUMDIST,AVGLBLK => M_AVGLBLK, AVGDBLK => M_AVGDBLK,CLSTFCT => M_CLSTFCT, INDLEVEL => M_INDLEVEL); END; / 对于唯一索引 numdist ==  numrows   key 的数目跟行数是一致的, avglblk  =  numlblks / numdist 默认的计算方式。  avgdblk  = clstfct  /numdist   默认的计算方式。  ownername => null ,表示分析当前schema .  clstfct 代表的意思,不很好表达,这个值比较重要,会影响到执行计划的cost值,  大体的意思就是,举个例子:  select name from  tab where id =1 ;  id =1 的 数据假设分配在两个数据块里(blk1 ,blk2) ,  如果 clsfct 的值很大,(这个值的计算我们以后再说)  数据的实际计算路径应该类似于:  先从blk1 取一笔数据,然后去 blk2里再取一笔数据,然后两个数据merge      然后再从blk1 取一笔数据,然后再从blk2取一笔数据,就这样来回的在两个数据块间切换, 如果 blk1 跟blk2  是连在一起的,那么会在一个disk i/0 中读入内存,然后产生了大量的consistent get  如果不好采, 这个数据库块间间隔了几十个数据块,那么就会产生比较频繁的物理i/0切换, 这个值大体的就是这个意思了。 这个对应于all_indexes 视图的CLUSTERING_FACTOR  字段的解释: Indicates the amount of order of the rows in the table based on the values of the index.     * If the value is near the number of blocks, then the table is very well ordered. In this case, the index entries in a single leaf block tend to point to rows in the same data blocks.     * If the value is near the number of rows, then the table is very randomly ordered. In this case, it is unlikely that index entries in the same leaf block point to rows in the same data blocks. )  这个值比较理想的状态下应该跟 numblk 的数量查不多。  等对这个东西看的差不多了,再写个文档,先这样看着吧。 

相关推荐