科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道调优 IBM DB2 UDB SQL 存取路径

调优 IBM DB2 UDB SQL 存取路径

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

Visual Explain 是 IBM? DB2? Universal Database? 中的杰出工具,程序员和 DBA 用它来详细说明 DB2 优化器为 SQL 语句所选择的存取路径。

作者:Craig S. Mullins 来源:论坛整理 2007年11月17日

关键字: DB2

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共2页)

用优化等级指定搜索策略

  连接方法的选择还取决于正在使用的优化等级。优化等级指定了各种搜索策略,当编译和优化 SQL 语句时,优化器将使用这些策略。所以,优化器并非总是使用上面所描述的每种存取路径技术。相反,根据优化等级,优化器使用各种不同的技术。优化等级的用途是通过它来指导 DB2 何时采用哪种搜索策略和优化技术。通常,优化器考虑的搜索策略越多,用于查询的存取方案就越好。然而,当优化器被指导去考虑的搜索策略越多,把 SQL 编译成可执行的存取路径的时间就越长。幸运的是,可以设置优化等级来限制优化查询时所应用的技术数目。对于较简单的查询、资源受限系统和动态 SQL,这是非常有用的。表 1 概括了优化等级。

  表 1. DB2 优化等级。

 等级  描述
 0       指导优化器使用最少的优化来生成存取方案。只可使用嵌套循环连接和索引扫描访问方法。限制使用统计信息(例如,不考虑非一致性分布统计)。
 1  类似于等级 0,但添加了归并连接、表扫描和非常基本的查询重写(再加一些额外的特性)。
 3  极大地改进了等级 1,但比等级 3 所付出的编译代价要低得多。这个等级利用了所有可用的统计信息、大多数查询重写规则、列表预取装和汇总表路由。类似于等级 5,但它使用贪婪的连接枚举(Greedy join enumeration),而不是动态编程。
 5  该等级最接近于 DB2 for OS/390® 所采用的查询优化。它提供了中等数量的优化,需要中等数量资源来编译。
 7  提供了极多的优化,需要比等级 3 更多的资源来编译。优化器智能地确定何时不保证额外资源用于动态 SQL。对于兼有复杂和较简单的查询这种混合情形,等级 5 是很好的选择。
 9  该等级类似于等级 5,但它添加了一些在等级 5 中不可用的优化技术。该等级不会确定对于动态 SQL 什么时候会出现额外资源不足。
 0  使用所有可用的优化技术。

  虽然可以选择上表中所描述的任何查询优化等级,但只有很少一些情形才会使用等级 0 和 9。等级 0、1 和 2 使用贪婪连接枚举算法;对于复杂查询,这个算法与等级 3 及其之上的等级相比,考虑的备用计划极少,因此编译时间也少得多 。等级 3 和这之上的等级使用动态编程连接枚举(Dynamic Programming join enumeration)算法;这个算法与等级 0、1 和 2 相比,考虑的备用计划更多,这可能促成需要极其多的编译时间。

  设定具体的查询优化等级方式取决于是使用静态 SQL 还是使用动态 SQL。对于静态 SQL 语句,在 PREP 和 BIND 命令上指定优化等级。SYSCAT.PACKAGES 目录表中的 QUERYOPT 列记录了用于绑定包的优化等级。动态 SQL 语句使用由 CURRENT QUERY OPTIMIZATION 专用寄存器指定的优化等级,可以用 SQL SET 语句来设置 CURRENT QUERY OPTIMIZATION。

  最后,让我总结一下两类搜索策略及其特征。第一类,贪婪连接枚举,等级 0、1 和 2 使用该算法。使用贪婪连接枚举时,对于两个表,一旦选定连接方法之后,在进一步的优化期间,不会更改连接方法。所以,当连接许多表时,这种策略所选择的可能不是绝对最佳的存取方案。对于仅连接几个表的查询而言,另一类搜索策略(动态编程连接枚举)所选定的存取方案极有可能与贪婪连接枚举所选定的存取方案相同。随着正在连接的表的数目增加,动态编程连接枚举将需要更多的时间和资源。这比贪婪连接枚举更有可能选出最佳存取方案。

  使用 Visual Explain

  既然我们已经基本掌握了 DB2 可以选择以实现 SQL 请求的存取路径,那么,让我们讨论如何弄清楚 DB2 对这些查询使用了哪种存取路径。可以使用 explain 来做到这一点。explain 可以用于单个的 SQL 语句或者包中一系列 SQL 语句。当然,在“说明”包时,只会“说明”静态 SQL。对于 Delphi,这是没有帮助的,正如前面所提到的,这是因为所有 SQL 是动态的,而不是静态的。

  当请求 explain 时,通过 DB2 优化器传递 SQL 语句,并将 DB2 所选定的存取路径以代码格式外部化成一组 DB2 explain 表。explain 表只不过是标准的 DB2 表,必须用预先确定的列、数据类型和长度来定义这些表。但是,请记住,explain 表不是自动创建的。为了使用 explain,您(或者您的 DBA)必须首先创建这些 explain 表。可以在安装了 DB2 的 sqllib 目录的 misc 子目录中找到名为 explain.ddl 的 DB2 CLP 脚本。执行该脚本将会创建 explain 表。一旦成功地创建了 explain 表之后,可以用几个选项来“说明”DB2 存取路径。

  Visual Explain 是最方便的方法,因为可以用带有简单的点击式命令和下拉菜单的 GUI 来访问它(请参阅 图 2)。可以作为单独的工具或者从 DB2 命令中心来访问 Visual Explain。Visual Explain 的主要好处是它提供了存取路径的图形化描述,所以不需要理解 explain 表中的代码信息。每个存取路径操作都被置于树状结构中带颜色的代码节点。在节点上,简单地移动鼠标,并单击鼠标,就可以显示存取路径中该部分的参数、统计信息和成本估计。还可以用 db2vexp.exe 命令从命令行运行 Visual Explain。

  图 2. Visual Explain GUI

  Visual Explain GUI

  图 2中的这个示例显示了 DB2 使用索引 PK_15 的索引扫描来选择 ATTRIBUTE_REGION 表中的数据。单击节点,可以获得其它一些有关存取路径每个部分中各组成部分的详细信息。正如我们在前面有关存取路径一节中所讨论的,将有表示扫描、索引式访问和排序的节点。图 3 显示了单击 IXSCAN 节点后的结果。我们可以看到将对 REGION_TYPE_ID 列进行索引扫描。通过查看 explain 的输出,可以方便地确定 DB2 将用于实现每条 SQL 查询的存取路径(请参阅图 3)。

  图 3. Visual Explain 详细信息

  Visual Explain 详细信息

  如果没有象 Visual Explain 这样的工具来提供易于阅读的存取路径信息,则需要一个手工过程。而且,必须能够解释 explain 表中的代码信息,以理解手工 explain 的输出。有了 Visual Explain,就不需要您亲自关注 explain 表的实际格式或内容 — 这个工具会为您做所有这一切。

  DB2 还提供其它 EXPLAIN 工具。其中包括 db2expln,它是这样一种“基石”工具:仅为静态包提供存取路径的文本描述。对于 Delphi,该工具没有用;相反,您可能选择用 dynexpln,它提供了动态 SQL 查询的文本分析。dynexpln 工具将打包动态查询,然后调用 db2expln 来做这项工作。但是,一般情况下,请坚持使用 Visual Explain,因为它更易于使用,并且提供了调优 SQL 所需的基本信息。

  对于 Delphi 用户,好的经验规则是使用 Visual Explain 来显示 Delphi 程序中 SQL SELECT 语句的存取路径。对于大多数 SELECT 语句,请尝试使用索引式访问。要做到这一点,可以创建其它索引(在生产环境中,只有在 DBA 的指导下才能这样做),或者修改 SQL 语句以包含可索引的谓词。分析正在使用的连接方法,理解其中的含义。例如,归并扫描连接需要排序吗?这是可以接受的,还是性能会受到影响?

  请记住,的结果仅仅相当于 DB2 系统目录中的统计信息。在使用 explain 之前,请确保 DB2 系统目录统计信息是最新的。在系统目录中,DB2 表、索引和列的精确统计信息有助于优化器选择有效的存取方案。如果最近没有收集统计信息,则在运行 explain 之前,验证这些信息是否仍合适。

  最后,要意识到还有一些方面这里未讨论到,它们都是做好 SQL 调优工作所必需的。要正确分析 SQL 性能,需要的内容将不仅仅是 explain 结果。正确的性能分析需要:

  • 实际的 SQL 语句
  • 正在被访问和/或修改的对象的 DDL(或系统目录信息)的列表
  • 内嵌 SQL 语句的 Delphi 代码
  • 在执行 explain 时,存在当前的系统目录统计信息
  • 了解将执行 SQL 语句的 DB2 环境(包括缓冲区和锁定参数等设置)
  • 了解正在运行 SQL 的环境(包括操作系统、处理器的数目和类型以及内存大小等)
  • 了解在执行(或将要执行)SQL 语句时,系统中的并发活动

  可以将这些附加信息和 explain 输出一起使用,以估计任何给定 SQL 语句的性能。Delphi 代码很重要,它可以帮助您调节应用程序性能,因为 explain 不能提供有关内嵌 SQL 的高级语言的信息。explain 输出可以显示 SQL 语句的有效存取路径,不过,如果 SQL 语句嵌入在运行数千次的循环中,则性能很可能会受到影响。

  使用 explain 来帮助确保索引被正确地用于连接谓词、本地谓词以及 GROUP BY 和 ORDER BY 子句,以避免排序。而且,应用您对表中数据的了解来确定正采用的连接类型是否正确,以及正在用于连接的内表和外表的表是否正确。对这些类型细节的注意会因优化的应用程序和较慢执行者的不同而不同。

  结束语

  有效地使用 Visual Explain 工具可以帮助 Delphi 程序员了解正在用于实现 DB2 SQL 请求的存取路径。有许多可供 DB2 选择的技术来实现对数据的请求 — 其中一些技术比其它技术要有效得多。博学的 Delphi 程序员可以使用 explain 来优化其代码,从而能有效地访问 DB2 数据。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章