达梦数据库如何收集表和索引的统计信息
命令:
DBMS_STATS.GATHER_TABLE_STATS(OWNNAME =>'HIDC',TABNAME => 'SYS_OSS',ESTIMATE_PERCENT=>100,METHOD_OPT => 'FOR ALL COLUMNS SIZE AUTO',DEGREE => 2,CASCADE => true);
dbms_stats.gather_table_stats:用于收集目标表,目标表上列及目标表上索引的统计信息。
如果表很大,收集信息收集很长,期间有写入操作,会执行失败,报如下错误:
总共1个语句正依次执行...
[执行语句1]:
DBMS_STATS.GATHER_TABLE_STATS(OWNNAME =>'HIDC',TABNAME => 'SYS_OSS',ESTIMATE_PERCENT=>100,METHOD_OPT => 'FOR ALL COLUMNS SIZE AUTO',DEGREE => 2,CASCADE => true);
执行失败(语句1)
回滚记录版本太旧,无法获取用户记录
-7120[-7120]: line 1
-7120: PROC_STAT_ON line 228
-7120: anonymous block line 259
-7120: DBMS_STATS.GATHER_TABLE_STATS_INNER line 425
-7120: DBMS_STATS.GATHER_TABLE_STATS line 483
1条语句执行失败
这个时候需要看来得拆分粒度,按列、索引来收集了
select --s.owner,s.table_name,s.index_name,
'DBMS_STATS.GATHER_INDEX_STATS(OWNNAME => '''|| s.owner||''',INDNAME =>'''||s.index_name||''',ESTIMATE_PERCENT=>100,DEGREE => 2);' aa
from DBA_INDEXES s where s.owner='HIDC' and table_name='SYS_OSS';
select --s.owner,s.table_name,s.column_name,
'DBMS_STATS.GATHER_TABLE_STATS(OWNNAME => '''||s.owner||''',TABNAME => '''||s.table_name||''',METHOD_OPT => ''FOR COLUMNS "'|| s.column_name ||'",DEGREE => 2,CASCADE => FALSE);' aa
from all_tab_columns s where s.owner='HIDC' and table_name='SYS_OSS' and data_type not in('CLOB','BLOB','TEXT') ;
按照上面的输出来执行:
索引:
DBMS_STATS.GATHER_INDEX_STATS(OWNNAME => 'HIDC',INDNAME =>'IDX_SYS_OSS_FINALIMAGETYPE',ESTIMATE_PERCENT=>100,DEGREE => 2);
列:
DBMS_STATS.GATHER_TABLE_STATS(OWNNAME => 'HIDC',TABNAME => 'SYS_OSS',METHOD_OPT => 'FOR COLUMNS "OSS_ID",DEGREE => 2,CASCADE => FALSE);