Oracle数据库使用Analyze提升sql性能
如果你不使用analyze完成sql优化,将意味着:你拒绝使用数据库的查询优化器,也失去了使用优化连接的机会。假设你创建了一张拥有100万条记录的临时表,如果不对其进行分析,那么优化器将无法从现有的线索中获取表中真正的内容,于是它只能决定使用嵌套循环连接来一行行地扫描数据表,随着数据集的增长,你的数据库性能会越来越差。
ORACLE数据库的PL/SQL语句执行的优化器,有基于代价的优化器(CBO)和基于规则的优化器(RBO)。
RBO的优化方式,依赖于一套严格的语法规则,只要按照规则写出的语句,不管数据表和索引的内容是否发生变化,不会影响PL/SQL语句的"执行计划"。
CBO自ORACLE7版被引入,ORACLE自7版以来采用的许多新技术都是只基于CBO的,如星型连接排列查询,哈希连接查询,反向索引,索引表,分区表和并行查询等。CBO计算各种可能"执行计划"的"代价",即cost,从中选用cost最低的方案,作为实际运行方案。各"执行计划"的cost的计算根据,依赖于数据表中数据的统计分布,ORACLE数据库本身对该统计分布是不清楚的,须要分析表和相关的索引,才能搜集到CBO所需的数据。要想使用好CBO,使SQL语句发挥最大效能,必须保证统计数据的及时性。
统计信息的生成可以有完全计算法和抽样估算法。SQL例句如下:
完全计算法:analyze table abc compute statistics;
抽样估算法(抽样20%): analyze table abc estimate statistics sample 20percent;
可以通过定时任务方式,定时通过analyze命令完成数据库中相应表内容的分析处理。