热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

介绍DB210中SQL查询的快速性和可靠性改进

查询性能问题是用户在使用数据库时最关注的问题之一,同时也是DB2开发人员重点研究和改进的方向之一。DB2V10.1对查询性能进行了多方面的增强。本文将重点介绍SQL查询的快速性和可靠性的改进,涉及PED,PEA,哈希排序以及统计信息的增强,并通过实例对

查询性能问题是用户在使用数据库时最关注的问题之一,同时也是 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:

  • 列:ARGUMENT_TYPE = UNIQUE 统
  • 并且列:ARGUMENT_VALUE = 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 特性后所带来的查询性能的提升效果。

推荐阅读
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 非公版RTX 3080显卡的革新与亮点
    本文深入探讨了图形显卡的进化历程,重点介绍了非公版RTX 3080显卡的技术特点和创新设计。 ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Søren Kierkegaard famously stated that life can only be understood in retrospect but must be lived moving forward. This perspective delves into the intricate relationship between our lived experiences and our reflections on them. ... [详细]
  • 计算机网络复习:第五章 网络层控制平面
    本文探讨了网络层的控制平面,包括转发和路由选择的基本原理。转发在数据平面上实现,通过配置路由器中的转发表完成;而路由选择则在控制平面上进行,涉及路由器中路由表的配置与更新。此外,文章还介绍了ICMP协议、两种控制平面的实现方法、路由选择算法及其分类等内容。 ... [详细]
  • 本文将介绍如何使用 Go 语言编写和运行一个简单的“Hello, World!”程序。内容涵盖开发环境配置、代码结构解析及执行步骤。 ... [详细]
  • 线性Kalman滤波器在多自由度车辆悬架主动控制中的应用研究
    本文探讨了线性Kalman滤波器(LKF)在不同自由度(2、4、7)的车辆悬架系统中进行主动控制的应用。通过详细的仿真分析,展示了LKF在提升悬架性能方面的潜力,并总结了调参过程中的关键要点。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 本文介绍如何利用动态规划算法解决经典的0-1背包问题。通过具体实例和代码实现,详细解释了在给定容量的背包中选择若干物品以最大化总价值的过程。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
author-avatar
家有吃货_魏ranran
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有