oracle的CBO是通过统计信息来解析出执行计划的,而对于一个新建立的数据库来说,因为没有执行过获取统计信息的程序,所以统计信息经常是错误的,这就需要我们经常手动收集统计信息,下面列一下几个简单的收集统计信息的方法:
----得到一个表的统计信息(可以不加size skewonly,但速度会慢一些)
DBMS_STATS.GATHER_TABLE_STATS(ownname => 'OWNER_NAME',tabname => 'TABLE_NAME',method_opt => 'for all indexed columns size skewonly');--直方图统计所有索引列
DBMS_STATS.GATHER_TABLE_STATS(ownname => 'OWNER_NAME',tabname => 'TABLE_NAME',method_opt => 'for all columns size skewonly');--直方图统计所有列
DBMS_STATS.GATHER_TABLE_STATS(ownname => 'OWNER_NAME',tabname => 'TABLE_NAME',method_opt => 'for all indexes');--只分析相关索引
----更新数据库的内存,使数据库中已经形成的所有解释计划失效
alter system flush shared_pool;
----单独使一个表已经存在的解释计划失效的方法(只要运行一个赋权语句,DDL语句也可以,对系统没有影响的DDL语句就是赋权语句)
grant select on owner_name.table_name to owner_name;
revoke select on owner_name.table_name from owner_name;
----对整个数据库进行统计
DBMS_STATS.GATHER_DATABASE_STATISTICS
----对一个用户进行统计
DBMS_STATS.GATHER_SCHEMA_STATISTICS(ownname => 'OWNER_NAME');
----对一个索引进行统计
DBMS_STATS.GATHER_INDEX_STATISTICS(ownname => 'OWNER_NAME',indname => 'INDEX_NAME');
----删除一个表的统计信息
DBMS_STATS.DELETE_TABLE_STATS(ownname => 'OWNER_NAME',tabname => 'TABLE_NAME');[@more@]