调优IBM DB2 UDB SQL存取路径

简介

Visual Explain 是 IBM DB2 Universal Database 中的杰出工具,程序员和 DBA 用它来详细说明 DB2 优化器为 SQL 语句所选择的存取路径。事实上,Explain 应该是您性能监控策略的 关键组件。Explain 为解决许多类型的性能问题提供了价值无法估量的信息,因为它提供这样的细节:

DB2 在“幕后”所做的工作,以实现 SQL 请求的数据需求

DB2 是否使用可用的索引,如果使用,DB2 如何使用它们

为满足连接条件而访问 DB2 表的次序

实现 SQL 语句的锁定需求

基于所选存取路径的 SQL 语句的性能

对于 Borland Delphi 7 程序员,Visual Explain 会是一个用于发现 DB2 如何执行 SQL 请求的神奇资源。Delphi 使用 CLI 本机接口来与 DB2 交互。因而,Delphi 使用的是动态 SQL。当 将 SQL 语句提交给 DB2 执行时,DB2 会“实时”地为动态 SQL 语句设计出存取路径。对分 析者而言,在执行每条 SQL 语句之前,无法检查 DB2 为这些语句所选择的存取路径。所以,使用 Visual Explain 定期地检查 DB2 为所有 Delphi SQL 语句所选择的存取路径,这是很有意义的。这样做 可以观察到哪些语句消耗了大部分资源。另外,还可以指导您如何调优 SQL 以达到更好的性能。

但在深入探讨 explain 的用法之前,我首先需要研究 explain 确切地“说明”了什么。 答案很简单,它说明了 DB2 存取路径。存取路径是 DB2 所使用的一种算法,以满足 SQL 语句的需求。 但有大量各种类型的存取路径需要掌握。

DB2 存取路径的类型及其组成部分

当 DB2 优化器为每条 SQL 语句创建优化的存取路径时,可以挑选各种不同的技术。这些技术包括从 简单的一连串顺序读到更为复杂的策略(譬如,使用多个索引来访问数据)。让我们来了解优化器用来设 计 DB2 存取路径的一些最常用技术。

在优化器必须做的许多决定中,最重要的决定可能是,是否使用索引来实现查询。在优化器做此项决 定之前,它必须首先确定是否存在索引。请记住,您可以查询任何表中的任何列,却不能期望单单通过索 引就能做到这一点。所以,优化器必须能够访问未建立索引的数据;它可以使用扫描来做到这一点。

在大多数情形下,DB2 优化器喜欢使用索引。这是事实,因为索引可以大大优化数据检索。然而,如 果不存在索引,就无法使用它了。并且在某些情况下仅仅使用数据的全扫描就可以极好地实现某些类型的 SQL 语句。例如,考虑下面这条 SQL 语句:

SELECT * FROM EMP;

在这条语句中,为什么 DB2 非要试图使用索引呢?这里没有 WHERE 子句,所以全扫描是最佳的。即 使指定了 WHERE 子句,优化器也可能确定页面的顺序扫描要比索引式检索更好 — 所以可能不会选 择索引式检索这种方法。

存在索引的首要原因是它可以改善性能,那为什么非索引式的访问会比索引式的访问要好?唔,索引 式访问可能比简单的扫描要慢。例如,一个非常小的表可能只有几个页面。读取所有的页面可能比先读取 索引页然后再读取数据页要快。甚至对于较大的表,在某些情况下,组织索引可能需要额外的 I/O 以实 现查询。当不使用索引来实现查询时,产生的存取路径会采用表扫描(或表空间扫描)方法。

表扫描通常会读取表中每个页面。但在某些情况下,DB2 会非常聪明,它会限定要扫描的页面。此外 ,DB2 可以调用顺序预取以在请求某些页面之前就读取这些页面。当 SQL 请求需要按照数据存储在磁盘 上的顺序来顺序地访问多行数据时,顺序预取特别有用。当优化器确定查询将按照顺序读取数据页面时, 它会通知应该启用顺序预取。表扫描常常得益于顺序预取所作的提前读取的工作,因为当某个查询请求数 据时,这些数据已经放在内存中了。

时间: 2024-10-28 06:31:30

调优IBM DB2 UDB SQL存取路径的相关文章

《T-SQL性能调优秘笈——基于SQL Server 2012 窗口函数》——1.1 窗口函数的背景

1.1 窗口函数的背景 T-SQL性能调优秘笈--基于SQL Server 2012 窗口函数 在开始学习具体的窗口函数之前,先了解其背景和内涵,会对后续的学习有所帮助.本节先谈谈窗口函数的背景,解释基于集合方式和基于游标/迭代方式进行查询的不同,以及窗口函数如何对二者的差异进行弥补.最后,本节也提到了窗口函数的替代方法,以及为什么窗口函数会优于其替代方法.注意,尽管窗口函数能非常高效地解决很多问题,但在某些案例中,替代方法会好于窗口函数.第4章会具体谈论对窗口函数的优化,解释在什么情况下,计算

《T-SQL性能调优秘笈——基于SQL Server 2012 窗口函数》导读

前言 T-SQL性能调优秘笈--基于SQL Server 2012 窗口函数 对我而言,窗口函数是标准SQL和Microsoft SQL Server的语言(T-SQL)所支持的最深奥的特性.它们使得我们可以针对一组数据行进行灵活.清晰而且高效的操作.窗口函数的设计极富创意,克服了传统替代方式的种种不足.窗口函数可以解决的问题非常之广,值得我们投入时间认真学习.SQL Server 2005开始引入窗口函数,SQL Server 2012对已有函数进行了增强,并增加了一些新的函数.本书既覆盖由S

《T-SQL性能调优秘笈——基于SQL Server 2012 窗口函数》——1.7 小结

1.7 小结 T-SQL性能调优秘笈--基于SQL Server 2012 窗口函数 本章介绍了SQL中窗口的概念,提供了窗口函数的背景,解释了人们使用窗口函数的动机.本章随后提供了一个使用窗口函数完成查询任务的案例简介--标识序列中存在的值的区间--又称为标识数据岛.然后本章对窗口函数的设计进行了解释,包括窗口描述中涉及的元素:分区.排序.框架.最后,本章解释了标准SQL如何解决窗口描述或部分描述的重复使用问题.第2章将对窗口函数进行分别讲解,进入更多的细节. 本文仅用于学习和交流目的,不代表

《T-SQL性能调优秘笈——基于SQL Server 2012 窗口函数》——1.6 窗口定义的重复使用

1.6 窗口定义的重复使用 T-SQL性能调优秘笈--基于SQL Server 2012 窗口函数 假设我们需要在同一个查询中调用多个窗口函数,并且部分窗口描述(或所有描述)适用于多个函数.如果我们在所有函数中都给出完整的窗口描述,代码的长度会急速增加,从下面的示例中可以看到问题: 标准SQL对此有解决方法,它有一个叫做WINDOW的子句,允许我们对窗口描述或部分窗口描述进行命名:然后在定义其他窗口--即将被窗口函数使用或用来定义另一个命名窗口时,指代这个命名的窗口描述.从概念上来说,这个子句在

《T-SQL性能调优秘笈——基于SQL Server 2012 窗口函数》——1.5 潜在的额外筛选器

1.5 潜在的额外筛选器 T-SQL性能调优秘笈--基于SQL Server 2012 窗口函数 上面提供T-SQL中的一个变通方法,它可以在不直接支持窗口函数的查询元素里,间接地使用窗口函数.这个变通的方法就是CTE形式的表表达式或派生表.有变通方法当然很好,但表表达式给查询增加了一个层次,也增加了其复杂性.我展示的那些示例都很简单,但可以想象一下,如果本身的查询已经很长和复杂,这样做确实会增加难度.是否有更简单的方法,无须增加查询的层次就可达到目的? 对于窗口函数,SQL Server目前还

《T-SQL性能调优秘笈——基于SQL Server 2012 窗口函数》——1.3 窗口函数中的元素

1.3 窗口函数中的元素 T-SQL性能调优秘笈--基于SQL Server 2012 窗口函数 窗口函数的行为描述出现在函数的OVER子句中,并涉及多个元素.3个核心元素是分区.排序和框架.不是所有的窗口函数都支持这3个元素.本节在介绍每个元素时会指出支持它的函数. 1.3.1 分区 分区元素由PARTITION BY子句定义,并被所有的窗口函数支持.它对当前计算的窗口进行限制,仅仅那些在结果集的分区列中与当前行有相同值的行才能进入窗口.例如,如果函数使用PARTITION BY custid

《T-SQL性能调优秘笈——基于SQL Server 2012 窗口函数》——1.4 支持窗口函数的查询元素

1.4 支持窗口函数的查询元素 T-SQL性能调优秘笈--基于SQL Server 2012 窗口函数 并不是所有的查询子句都支持窗口函数,相反,仅仅SELECT和ORDER BY子句支持窗口函数.为了帮助大家理解这个约束的原因,我首先要解释查询逻辑处理的概念.然后,我会介绍支持窗口函数的子句,最后,解释如何在其他子句中避开约束. 1.4.1 查询逻辑处理 查询逻辑处理从概念性的角度描述SELECT查询是如何根据逻辑语言的设计进行判断的.它描述了怎样由查询的输入表,经由一系列步骤和阶段,直到查询

《T-SQL性能调优秘笈——基于SQL Server 2012 窗口函数》——1.2 使用窗口函数的解决方案简介

1.2 使用窗口函数的解决方案简介 T-SQL性能调优秘笈--基于SQL Server 2012 窗口函数 本书前4章描述了窗口函数及其优化,所选素材偏重技术说明,虽然我自己觉得很吸引人,但可以想见,有些人会觉得有点沉闷.通常来说,人们在阅读用窗口函数解决现实问题的内容时,会觉得比较有趣,本书将在最后一章满足大家.只有当我们看到能如何用窗口函数解决难题时,才会真正认识到它们的价值.所以,我在思考如何说服你在读到有趣的章节之前,能坚持读完这些枯燥的技术说明而不中途放弃.也许我可以展示一个窗口函数解

ORACLE应用调优:请避免SQL做大量循环逻辑处理

     前阵子遇到一个案例:一个同事说以前一个运行很正常的包,突然间比以前慢了很多,执行时间非常长,晚上的作业调用这个包跑了几个小时也没有跑出数据.于是 我在跟踪.优化过程中定位到包中一个存储过程的一段SQL,我将原SQL简化了一下(对应的表名.函数全都随机取名替换掉),大体如下所示,在一个游标 中,循环更新表TMP_JO_ORDERS, 其中需要通过函数获取一些值,这些值用来更新目标表的字段值   FOR CUR_JO IN (SELECT JOB_ORDER_NO FROM TMP_JO_