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.自动统计信息的查看与关闭
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
CASCADE:是否统计索引的统计信息
DEGREE:并行度
5.删除统计信息
EXEC DBMS_STATS.DELETE_TABLE_STATS(OWNNAME => 'MONKEY',TABNAME => 'DYSAM') ;
6.自动统计信息收集的条件
6.1.收集的对象
- 没有统计信息
- 上次收集万统计信息中间执行过truncate操作
- 上次收集后表行的变化量超过一定数量的(行的变化量记录在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丢失统计信息
参考: