ORACLE数据库的PL/SQL语句执行的优化器有基于代价的优化器(CBO)和基于规则的优化器(RBO)
RBO的优化方式依赖于一套严格的语法规则只要按照规则写出的语句不管数据表和索引的内容是否发生变化不会影响PL/SQL语句的执行计划
CBO自ORACLE 版被引入ORACLE自版以来采用的许多新技术都是只基于CBO的如星型连接排列查询哈希连接查询反向索引索引表分区表和并行查询等CBO计算各种可能执行计划的代价即cost从中选用cost最低的方案作为实际运行方案各执行计划的cost的计算根据依赖于数据表中数据的统计分布ORACLE数据库本身对该统计分布是不清楚的须要分析表和相关的索引才能搜集到CBO所需的数据
CBO是ORACLE推荐使用的优化方式要想使用好CBO使SQL语句发挥最大效能必须保证统计数据的及时性
统计信息的生成可以有完全计算法和抽样估算法
SQL例句如下
完全计算法 analyze table abc compute statistics;
抽样估算法(抽样%) analyze table abc estimate statistics sample percent;
对表作完全计算所花的时间相当于做全表扫描抽样估算法由于采用抽样比完全计算法的生成统计速度要快如果不是要求要有精确数据的话尽量采用抽样分析法建议对表分析采用抽样估算对索引分析可以采用完全计算
我们可以采用以下两种方法对数据库的表和索引及簇表定期分析生成统计信息保证应用的正常性能
在系统设置定时任务执行分析脚本
在数据库服务器端我们以UNIX用户oracle运行脚本analyze在analyze中我们生成待执行sql脚本并运行(假设我们要分析scott用户下的所有表和索引)
Analyze脚本内容如下
sqlplus scott/tiger 《 EOF
set pagesize
set heading off
SPOOL ANALYTABSQL
SELECT ANALYZE TABLE SCOTT||TABLE_NAME|| ESTIMATE STATISTICS SAMPLE PERCENT ; FROM USER_TABLES;
SPOOL OFF
SPOOL ANALYINDSQL
SELECT ANALYZE TABLE SCOTT||TABLE_NAME|| ESTIMATE STATISTICS SAMPLE PERCENT FOR ALL INDEXES; FROM USER_TABLES;
SPOOL OFF
SPOOL ANALYZELOG
@ANALYTABSQL
@ANALYINDSQL
SPOOL OFF
EXIT
在UNIX平台上crontab加入以上文件设置为每个月或合适的时间段运行
利用ORACLE提供的程序包(PACKAGE)对相关的数据库对象进行分析
有以下的程序包可以对表索引簇表进行分析
包中的存储过程的相关参数解释如下
TYPE可以是TABLEINDEXCLUSTER中其一
SCHEMA为TABLEINDEXCLUSTER的所有者NULL为当前用户
NAME为相关对象的名称
METHOD是ESTIMATECOMPUTEDELETE中其一当选用ESTIMATE
下面两项ESTIMATE_ROWS和ESTIMATE_PERCENT不能同时为空值
ESTIMATE_ROWS是估算的抽样行数
ESTIMATE_PERCENT是估算的抽样百分比
METHOD_OPT是有以下选项
FOR TABLE /*只统计表*/
[FOR ALL [INDEXED] COLUMNS] [SIZE N] /*只统计有索引的表列*/
FOR ALL INDEXES /*只分析统计相关索引*/
PARTNAME是指定要分析的分区名称
)
DBMS_DDLANALYZE_OBJECT(
TYPE VARCHAR
SCHEMA VARCHAR
NAME VARCHAR
METHOD VARCHAR
ESTIMATE_ROWS NUMBER DEFAULT NULL
ESTIMATE_PERCENT NUMBER DEFAULT NULL
METHOD_OPT VARCHAR DEFAULT NULL
PARTNAME VARCHAR DEFAULT NULL ) ;
该存储过程可对特定的表索引和簇表进行分析
[] []