现在的位置: 首页 > 综合 > 正文

进一步理解 DB2 中的列组统计信息

2013年10月02日 ⁄ 综合 ⁄ 共 2451字 ⁄ 字号 评论关闭

利用 IBM® DB2® for Linux®, UNIX®, and Windows® (DB2)
中的多列统计信息,优化器可以在多个谓词相关联时确定一个更好的查询访问计划并提高查询性能。在本文中,学习如何使用多列统计信息以利用 DB2 9.5
优化器的增强功能,从而将多列统计信息的用途扩展到更多谓词中。

简介

理解 DB2 中的列组统计信息”(developerWorks,2006 年 12
月)一文描述了收集列组统计信息的重要性,并介绍了 DB2 SQL
优化器(后文简称为优化器)如何使用这些多列统计信息来检测两个或多个本地或连接等式谓词之间的统计关联。在 DB2 9.5
中,优化器进一步将多列统计信息的使用扩展到了更广泛的谓词范围中。

优化器凭借精确的基数估计值来准确计算出每一个待定查询访问计划的成本。基数估计是这样一种过程:在应用了谓词或执行了聚集之后,优化器使用统计信息确定部分查询结果的大小。对于访问计划的每个操作符,优化器将估计该操作符的基数输出。应用一个或更多谓词可以减少输出流基数。

在计算谓词对于基数估计值的组合过滤效果时,通常会假设这些谓词彼此之间是独立的。但在统计方面,这些谓词可以彼此关联。单独地处理多个谓词通常会导致优化器低估基数值。而基数值的低估又会导致优化器选择一个次优的访问计划。

优化器会考虑使用多列统计信息来检测统计关联,并更加准确地估计多个谓词组合的过滤效果。本文描述了优化器如何利用多列统计信息来检测统计关联,并更加准确地估算多个等式谓词对于应用了至少两个本地
IN、OR 和等式谓词的 SQL 语句的组合过滤效果,和它们对于应用了某种等级的 OR 谓词的 SQL 语句的过滤效果。“理解 DB2 中的列组统计信息
一文描述了优化器如何利用多列统计信息来检测两个或多个本地等式谓词间的关联,以及在一对表中至少使用了两个等式连接谓词的两个或多个表的连接关联。RUNSTATS
命令选项在本文中的使用方式与在上篇 文章 中所描述的使用方式相同,所以本文中不再加以描述。



回页首

多个本地等式和本地 IN 谓词的统计关联

如果 SQL 语句的 WHERE 子句使用了多个谓词:

    	        C1=? AND C2 IN ( ?, ?, ? )

并且收集了 (C1, C2) 的多列统计信息的话,那么优化器就会试着检测这些谓词间的统计关联以提高基数估计值。如下谓词除外:

  • 带有 IN 或 OR 操作符的连接谓词
  • 带有不等式、LIKE 或 IS NULL 操作符的本地谓词
  • 带有子查询的谓词

C1=? 谓词就是本地等式谓词的一个例子,一个本地等式谓词是一个应用于单个表的等式谓词,其描述如下:

	        COLUMN = literal

其中 literal 可以是以下任一内容:

  • 一个常量值
  • 一个参数标记或一个主变量
  • 一个专用寄存器(例如,CURRENT DATE)

C2 IN ( ?, ?, ? ) 谓词则是本地 IN 谓词的一个例子,一个本地 IN 谓词是一个应用于同一个表格 —— 与本地谓词所应用的表格相同 ——
的等式谓词,其描述如下:

     
COLUMN IN ( <VALUE LIST> )

其中 <VALUE LIST> 是一个以逗号隔开的一个或多个上述(在本地等式谓词中)literal 的列表。

一个相当于 IN 谓词的 OR 谓词可以代替 IN 谓词在 SQL 语句中指定,而且优化器将会在说明统计关联时按相同的方式处理之,也就是说:

    
COL IN ( literal_1, literal_2, ..., literal_n )

相当于

    
COL=literal_1 OR COL=literal_2 OR ... OR COL=literal_n

下面的例子演示了优化器为其检测本地 IN、OR 和等式谓词间的关联:

a) COL_1 IN ( <VALUE LIST> ) AND COL_2=literal AND
COL_3=literal

b) (COL_1=literal_1 OR COL_1=literal_2 OR ... OR
COL_1=liternal_n) AND COL_2=literal AND ... AND COL_m=literal

c)
COL_1 IN ( <VALUE LIST> ) AND COL_2 IN ( <VALUE LIST> ) AND ... AND
COL_m IN ( <VALUE LIST> )

d) (COL_1=literal_1 OR
COL_1=literal_2) AND (COL_2=literal_1 OR COL_2=literal_2) AND ... AND
(COL_m=literal_1 OR COL_M=literal_2)

e) COL_1 IN ( <VALUE
LIST> ) AND ... And COL_m IN ( <VALUE LIST> ) AND COL_1_2=literal AND
... AND COL_1_k=literal

f) (COL_1=literal_1 OR COL_1=literal_2)
AND COL_2=literal AND COL_3=literal

g) (C)L_1=literal_1 OR
COL_1=literal_2) AND (COL_2=literal_1 OR COL_2=literal_2) AND
COL_3=literal

下面这些谓词是优化器不会考虑为其检测统计关联的谓词的例子:

a) (COL_1=literal AND COL_2=literal) OR (COL_1=literal AND
COL_2=literal AND COL_3=literal)

b)((COL_1=literal AND
COL_2=literal) OR (COL_1=literal AND COL_2=literal)) AND
COL_3=literal

c)( COL_1 IN ( <VALUE LIST> ) OR (COL_2 IN (
<VALUE LIST> ) ) AND COL_3=literal

示例 1:C1 IN ( <VALUE LIST> ) AND
C2 = literal

注意:请将本文所有示例中的 SKAPOOR 替换为您自己的模式。

这些示例是在如下所示的环境中测试的,使用的是 SAMPLE 数据库,SAMPLE 数据库可以通过执行 db2sampl
来创建:

本文转自IBM Developerworks中国

      请点击此处查看全文

 
 

抱歉!评论已关闭.