零、查看数据库的统计信息收集是否开启
select * from dba_autotask_client;
auto optimizer stats collection 是表示开启数据库自动统计信息收集。
一、查看统计信息是否锁定
select stattype_locked,last_analyzed,a.* from dba_tab_statistics a where a.stattype_locked is not null;
该字段值为空表示 没有锁定,ALL则表示统计信息收集被锁定。
二、解锁、统计信息收集、锁定
exec dbms_stats.unlock_table_stats(ownname => 'USER1',tabname => 'TABLE1');
exec dbms_stats.gather_table_stats('USER1','TABLE1');
exec dbms_stats.lock_table_stats('USER1','TABLE1');
三、其他
--analyze命令已经过时
– 无法提供灵活的分析选项
– 无法提供并行的分析
– 无法对分析数据进行管理
--DBMS_STATS
– 专门为CBO提供信息来源
– 可以进行数据分析的多种组合
– 可以对分区进行分析
– 可以进行分析数据管理
• 备份,恢复,删除,设置....
不能收集行迁移,行迁移需要使用analyze
analyze table productuser.supplymessage validate structure cascade;
--创建统计信息历史保留表
begin
dbms_stats.create_stat_table(ownname => 'productuser',stattab => 'stat_tableofproduct') ;
end;
--导出整个scheme的统计信息
begin
dbms_stats.export_schema_stats(ownname => 'productuser',stattab => 'stat_tableofproduct') ;
end;
--删除表的统计信息
begin
dbms_stats.delete_table_stats(ownname => 'productuser',tabname => 'product') ;
end;
select * from user_tables where table_name='PRODUCT'
--导入表的历史统计信息
begin
dbms_stats.import_table_stats(ownname => 'productuser',tabname => 'product',stattab => 'stat_tableofproduct') ;
end;
--如果进行分析后,大部分表的执行计划都走错,需要导回整个scheme的统计信息
begin
dbms_stats.import_schema_stats(ownname => 'productuser',stattab => 'stat_tableofproduct');
end;
--导入索引的统计信息
begin
dbms_stats.import_index_stats(ownname => 'productuser',indname => 'xxx',stattab => 'stat_tableofproduct')
end;
analyze table 可以指定分析: 表、所有字段、所有索引字段、所有索引。 若不指定则全部都分析。
1、全分析
说明:全分析,包括表、字段、索引。统计信息产生在user_tables、user_tab_columns、user_indexes中。
analyze table my_table compute statistics for table for all indexes for all columns;
2、指定表分析
说明:只分析表。统计信息只产生在user_tables中。
analyze table my_table compute statistics for table;
查看表的统计信息:select table_name,num_rows,blocks,empty_blocks from user_table;
3、指定所有字段分析
说明:只分析字段。统计信息只产生在user_tab_columns中,且全字段有。
analyze table my_table compute statistics for all columns;
查看字段的统计信息:select table_name,column_name,num_distinct,low_value,high_value,density from user_tab_columns;
4、指定有索引的字段分析
说明:只分析有索引的字段。统计信息只产生在user_tab_columns中,且只有含索引的字段有。
analyze table my_table compute statistics for all indexed columns;
5、指定索引分析
说明:只分析索引。统计信息只产生在user_indexes中。
analyze table my_table compute statistics for all indexes;
查看索引的统计信息
select table_name,index_name,blevel,leaf_blocks,distinct_keys,avg_leaf_blocks_per_key,avg_data_blocks_per_key,clustering_factor,num_rows from user_indexes;
另外,可以删除分析数据:
SQL> analyze table my_table delete statistics;
SQL> analyze table my_table delete statistics for table for all indexes for all indexed columns;
特别需要注意的:
truncate命令不会修改数据的统计信息,也就是如果我们想让CBO利用合理利用数据的统计信息的时候,需要我们及时的使用analyze命令或者dbms_stats重新统计数据的统计信息。