数据架构师:DB2 数据仓库性能,第 2 部分:寻找有问题的 SQL 查询并进行调优
2009-11-16 00:00:00 来源:WEB开发网如果查询谓词中引用的列存在显著的数据值倾斜,那么要确保 DB2 了解这一情况,最好是使用 RUNSTATS 生成列值柱状图统计数据。在 DB2 for LUW 中早就可用的柱状图统计数据可以由 DB2 for z/OS V9 中的 RUNSTATS 生成。如果使用 DB2 for z/OS V8,可以使用 RUNSTATS 的 FREQVAL 选项)。注意,可以通过 Optimization Service Center for DB2 for z/OS 获得改进 DB2 for z/OS 编目统计数据的建议,从而改进查询(可以从 IBM.com 下载免费版本)。
如果您和 DB2 认为的最佳可用访问路径是一致的,但是这个路径不能提供让人满意的性能,那么需要向 DB2 提供新的访问路径选择。有几种方法,包括调整索引、使用物化查询表和表重聚簇。
与索引相关的操作可以减少 DB2 在生成查询结果集时必须检查的页面数量。可以在谓词引用的列上定义索引(如果还没有定义的话)。对于已经定义了索引的一组列,可以以不同的列次序定义新索引,从而增加 DB2 在执行与谓词相关的值匹配时使用的索引键列数量。(例如,对于复合谓词 COL_A > y AND COL_B = x,假设在 COL_A | COL_B 上已经有索引,那么可以在 COL_B | COL_A 上创建新索引,这让 DB2 可以匹配两个索引键列,而不是只匹配第一个键列)。可以在现有的索引中添加列,让查询处理的一部分只访问索引。
为查询提供更好的访问路径的另一种方法是使用 DB2 的物化查询表 (MQT) 功能。MQT 是通过 SELECT 语句定义的(通常是一个结果集),这样就不需要在执行查询时动态地构建这个结果集。MQT 有三个优点:
DB2 可以自动地重写查询以使用 MQT。
因为 MQT 中的结果集已经建立了,经过 DB2 重写访问这个 MQT 的查询不必在查询执行时花时间动态地构建结果集,这会显著降低运行时间。
可以在 MQT 上定义索引,这会进一步提高查询性能。表重聚簇是向 DB2 提供更好的访问路径的另一种方法,这会减少 DB2 在执行查询时必须检查的页面数量。数据聚簇对于数据仓库查询性能的影响尤其显著,因为常常在一个查询中获取许多行。如果表原来按账号列聚簇,但是后来发现用户常常按日期范围从表中获取行,就可以考虑改变表的聚簇次序,让获取的行在表中的位置相互接近。另外,如果联结的表都按联结列的次序聚簇,联结操作的性能也可能显著提高(例如,当联结谓词是 TABLE_A.CUSTOMER_ID = TABLE_B.CUSTOMER_ID 时,按 CUSTOMER_ID 聚簇)。
一定要记住,如果决定对表进行重聚簇,在 DB2 for z/OS V9 上可以通过 ALTER INDEX 语句的新选项 CLUSTER 和 NOT CLUSTER 大大简化这一操作。如果对表进行重聚簇,一定要考虑利用最近几个 DB2 版本中提供的与聚簇相关的改进,比如 DB2 for LUW 中的多维聚簇,以及在 DB2 for z/OS 环境中按一个键进行表分区,在分区内按另一个键聚簇的功能。
希望您的数据仓库查询调优取得良好的效果。业务智能化是近来的热门领域,有助于利用各种机会为您的组织提供真正的价值。
更多精彩
赞助商链接