使用预编译器的优化器
SQL编译程序可执行三种主要类别的重写:操作合并、操作移动、谓词转换。
你可以从下面所述的任何查询优化级别中进行选择,级别0与级别9应该只用于特殊的情况。级别5是缺省值。级别0、1和2使用贪婪联合枚举算法;对于复杂的查询,与级别3和更高的级别相比,此算法考虑的替代方案少得多,并且编译时间也显著减少。级别3和更高的级别使用“动态规划”联合枚举算法;随着表的数量增加,与级别0、1和2相比,此算法考虑的替代方案多得多,并且编译时间也显著增加。你可以选择以下七个优化级别中的任何一个。
1、0级别
在预编译一个SQL查询时,此级别指导优化器使用最少的优化来生成存取方案。例如:
优化器不考虑任何非均匀分布统计。
仅应用基本的查询重写(查看由SQL编译程序重写查询以获取关于查询重写的信息)。
发生贪婪联合枚举(查看选择最优化连接的搜索策略)。
仅允许使用嵌套循环连接及索引扫描存取方法(参与连接概念和索引扫描概念)。
禁止列表预读取和索引AND运算,以使它们不会被用在生成的存取方法中。
不考虑星形连接策略。
此级别应该只用于需要最低的查询编译额外开销的特殊情况,例如一个仅包含很简单的SQL语句(这些SQL语句存取经过良好索引的表)的应用程序。
2、1级别
在预编译一个SQL查询时,这一级别引导优化器使用查询重写规则的一个子集。此级别优化器使用一定程度的优化。大致相当于DB2/2和DB2/6000版本1中的重写查询规则,再加上一些版本1中没有的附加的低成本优化功能部件。特别是:
优化器不考虑任何非均匀分布统计。
只应用查询重写规则的一个子集,包括在DB2/6000版本1中提供的确良那些规则。
贪婪联合枚举。
禁止列表预读取和索引AND运算,以使它们不会被用在生成的存取方法中。
注意:当使用随星型连接一起的半连接时,仍使用索引AND运算。
除了“合并扫描”连接及表扫描也可用以外,优化级别1十分类似于级别0
3、2级别
此级别指导优化器例用查询重写规则的一个子集,它显著改善了级别1的优化程度。同时使用复杂查询的编译成本显著低于级别3及更高级别(即:这个子集比由DB2 1.0版提供的要大,但是大大小于第三级或更高级别所使用的子集)。特别是:
使用了所有可用的统计信息,包括频率和分位数非均匀分布统计信息。
应用了所有查询重写规则,只适用于极少情况的密集型计算机规则除外。
使用了贪婪联合枚举。
考虑了大量的存取方法,包括列表预读取。
如果适用的话,考虑星形连接策略。
优化级别2除了使用贪婪联合枚举而不是“动态规划”以外,十分类似于级别5。在所有使用贪婪联合枚举算法的优化级别中,此级别具有最高的优化程度,与级别3及更高级别相比,它对复杂查询的替代方案老虎较少,因面消耗的编译时间也少。因此建议将它用于决策支持或联机分析处理(OLAP)环境中非常复杂的查询。在这种情况下,很有可能偶尔执行同一查询,因此其存取方案不大可能在调整缓存中停留到出现下一个查询为止。
4、3级别
在预编译SQL查询时,此级别引导优化器使用大多数查询重写规则。当实施优化时,此级别包含了组合内部表的有限使用、笛卡尔乘积的有限使用。此级别适用于大量应用程序。并且与DB2 MVS/ESA版或OS/390版的查询优化特性基本相当。此级别具有下列特性:
1)使用非均匀分布统计,该统计跟踪频繁出现的值(如果可用的话)。
2)应用大部分查询重写规则,包括子查询至连接的转换。
3)动态规划联合枚举。
4)考虑各种存取方法,包括列表预读取、索引AND运算和星形连接。
5、5级别
此级别将引导优化器使用极大数优化来生成存取方案。这一级别非常适合于以下的情况:存在一个或一个以上的包含某些记录属性的编码的中央大表,并且中央表还连接着一些较小的、用于得到这些编码值的“搜索”表。在预编译SQL查询时,这一级别可以引导优化器使用绝大数的查询重写规则。此级别包含了(动态规划)联合枚举(包括笛卡乘积的有限使用)。
对于由事务和复杂查询组成的混合环境,查询优化级别5是一个很好的选择。此优化级别被设计为可以用高效的方式应用最有价值的查询转换和其他查询优化技术。
6、7级别
此级别引导优化器使用相当大量的优化来生成存取方案。级别7除了不减少用于复杂SQL查询的查询优化量以外,它与查询优化级别5是相同的。
7、9级别
在预编译SQL查询的时候。此级别引导优化器使用所有可用的优化技术。这些技术包括:
1)所有可用的统计信息
2)所有查询重写规则。
3)联合枚举的所有可能性,包括笛尔乘积和任意多种组合的内部结构。
4)所有存以方法。
此级别应该仅仅在特殊的情况下使用,如访问大表的很复杂、运行时间很长的查询。当实施优化时,这一类型也将具体表现为连接列举,包括对合成内部表和笛卡儿积的充分使用。