|
与Oracle数据库一样,DB2数据库里面也是通过优化器来分析你的SQL,生成它认为最优的执行计划(Access Plan)。DB2的优化器实际上是一个标准规则集合,一般来说我们只要告诉DB2要检索什么,而不是如何检索。
那么DB2的优化器是根据什么来判断SQL的最优存取路径呢?
DB2的优化器是基于成本的优化器,也就是CBO(Cost Based Optmizer)。也就是说DB2 优化器会应用查询成本公式,该公式对每条可能的存取路径的四个因素进行评估和权衡:CPU 成本、I/O 成本、DB2 系统目录中的统计信息和实际的 SQL 语句。
那么我们来简单看一下DB2的优化器的工作流程:
1.DB2的优化器,在接收到SQL语句后,会首先校验SQL的语法,确保是正确的SQL。
2.根据当前的系统环境信息,生成最优的执行计划来优化SQL语句 。
3.把SQL翻译成计算机指令语言,并执行这个优化后的SQL。
4.返回结果,或者存储它们,以便将来的执行。
如何及时更新这些信息呢?保证DB2优化器正确的工作,在DB2里面提供了以下的办法。
1.RUNSTATS与REOGCHK
Runstats这个命令的功能主要就是收集数据库对象的状态信息,这对数据库使用合理的ACCESS PLAN是至关重要的。
这样优化器将考虑使用索引扫描而不是表扫描。无论统计信息如何,优化器将使用索引扫描而不是使用表扫描。
IBM的文档里面还提供了REORGCHK这个命令,可以根据统计公式计算表是否需要重整。
需要注意的是,如果数据库中数据量比较大,这些操作一般所需时间比较长,所以尽量安排在数据库比较空闲的时候做。
db2 update db cfg using AUTO_MAINT off AUTO_TBL_MAINT off AUTO_RUNSTATS off
在DB2 8.2里面数据库可以自动进行统计信息收集,不过这样的动作还是会带来额外的负载,一般情况下面可以关掉,只在我们需要的时候运行就可以了。
2.LOAD
Load这个工具是DB2里面一个非常强大的数据迁移工具。一般用作大批量的数据插入。因为Load操作不记日志,所以效率非常好。笔者曾经在RS6000平台上面实现50-60m/s的速度Load数据。在这里我想讨论的是在DB2数据库里面如何用load来影响你的catalog视图的统计信息。
在Load的时候使用statistics选项可以在装入的过程中生成统计数据,这些统计数据可以供优化器确定最有效的执行sql语句的方式。
3. DB2LOOK
Db2look是DB2一个相当强大的一辅助工具,可以帮助我们从当前数据库里面把数据库结构抽取出来。在数据迁移的很多场合,我们都非常需要这个强大的工具。
在一些场合,特别是开发库迁移到生产库,生产库迁移到开发库的环境中,为了保证SQL执行计划的一致,我们需要用db2look这个工具,利用 db2look 工具提供的抽取数据库对象统计信息的功能,把数据库的统计信息进行迁移。
在DB2数据库里面,基于成本的优化器决定着SQL的执行效率。而正确、及时地收集数据库的统计信息对于让优化器生成正确的执行计划是至关重要的。
|