如何使用dbms_stats分析统计信息? --创建统计信息历史保留表
sql
>
exec
dbms_stats.create_stat_table(ownname
=>
'
scott
'
,stattab
=>
'
stat_table
'
) ;
--导出整个scheme的统计信息
sql
>
exec
dbms_stats.export_schema_stats(ownname
=>
'
scott
'
,stattab
=>
'
stat_table
'
) ;
--分析scheme
Exec
dbms_stats.gather_schema_stats( ownname
=>
'
scott
'
, options
=>
'
GATHER AUTO
'
, estimate_percent
=>
dbms_stats.auto_sample_size, method_opt
=>
'
for all indexed columns
'
, degree
=>
6
)
--分析表
sql
>
exec
dbms_stats.gather_table_stats(ownname
=>
'
scott
'
,tabname
=>
'
work_list
'
,estimate_percent
=>
10
,method_opt
=>
'
for all indexed columns
'
) ;
--分析索引
SQL
>
exec
dbms_stats.gather_index_stats(ownname
=>
'
crm2
'
,indname
=>
'
IDX_ADM_PERMISSION_PID_MID
'
,estimate_percent
=>
'
10
'
,degree
=>
'
4
'
) ;
--如果发现执行计划走错,删除表的统计信息
SQL
>
dbms_stats.delete_table_stats(ownname
=>
'
scott
'
,tabname
=>
'
work_list
'
) ;
--导入表的历史统计信息
sql
>
exec
dbms_stats.import_table_stats(ownname
=>
'
scott
'
,tabname
=>
'
work_list
'
,stattab
=>
'
stat_table
'
) ;
--如果进行分析后,大部分表的执行计划都走错,需要导回整个scheme的统计信息
sql
>
exec
dbms_stats.import_schema_stats(ownname
=>
'
scott
'
,stattab
=>
'
stat_table
'
);
--导入索引的统计信息
SQL
>
exec
dbms_stats.import_index_stats(ownname
=>
'
crm2
'
,indname
=>
'
IDX_ADM_PERMISSION_PID_MID
'
,stattab
=>
'
stat_table
'
)
--检查是否导入成功
SQL
>
select
table_name,num_rows,a.blocks,a.last_analyzed
from
all_tables a
where
a.table_name
=
'
WORK_LIST
'
;
分析数据库(包括所有的用户对象和系统对象):gather_database_stats 分析用户所有的对象(包括表、索引、簇):gather_schema_stats 分析表:gather_table_stats 分析索引:gather_index_stats 删除数据库统计信息:delete_database_stats 删除用户方案统计信息:delete_schema_stats 删除表统计信息:delete_table_stats 删除索引统计信息:delete_index_stats 删除列统计信息:delete_column_stats 设置表统计信息:set_table_stats 设置索引统计信息:set_index_stats 设置列统计信息:set_column_stats
可以查看表 DBA_TABLES来查看表是否与被分析过,如:
SELECT TABLE_NAME, LAST_ANALYZED FROM DBA_TABLES
这是对命令与工具包的一些总结 1、对于分区表,建议使用DBMS_STATS,而不是使用Analyze语句。 a) 可以并行进行,对多个用户,多个Table b) 可以得到整个分区表的数据和单个分区的数据。 c) 可以在不同级别上Compute Statistics:单个分区,子分区,全表,所有分区 d) 可以倒出统计信息 e) 可以用户自动收集统计信息 2、DBMS_STATS的缺点 a) 不能Validate Structure b) 不能收集CHAINED ROWS, 不能收集CLUSTER TABLE的信息,这两个仍旧需要使用Analyze语句。 c) DBMS_STATS 默认不对索引进行Analyze,因为默认Cascade是False,需要手工指定为True 3、对于oracle 9里面的External Table,Analyze不能使用,只能使用DBMS_STATS来收集信息。