DB2 Magazine是一种专门针对数据库管理员、分析员、程序员、设计师、顾问以及MIS/DP经理的季刊,其内容涵盖了所有DB2平台(包括IBM AIX、Hewlett-Packard HP-UX、Sun Solaris、SCO UnixWare、Linux、Microsoft Windows NT、Microsoft Windows 95、Microsoft Windows 98、IBM OS/2、IBM OS/400、IBM MVS、IBM OS/390、IBM VM 和 IBM VSE)的各种主题。
为了从DB2 Information Integrator获得最佳性能,DBA需要知道哪些东西。
大多数DBA都知道,对于性能低下的SQL查询,为了发现、评估和实施有助于改善其性能的改进方法,需要完成哪些任务。然而对于联邦查询,DBA 必须学习新的技巧,拓宽一般情况下的查询调优任务列表,以便处理由DB2 Information Integrator (DB2 II) 提供的新功能。
DB2 II 支持跨多种数据源的联邦查询,这些数据源包括 SQL Server、Oracle、Informix、Sybase 和 DB2 Universal Database (UDB) for z/OS,以及 iSeries、Linux、Unix 和 Window。DB2 II 产品是一个中间件,其中包含的优化和数据访问技术,充分调动了底层数据源的能力,并为这些不同的源提供一种统一访问语言(SQL)。
DB2 II 产品已经为那些之前不能访问或者不易访问的信息源敞开了大门。尽管如此,随着每一项新的数据支持技术的出现,新的调优机会也应运而生。使用 DB2 II 并不确保最优执行每一个查询。DBA 要做的工作,仍然是发现和调优性能低下的查询。
联邦对象带来了新的挑战。在这一期,我将解释调优联邦查询时所需的任务和工具。本文假设您对 DB2 II 有一个基本的了解。您可以通过在参考资料小节中列出的文章,或者通过 ibm.com/software/data/integration 温习 DB2 II 方面的知识。如果您想了解 Merrill Lynch(我的雇主),是如何利用 DB2 II 解决现实生活中的业务问题的,请参阅文章 "Taming the Beast"。
基本调优任务
对任何性能低下的 SQL 语句进行调优都需要一种有条不紊的方法。毫无计划地更改参数只能让每一次做出的更改难于判断效果。如果某一次更改对性能起了反作用,那么您需要知道应该退回到哪一次更改。
不管调优什么 SQL,都应该执行以下任务:
评估当前性能,并记录到文档。
与创建查询的人会谈,并得出合理的性能预期。
建立查询的业务目标。
对于来自生产系统的查询,获得一个 Explain 计划。
如果可行的话,在测试系统上重建环境,并重新运行查询。
对于与查询相关的所有表,确信最近在这些表上执行了 Runstats 或与之等价的远程命令。
确保各个表的重组,以匹配它们的集群索引。
查找 WHERE 子句中索引列上的 SQL 函数,这些函数可能导致优化器忽略了索引。
确保在 WHERE 子句中尽可能使用索引列。
查找笛卡儿积(Cartesian products)。
跟踪每一项更改的效果,每次跟踪一项。
联邦调优任务
由于联邦查询连接到了不同的数据源,调优的第一步是将查询分解为两部分:本地和远程。本地部分使用驻留在 DB2 II 服务器上的对象,而远程部分使用驻留在远程主机上的对象。通过这种方式划分联邦查询,有助于判断影响性能问题的根源。
DB2 II 服务器中的所有联邦对象在 syscat.tables 编目表中都是以昵称(TYPE=N)的形式标识的。也可以通过 EXPLAIN 命令识别查询中的联邦对象,该命令将显示 DB2 II 引擎选择的全局访问计划。EXPLAIN 命令的输出是判断优化器是否将为查询使用“叠加(push-down)”处理(即在远程服务器上执行的处理)的惟一途径。DB2 II 使用来自包装器、服务器和昵称对象的信息,来判断什么任务可以叠加到远程服务器。
清单 1 展示了一个存储在 db2ii-query.sql 文件中的联邦查询的实例。以粗体标记的表(mids.tbacct 和 mids.tbacct -hldr)上的查询引用了远程对象。而表 table hjg.iitbl 则是在 DB2 II 服务器本地。Explain 将把这个查询分解成几个部分。对于将要使用叠加处理的部分,以 ship 这个词标记。清单 2 展示了 Explain 输出的一个缩节本。优化器将子查询 #1 标记为“shipable”。
清单 1. 联邦 SQL 查询
db2expln -d dbdsdr -stmtfile db2ii-query.sql -o db2ii-query.out -terminator ";" -g
select a.dsssca-no
, a.dssas-ty-cd
, imlp-1st-nm
, imlp-lst-nm
, mlp-st-cd
ac-eom-ast-am
from mids.tbacct a
, mids.tbacct-hldr ah
,hjg.iitbl
where a.dsssca-no =ah.dsssca-no
and ac-eom-ast-am > 1000000
and st-cd =mlp-st-cd and-mlp-st cd ='ny'
fetch first 1 rows only
清单 2. Explain 输出,其中标记了要做叠加处理的查询
| Ship Distributed Subquery #1
| | #Columns = 6
Return Data to Application
| #Columns = 6
查询的这个部分由优化器生成,其中只包含那些访问远程数据源的对象。清单 3 展示了 Explain 输出的一部分,其中有重写后的查询。这个清单中的输出含有关于查询的信息,包括将被发送到远程数据源的 SQL、使用的昵称以及远程服务器的名称及相关版本(在这里是 MIDASP)。如果您对完整的 Explain 输出有兴趣的话,请下载文件: IBM DB2 Universal Database SQL Explain Tool (DOC, 30K)。
清单 3. 优化器重写的访问远程对象的查询。Distributed Substatement #1:
Server: MIDASP (DB2/UDB 7.1)
SQL Statement:
SELECT A0."DSSSCA-NO", A0."AC-EOM-AST-AM", A0."DSSAS-TY-CD", A1."MLP-ST- CD", A1."IMLP-1ST-NM", A1."IMLP-LST-NM"
FROM "MIDS"."TBACCT" A0, "MIDS"."TBACCT-HLDR" A1
WHERE (1000000 < A0."AC-EOM-AST-AM") AND (A1."MLP-ST-CD" ='NY') AND (A0."DSSSCA-NO" =A1."DSSSCA-NO") FOR READ ONLY
Nicknames Referenced:
MIDS.TBACCT-HLDR ID = 33125
Base = MIDS.TBACCT-HLDR
MIDS.TBACCT ID = 33124
Base = MIDS.TBACCT