ORACLE在执行SQL时如果使用成本方式分析则所有的成本分析信息来源依靠于系统的统计分析表(DBA_TABLESDBA_INDEXESDBA_TAB_COLUMNS)数据如果说统计分析的数据是不准确的那可能会使ORACLE分析出来的路径执行性能极差所以统计分析数据是影响ORACLE性能极重要的信息
统计分析主要包括产生表及索引的统计信息
表的统计信息主要包括表的行数每行的平均长度(字节)空闲块统计时间等信息
索引的统计信息主要包括行数层数叶块数统计时间等信息
另外ORACLE还可以统计列及数据不对称信息i还可以统计系统信息(CPUI/O)
ORACLE执行成本分析时首先取出所应用表及索引的统计数据进行分析其中数据行数是一个重要的参数因为ORACLE在分析表大小时行数为主要参数如果进行两个表联合时ORACLE会通过分析表的大小决定应用小表进行全表查询而大表执行联合查询这种性能明显高于先大表进行全表扫描索引的统计信息对分析也产生比较大的影响如ORACLE通过统计可以分析产生多个索引的优先级及索引的实用性来确定最优的索引策略ORACLE还可以统计列及数据对称信息以产生更精确的分析如一个表有A字段的索引其中A共有两种值和共条记录为的记录有条为的记录有条这时如果没有进行列数据不对称的统计信息那么ORACLE对A=及A=条件查询都会进行索引但实际应用对A=的索引性能得到了很大的提高而A=的索引反而使性能下降所以说索引特征值分析信息对应用索引产生重大影响精确的信息使ORACLE不会使用不应该用的索引
实际分析
zl_cbqc和zl_yhjbqk都没有建立统计信息执行如下两个SQL ORACLE将产生不同的执行计划
select * from dlyxzl_cbqc b dlyxzl_yhjbqk a where aqc_bh=bqc_bh
执行计划:
SELECT STATEMENT GOAL = CHOOSE
NESTED LOOPS
TABLE ACCESS FULL DLYX ZL_YHJBQK
TABLE ACCESS BY INDEX ROWID DLYX ZL_CBQC
INDEX UNIQUE SCAN DLYX 抄表区册主键
select * from dlyxzl_yhjbqk adlyxzl_cbqc b where aqc_bh=bqc_bh
执行计划:
SELECT STATEMENT GOAL = CHOOSE
NESTED LOOPS
TABLE ACCESS FULL DLYX ZL_CBQC
TABLE ACCESS BY INDEX ROWID DLYX ZL_YHJBQK
INDEX RANGE SCAN DLYX 区册索引
在对两个表进行了统计分析后
select * from dlyxzl_yhjbqk adlyxzl_cbqc b where aqc_bh=bqc_bh
执行计划:
SELECT STATEMENT GOAL = CHOOSE
HASH JOIN
TABLE ACCESS FULL DLYX ZL_CBQC
TABLE ACCESS FULL DLYX ZL_YHJBQK
select * from dlyxzl_cbqc bdlyxzl_yhjbqk a where aqc_bh=bqc_bh
执行计划:
SELECT STATEMENT GOAL = CHOOSE
HASH JOIN
TABLE ACCESS FULL DLYX ZL_CBQC
TABLE ACCESS FULL DLYX ZL_YHJBQK
从以上测试可以明显看出ORACLE的分析结果
第条SQL与第条SQL在没有统计分析的信息下进行ORACLE无法进行判断只能以规则方法进行分析根据表的出现先后顺序有明显关系
第条SQL与第条SQL在有统计分析的信息下进行ORACLE分析与表的出现先后顺序无关因为它已经知道了表的数据量并且已经确定返回的数据量基本上是两个表所有的数据所以对表两个表进行了HASH JOIN (同时取出两个表的数据然后在内存中进行联合产生返回结果)
相关技术
用analyze语句产生分析数据
分析表:analyze table zl_yhjbqk estimate statistics sample percent
分析索引:analyze index用户资料表主键compute statistics
分析列:analyze table zl_yhjbqk compute statistics for columns hbs_bh
分析索引列:analyze table zl_yhjbqk compute statistics for all indexed columns
用sysdbms_utility包分析数据
分析数据库(包括所有的用户对象和系统对象):analyze_database
分析用户所有的对象(包括用户方案内的表索引簇):analyze_schema
用sysdbms_stats包处理分析数据
分析数据库(包括所有的用户对象和系统对象):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
ORACLE推荐用户采用sysdbms_stats包体进行分析因为在ORACLEi及其以上的版本全面扩充的此包体的功能sysdbms_utility包体进行分析时会对所有的信息全部分析一遍时间比较长而在i中sysdbms_stats可以利用表修改监控技术来判断需统计分析的表进行节省了用户的分析资源