Chinaunix首页 | 论坛 | 博客
  • 博客访问: 426726
  • 博文数量: 239
  • 博客积分: 8010
  • 博客等级: 中将
  • 技术积分: 2431
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-02 21:12
文章分类
文章存档

2008年(239)

我的朋友

分类: DB2/Informix

2008-06-17 23:44:17

减少优化处理的措施

对于一个复杂的查询,等价于给定SQL语句的不同执行计划会很多。一般而言,对于n个表的连接,有(2 (n – 1))! / (n – 1)!个不同连接顺序。当n = 3时,有12种不同的连接顺序;当n = 5时,有1680种不同的连接顺序。由此我们可以看出,对一个大的、复杂的SQL语句,要估算所有可能的执行计划,进而找出代价最小的那一个,将是不可能的事情。

数据库系统通常使用基于代价的优化方法。为了减少优化器的估算次数,减少对系统资源的消耗,数据库系统采取了许多措施。这些措施大体上包括以下这些:

1)结合启发式规则,首先找到最可能具有最小代价的执行计划,然后估算其代价,与此同时排除最不可能的执行计划。

2)在对其它执行计划进行估算时,可以使用以下技术进一步减少或者排除要处理的执行计划:

找多个表的最佳连接顺序时,不是简单地考虑所有可能的连接顺序,而是首先为多个表的每个子集找出最佳连接顺序。对一个子集来说,在所有包含这个子集的执行计划中,只有使用了这个子集最佳连接顺序的执行计划,才需要被估算,其余的执行计划都可以被排除。使用这种方法能够大大减少需要检查的连接顺序总数。

如果检查一个执行计划的某部分后,发现这一部分的执行代价已经比先前已检查过的整个执行计划的最小代价要大,则可以终止对这个执行计划的检查。

如果发现一个子表达式的最小代价,比先前已检查过的整个执行计划的最小代价还大,则没有必要对包含该子表达式的任何执行计划进行检查。

3)系统将SQL语句经优化后的执行计划存放在内存或者数据字典中。这样,该SQL语句再次被请求时,系统就直接使用,不再进行优化处理,这一点我们已经在第3.2.4一节中作了介绍。对程序员而言,应尽可能在应用程序之间做到SQL语句的共享,减少优化处理操作。

阅读(601) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~