ORACLE 统计信息

1.查看统计信息被锁定的表

  SELECT OWNER, TABLE_NAME
    FROM DBA_TAB_STATISTICS
   WHERE STATTYPE_LOCKED IS NOT NULL AND OWNER = 'XXXXX'
GROUP BY OWNER, TABLE_NAME;

2.自动统计信息的查看与关闭

参考:Oracle统计信息收集与关闭

3.手动设置统计信息

3.1.普通表设置统计信息

EXEC DBMS_STATS.SET_TABLE_STATS('MONKEY','TESTTABLE',NUMROWS=>175603,NUMBLKS=>2794,AVGRLEN=>109);

SELECT NUM_ROWS,BLOCKS,AVG_ROW_LEN FROM USER_TABLES WHERE TABLE_NAME='TESTTABLE';

3.2.分区表设置统计信息

-- 手动设置分区统计信息
EXEC DBMS_STATS.SET_TABLE_STATS('TABLE_OWNER','TABLE_NAME',PARTNAME=>'PART_P201403',NUMROWS=>690857285,NUMBLKS=>17753800,AVGRLEN=>121);

-- 得到全部分区设置脚本
SELECT    'exec DBMS_STATS.SET_TABLE_STATS('''
       || OWNER
       || ''','''
       || TABLE_NAME
       || ''',partname=>'''
       || PARTITION_NAME
       || ''',numrows=>690857285,numblks=>17753800,avgrlen=>121);'
  FROM dba_tab_statistics
 WHERE     owner = 'MONKEY'
       AND table_name = 'TESTTAB'
       AND PARTITION_NAME IS NOT NULL;

-- 设置分区表整表统计信息
SELECT SUM (NUM_ROWS), SUM (BLOCKS)
  FROM dba_tab_statistics
 WHERE     owner = 'MONKEY'
       AND table_name = 'TESTTAB'
       AND partition_name IS NOT NULL;      
-- sum(num_rows)和sum(blocks)为上一步得到的值,avgrlen和每个分区相同 
EXEC DBMS_STATS.SET_TABLE_STATS('MONKEY','TESTTAB',numrows=>sum(NUM_ROWS),numblks=>sum(BLOCKS),avgrlen=>121);    

4.手动收集统计信息

EXEC DBMS_STATS.GATHER_TABLE_STATS(OWNNAME=>'MONKEY',TABNAME=>'DYSAM',ESTIMATE_PERCENT=>DBMS_STATS.AUTO_SAMPLE_SIZE,METHOD_OPT => 'for all columns size auto' ,CASCADE => TRUE ,DEGREE=>6);

ESTIMATE_PERCENT:采样百分比(默认值为DBMS_STATS.AUTO_SAMPLE_SIZE,由oracle自动决定,也可以设置为30,采样百分之三十)

METHOD_OPT:

for all columns:统计所有列的直方图

for all indexed columns:统计所有indexed列的直方图

for all hidden columns:统计隐藏列列的直方图

for columns SIZE | REPEAT | AUTO | SKEWONLY:统计指定列的直方图

CASCADE:是否统计索引的统计信息

DEGREE:并行度

5.删除统计信息

EXEC DBMS_STATS.DELETE_TABLE_STATS(OWNNAME => 'MONKEY',TABNAME => 'DYSAM') ;

6.自动统计信息收集的条件

6.1.收集的对象

  1. 没有统计信息
  2. 上次收集万统计信息中间执行过truncate操作
  3. 上次收集后表行的变化量超过一定数量的(行的变化量记录在dba_tab_modifications中,调用dbms_stats.flush_database_monitoring_info可以刷新视图)

6.2.查看统计信息过时表

select owner,table_name,stale_stats from dba_tab_statistics;
-- stale_stats:no没有过时,yes已经过时,none丢失统计信息

参考:

DBMS_STATS.GATHER_TABLE_STATS详解 - 卡卡不卡 - 博客园 (cnblogs.com)

Oracle 统计信息介绍 - 空白葛 - 博客园 (cnblogs.com)

posted @ 2020-11-16 14:19  monkey6  阅读(8)  评论(0编辑  收藏  举报