|
Oracle数据的优化器有两种优化方法:基于代价/成本的优化器(CBO)和基于规则的优化器(RBO),系统在对SQL进行优化的时候,使用哪种优化决定于初始化参数OPTIMIZER_MODE,该参数值可以设置为:CHOOSE,RULE,ALL_ROWS,FIRST_ROWS。在Oracle9i以后的版本中还引入了新的优化参数命令:FIRST_ROWS_1,FIRST_ROWS_10, FIRST_ROWS_100,FIRST_ROWS_1000。(具体的说明将在以后的BLOG文章中介绍)Oracle推荐使用CBO优化方式,当系统使用CBO方式优化SQL的时候,要使其执行计划达到最优化,需要定期执行数据统计,必须保证统计数据的及时性,否则可能得不到预计的优化效果,或与预计的优化效果相差悬殊。
完全统计法:analyze table table_name compute statistics;
SQL> SPOOL OFF; 然后调整一下脚本,并执行: 可以将该脚本放到服务器端并设置自动执行。
完全统计: PL/SQL procedure successfully completed 50%抽样统计 PL/SQL procedure successfully completed 可以使用该过程,生成分析统计数据库对象的脚本,并定时执行该脚本。
完全统计SCHEMA下的所有对象: PL/SQL procedure successfully completed 抽样50%统计SCHEMA下的所有对象: PL/SQL procedure successfully completed 从执行的时间上看,抽样统计的时间要比完全统计所花费的时间要短,执行的更快。 注意: dbms_utility.analyze_schema(SCHEMA,METHOD,ESTIMATE_ROWS,ESTIMATE_PERCENT,METHOD_OPT)中SCHEMA须用户名大写,参数用单引号''
SQL> execute dbms_utility.analyze_database('COMPUTE'); begin dbms_utility.analyze_database('COMPUTE'); end; 改换有DBA权限的用户登陆: begin dbms_utility.analyze_database('COMPUTE'); end; 从上面的错误信息可以看出,不支持对外部表的分析统计,查看Oracle的解决办法,Oracle称不要试图做这项操作。 DBMS_UTILITY.ANALYZE_DATABASE的抽样分析统计和上例中类似。
DBMS_STATS.gather_table_stats,DBMS_STATS.gather_schema_stats,DBMS_STATS.gather_database_stats,DBMS_STATS.gather_system_stats分别执行对索引、表、某个schema、数据库、系统的统计信息。例如: SQL> execute dbms_stats.gather_table_stats('DINYAR','DINYA_TEST01'); PL/SQL procedure successfully completed SQL> execute dbms_stats.gather_schema_stats('DINYAR'); (该包中还有其他的一些过程,可以对数据库的对象进行操作,不在这里讨论。)
1 用DBMS_UTILITY 2 用DBMS_DDL PL/SQL procedure successfully completed 这样就可以在数据库中定时执行数据库对象统计信息的收集,保证了使用CBO优化器优化时优化路径的准确性。 Oracle提供的包中的其他功能请参考文档:<<Oracle9i Supplied PL_SQL Packages and Types Reference >> |
Oracle数据库的数据统计(Analyze)
最新推荐文章于 2022-12-23 17:46:44 发布
本文介绍了Oracle数据库中两种SQL优化方法:基于规则的优化器(RBO)和基于代价的优化器(CBO),重点讲解了如何通过不同方法收集表统计信息以优化CBO的效果,包括完全统计和抽样估计等。
690

被折叠的 条评论
为什么被折叠?



