DB2 优化器中针对JOIN 结果集估计经典版!


  本文标签:DB2 优化器

  以下的文章主要描述的是DB2 优化器中针对 JOIN 语句的实际操作结果集估计,在实际操作中DB2 优化器在为 SQL 语句生成执行计划时,其实际操作过程中都会对每个步骤产生的结果集大小进行估计,这就是优化器的基估计  。

  在所有 SQL 语句基估计过程中,以 JOIN 语句的计算过程最复杂,而 JOIN 语句恰恰是进行性能优化的重点  。本文主要关注 DB2 优化器在进行基估计时采用的计算方法、输入等  。

  简介

  优化器是 DB2 的心脏和灵魂(可以把它类比成宝马 730 或波音 747 的发动机引擎一样)  。它分析 SQL 语句并确定可以满足每条语句的最有效的存取路径  。 DB2 SQL 优化器可以估计每个备选访问计划的执行成本,并根据其估计结果选择一个最佳访问计划  。

  在优化器在优化一个 SQL 语句的过程中使用到两个非常重要的概念:selectivity 和 cardinality   。 selectivity 是指一个 SQL 操作的得出结果集占原来结果集的百分比,而 cardinality 就是指一个 SQL 操作的得出结果集的行数  。

  为正确地确定每种访问计划的成本,DB2 优化器都会对每个步骤产生的结果集大小即返回的行数进行估计,这就是优化器的基估计  。 DB2 优化器需要准确的基数估计值  。基数估计是这样一种过程:在应用了谓词或执行了聚集之后,优化器使用统计信息确定部分查询结果的大小  。对于访问计划的每个操作符,优化器将估计该操作符的基数输出  。一个或更多谓词的应用可以减少输出流基数  。

  JOIN 谓词

  当我们在 SQL 里面需要对多个表进行 join 的时候,DB2 会首先选择其中的 2 个表进行 join,并获取到一个中间的结果集,然后 DB2 可能会用这个中间的结果集和第三个表做 join,再次获得中间的结果集(当然也可能是把另外 2 个表做 join,然后把两个中间的结果集进行 join 操作),不管是怎么操作,DB2 一次能够 join 的表的个数肯定是两个  。因此当优化器在考虑 Join 如何处理的时候,join 的顺序就是一个很重要的问题,因为我们总是希望能够在最开始就把结果集控制的尽量小  。

DB2 优化器中针对 JOIN 语句的结果集估计

  以上的相关内容就是对DB2 优化器中针对 JOIN 语句的结果集估计的介绍,望你能有所收获  。