查询性能问题是用户在使用数据库时最关注的问题之一,同时也是 DB2 开发人员重点研究和改进的方向之一。DB2 V10.1 对查询性能进行了多方面的增强。本文将重点介绍 SQL 查询的快速性和可靠性的改进,涉及 PED,PEA,哈希排序以及统计信息的增强,并通过实例对
查询性能问题是用户在使用时最关注的问题之一。尤其对数据仓库的用户而言,大型报表的查询至关重要。DB2 V10.1 在 SQL 查询的快速性和可靠性上都有很大的改进。在快速性上,DB2 引擎通过对去重、聚合以及哈希连接的改进优化了查询性能,减少用户调优成本。在可靠性上,DB2 增强了统计信息收集功能,提高了优化器的准确性。本文将重点介绍上述改进,并通过实例对这些增强特性进行具体的讲解。
对常用 SQL 查询的增强
DB2 所有版本都非常关注 SQL 查询性能的优化,DB2 V10.1 包含了许多性能改进提高了许多常用 SQL 查询的速度。例如查询时通过部分提前去重(PED)、部分提前聚合(PEA)、在查询优化器中更广泛的应用哈希连接以及对统计信息的改进等这些方式来提高查询速度。这些算法的优化都是 DB2 V10.1 自动进行的,用户无需对其进行额外配置或者对 SQL 语句进行改变。虽然这些改进对用户而言是透明的,但是我们可以通过实例来观察这些新特性对查询的增强。
部分提前去重
PED(部分提前去重)是英文 Partial early distinct 的缩写,其核心是 : 通过哈希方法在查询过程中提前去掉大部分重复的行(做 distinct),这样在查询后期的操作(例如连接、排序等等)中涉及的数据量就会变小。例如在排序的时候,随着数据量的变小,相应的会降低耗尽排序堆内存的机会,在这种情况下,也就减少了使用相对较慢的磁盘来做临时缓冲区的概率。很明显,这种在查询中提前去重的做法会改进查询的效率。PED 并不会消除全部的重复行,因此查询结束前还需要做一次完整的 distinct 操作。
虽然 PED 对用户而言是透明的,但是我们可以通过查询 EXPLAIN_ARGUMENT 表来获知是否已经启用 PED。在 EXPLAIN_ARGUMENT 中引入了一个新值 (HASHED PARTIAL) 来表明某个查询是否应用了 PED:
清单 1 查看 EXPLAIN_ARGUMENT 表中 PED 的特征值
select distinct(argument_type), VARCHAR(argument_value,30) as argument_value from explain_argument where argument_type = 'UNIQUE' ARGUMENT_TYPE ARGUMENT_VALUE ------------- ------------------------------ UNIQUE FALSE UNIQUE HASHED PARTIAL UNIQUE TRUE 3 record(s) selected.
在上面的清单 1 中我们可以看到:从 EXPLAIN_ARGUMENT 表中查询到了 PED 的特征值 Unique 和 HASHED PARTIAL,这就表明已经有查询应用了 PED 特性。
下面我们通过使用 db2exfmt 工具来查看 PED 在一个具体查询中的应用情况:
首先我们打开 explain 模式:
db2 set current explain mode explain
然后执行我们所关注的 SQL 查询:
SELECT DISTINCT c11, c12, c21, c22 from t1, t2 where c11 = c21
最后关闭 explain 模式并且用 db2exfmt 工具来输出查询计划:
db2 set current explain mode no db2exfmt -d dbname -g TIC -w -1 -n % -s % -# 0 -o out1.txt
在我们前面用 db2exfmt 中获取的 out1.txt 文件中,我们可以看到如下清单 2 所展示的查询计划,其中 pUNIQUE即表明该查询在初期就已经进行了 distinct 操作,这就是应用了 PED 特性。
清单 2 应用了 PED 的查询计划
RETURN ( 1) Cost I/O | 40 TBSCAN ( 2) 427.872 15 | 40 SORT ( 3) 427.411 15 | 2029.53 HSJOIN ( 4) 278.035 15 /---+----\ 1001 20.275 TBSCAN pUNIQUE ( 5) ( 6) 135.161 132.519 8 7 | | 1001 801 TABLE: NEWTON TBSCAN TABLE1 ( 7) Q2 113.305 7 | 801 TABLE: NEWTON TABLE2 Q1
同时从 out1.txt 的后面部分,我们还可以看到清单 3 中的内容: PED 特性的特征值 Unique 和 HASHED PARTIAL。同时里面还包含了本次查询相关的系统资源开销,通过这些值的比较,我们可以获知应用 PED 特性后所带来的查询性能的提升效果。