文档库 最新最全的文档下载
当前位置:文档库 › SQL-7

SQL-7

SQL-7
SQL-7

第二十章测试

这章介绍如何为应用程序中的SQL语句建立一个测试环境,及怎样调试程序。

20.1 建立测试环境

测试应用程序必须做以下事情:

授权。你需要有建立表和视图,访问SQL数据及运行程序的权限。

测试数据结构。如果要在表和视图中更改、插入或者删除数据,应该测试数据去鉴定程序的运行。如果程序仅仅从表和视图中获得数据,那么在测试程序时应考虑用产品级数据,建议使用CL命令STRDBG及UPDPROD(*NO)可以保证产品级数据不会改变。详细内容请看CL 程序设计手册。

测试输入数据。测试程序用的输入数据的有效性及所想要的输入可能的条件,如果输入数据无效就不能够保证输出数据有效。

如果程序验证输入数据有效,包括验证有效数据和无效数据,那么处理有效数据,将无效数据查出来。

可在后续测试中刷新数据。

为了彻底地测试程序,应尽可能的使用更多的途径来测试程序。例如:

用输入数据迫使程序运行到其每个分支。

检查结果,例如程序要更新一行,要选择这一行来看更新是否正确。

一定要测试程序的错误例程,再用输入数据使程序尽可能多的接触到可能存在的

错误。

测试程序用的编辑和有效的例程。向程序提供尽可能多的不同组合的输入数据以

便尽可能地验证,是否正确编辑数据的有效性。

20.1.1 设计测试数据结构

要测试访问SQL数据的应用程序,可以生成测试的表和视图:

测试现存表的视图。如果应用程序不是修改数据且数据在一个或多个产品级表中存在,那么应该考虑使用现存表的视图。建议你使用SRTDBG命令及UPDPROD(*NO)参数来保证产品级数据不会改变。

测试表。当应用程序生成、修改或者删除数据时,可用包含测试数据的表来测试应用程序。

可用CL命令CRTDUPOBJ来生成一个测试表或索引的复本。

20.1.1.1 权限

在建立一个表之前,你必须有建立表和使用表所在集合的权限,另外也必须有权建立和执行你想要测试的程序。

如果想使用现存的表和视图,必须有权访问这些表及视图。

如果想建一个视图,必须有权建立视图和有权使用该视图所依赖的每个表,详细信息请看AS/400 DB2 SQL参考。

20.2 测试SQL应用程序

测试SQL应用程序有两段:程序调试段和性能验证段。

20.2.1 程序调试段

这段保证SQL查询是正确的,并且程序产生正确的结果。

调试有SQL语句的程序和没有SQL语句的程序,大部分是一样的。但是,当SQL语句在调试方式下运行时,数据库管理器把运行SQL语句的信息放到作业日志中,这个信息指出SQL语句的SQLCODE。如果语句运行成功,那么SQLCODE的值为零,并发送完成信息,负的SQLCODE导致诊断信息,一个正的SQLCODE表示消息信息。

信息是用SQL前缀的四位代码或者是用SQ前缀的5位代码,例如,-204的SQLCDOE的信息为SQL0204,30000的SQLCODE信息为SQ30000。

和SQLCODE相关的是SQLSTATE,SQLSTATE是在SQLCA提供的返回码,它指出不同于IBM 关系数据库产品的一般的错误条件。不同的数据库产品的相同的错误条件可以产生相同的SQLSTATE,相同的错误条件却不能产生相同的SQLCODE。在确定从AS/400系统非DB2关系数据库操作中返回的错误时,这个返回码特别有用。

对于非ILE的调试程序在调方式引用的高级语言语句号必须从编译清单中获得,而对于ILE调试程序,应规定DBGVIEW(*SOURCE)做预编译,然后用源码级调试。

SQL总是把负的SQLCODE和非+100的正返回码信息放到作业日志中,而不考虑它是否在调试方式下。

20.2.2 性能验证段

这段测试鉴定索引的可用性及用数据库管理允许的查询方式,在预期的响应时间能否解决查询。一个SQL应用的性能依赖于访问表的属性,如果使用小表,响应查询的时间不会受索引的影响,但当你用大表对数据库运行相同查询,而没有相应的索引,查询的响应时间就会很长。

测试环境应该尽量地与产品环境相似。测试集合中的表应用产品集合中有相同名称和结构。在这两个集合中,表上应有相同的索引,表中的行数和值都应该类似。

20.2.3 SQL性能验证使用的CL命令

SQL性能验证可用下列命令:

CHGQRYA:

修改查询属性命令可以防止用户过长的查询,可用来设置QRYTIMLMT参数来避

免启动一个查询后时间大于指定时间的查询,它停止建立临时索引和其他资源集

中的查询操作。

由查询时间限制在作业日志中生成的性能信息,即使未在调试状态,也会取消

查询。详细内容请看本书第二十一章。

DSPJOB:

有OPTION(*OPNF)参数的DSPJOB命令,用来显示在一个应用程序运行时使用的

索引和表。

有OPTION(*JOBCLK)的DSPJOB命令,用来分析目标和行锁采用,它显示目标

和锁定的行和占有此锁作业的名称。

有OPTION(*CMTCTL)DSPJOB命令,显示程序运行的隔离级,在一个交易中锁定的行

数和待处理的DDL功能。显示的隔离级是缺省的隔离级,实际的隔离级,任何SQL

程序都可用,是用CRTSQLxxx命令中的COMMIT参数规定的。

PRTSQLINF

此命令允许打印一个嵌入程序中的有关SQL语句的信息、SQL软件包或服务程序中的SQL语句信息。信息包括:SQL语句,运行语句所使用的

访问计划和用在预编译命令中的参数清单。详细内容请看AS/400 DB2 CL命令

一书的附录D。

TRCJOB

用来获得运行SQL语句程序的跟踪信息。跟踪作业输出列出为每个SQL语句打开

处理初始数据库时所用的索引和文件,及运行每个SQL语句的处理单元和使用的

页资源。

20.2.4 性能信息

可以分析由数据库管理提供的放在工作日志中的SQL语句的功能和结构。这个信息是在调试方式下由SQL程序或者是交互SQL发出的,适当时数据库管理可以发送任何下列信息,变量(&1,&x)是替代变量,包含目标名或者其它替换值。这些信息是:

_ CPI4321 Access path built for file &1.

_ CPI4322 Access path built from keyed file &1.

_ CPI4323 The OS/400 query access plan has been rebuilt.

_ CPI4324 Temporary file built for file &1.

_ CPI4325 Temporary result file built for query.

_ CPI4326 File &1 processed in join position &X.

_ CPI4327 File &1 processed in join position 1.

_ CPI4328 Access path &4 was used by query.

_ CPI4329 Arrival sequence access was used for file &1.

_ CPI432A Query optimizer timed out.

_ CPI432B Subselects processed as join query.

_ CPI432C All access paths were considered for file &1.

_ CPI432D Additional access path reason codes were used.

_ CPI432E Selection fields mapped to different attributes.

_ CPI432F Access path suggestion for file &1.

_ CPI4330 &6 tasks used for parallel &10 scan of file &1.

_ CPI4331 &6 tasks used for parallel index created over file &1.

_ CPI4332 &1 host variables used in query.

_ CPI4333 Hashing algorithm used to process join.

_ CPI4334 Query implemented as reusable ODP.

_ CPI4335 Optimizer debug messages for hash join step &1 follow:

_ CPI4336 Group processing generated.

_ CPI4337 Temporary hash table built for hash join step &1.

_ CPI4338 &1 Access path(s) used for bitmap processing of file &2.

_ CPI4341 Performing distributed query.

_ CPI4342 Performing distributed join for query.

_ CPI4345 Temporary distributed result file &4 built for query.

_ SQL7910 SQL cursors closed.

_ SQL7911 ODP reused.

_ SQL7912 ODP created.

_ SQL7913 ODP deleted.

_ SQL7914 ODP not deleted.

_ SQL7915 Access plan for SQL statement has been built.

_ SQL7916 Blocking used for query.

_ SQL7917 Access plan not updated.

_ SQL7918 Reusable ODP deleted.

_ SQL7919 Data conversion required on FETCH or embedded SELECT.

_ SQL7939 Data conversion required on INSERT or UPDATE.

这些信息提供了查询如何运行的反馈,也指出可以令查询速度加快的一些方法。

这些信息包括分析产生信息原因的内容,引用的目标名和可能的用户回答。

信息发送的时间不是必需的,它指出完成相应功能的时间,一起发送的还有查询运行的开始时间。

对下列信息产生的原因和用户回答是简短的解释,实际的信息帮助是很完整的,可用来确定其含义及响应每个信息。

下面是对于每个信息可以采取的用户动作:

CPI4321――为文件&1建立访问路径。

这条信息指明建立了一个临时访问路径来处理查询,新的访问路径由读取规定文件的所有记录来生成。

在每一个查询运行建立的访问路径所需要的时间是非常明显的。考虑建立一个文件(CRTLF)或一个SQL索引(CREATE INDEX SQL语句):

覆盖信息帮助中命名的文件。

用在帮助信息中命名的键字段。

用在信息帮助中的规定的升序或降序。

用在信息帮助中的规定的分类排序表。

考虑生成一个有选择或省略语句的逻辑文件,它匹配或部分匹配包括常量的谓词。数据库管理器考虑使用选择或省略的逻辑文件,尽管它们在查询中未明确规定。

对于某些查询,优化可以考虑建立一个访问路径,当一个查询把顺序字段作为一个访问路径的键字字段时,且在规定的记录选择使用不同的字段时,有可能发生此情况。如果选择的记录有大概20%记录或更多返回,那么优化可以建立一个新的访问路径以便快速的访问数据,新的访问路径将需要读的数据数量降至最低程度。

CPI4322――在键字文件&1上建立访问路径

这条信息指出建立一个从键字文件的访问路径中建立的一个临时访问路径。

一般来说,这种操作不会使用大量的时间或资源,因为仅要读文件中一段数据。有时,通过建立一个逻辑来改善性能或用SQL索引来满足信息帮助中访问路径的需要。

详细内容看前一个信息CPI4321。

CPI4323――AS/400查询访问计划已经重建

这条信息可由不同的原因发送,在信息帮助中提供这个原因。

大多数情况是当被查询的文件环境改变,使当前的访问路径作废时会发出此信息。文件环境变更的例子是当查询需要的访问路径不在系统时。

一个访问路径包括查询如何运行及列出运行查询用的访问路径,如果必须的访问路径不再可用,那么查询要再一次优化,建立一个新的访问路径,替代旧的那一个。

这种在运行时再次优化查询及建立新的访问计划是AS/400 DB2的功能,它允许查询使用数据库的最新数据而不用用户干预来尽可能有效的运行。

这种信息不常出现,不用采取什么动作。例如,当一个SQL软件包在恢复之后第一次使用或优化检查出发生了变化时,(例如建立一个新的索引),就会发出这条信息,它批准隐含

的重建。但是,应该避免过度的重建,因为这会产生额外的查询处理,过度的重建可能指出一个应用设计问题或者实行一个无效的数据库管理。

CPI4324――为文件&1建立临时文件

在查询处理开始之前,指定文件中的数据要拷贝到一个临时的物理文件中以简化查询的运行,这个信息帮助包含了发出信息的原因。

如果规定的文件选择的行数很少,通常少于1000行,那么查询实现中的行选择部分就不花费太多的资源和时间,但如果查询花费比允许多的资源和时间,就要考虑修改查询,这样就不需要临时文件。

这样做的一个办法是把查询分成几步,考虑在子选择中用一个INSERT语句,仅把需要的记录选进物理文件中,然后再对剩余的查询使用文件记录。

CPI4325――为查询建立临时结果文件

建立临时结果文件来放查询的中间结果,信息帮助中有需要临时结果文件的原因。

在某些情况下,建立一个临时结果文件提供了更快的运行查询方法,对于其它有许多记录要拷贝到临时结果文件中去的会花费大量的时间,但如果一个查询花费的时间和资源多于允许程度,就考虑修改查询,使其不再需要临时结果文件。

CPI4326――在连接位置&11处理文件&1

这条信息提供了用访问路径访问文件数据时规定的连接位置,连接位置属于文件连接的顺序。

文件连接的顺序对查询的效能有明显示的影响。把有较小数量的选择记录文件与有较大数量的选择记录文件连接时,系统处理两个带有不同数量的选择记录文件的连接会更有效。例如,连接两个文件,有较少选择记录的文件在连接位置1,而有较多选择记录的文件在连接位置2。

如果规定了GROUP BY或者ORDER BY子句,此时查询中的文件引用子句中全部列时,文件在最后连接顺序当中将成为第一个文件。如果被引用文件是一个大文件,查询就会变得很慢,为了提高性能,考虑下面方法之一:

从一个不同的文件加一个额外的列到子句中,用一个临时的结果表允许系统用最有效的连接顺序来排序。

在ORDER BY子句中规定ALWCPYDTA(*OPTIMIZE)参数,系统会用最有效的连接顺序来排序文件。

当由于上述建议而改变时,查询一个临时结果表可以用来改变连接顺序。在大多数情况下,连接顺序改进的效能会弥补由临时结果导致的性能损失。

如果查询使用JOIN子句或者引用在文件规范表内的一个连接逻辑文件,那么文件规定的顺序会帮助决定优化使用的连接顺序,如果查询包括连接逻辑文件,或者用JOIN子句规定左外部连接或异常连接,优化就不能改变文件连接。

CPI4327――在连接位置1处理文件&1。

这条信息提供在用到达顺序文件中选择记录时,连接的主文件或第一个文件的名字。

看先前的信息CPI4326,它是有关连接位置和连接性能的信息。

CPI4328――文件&4的访问路径由查询所用

这条信息指出查询使用已存在的访问路径

使用访问路径的原因参见信息帮助。

CPI4329――文件&1使用到达顺序访问路径

没有访问路径用来访问规定文件中的数据,记录按到达顺序依次检索。

如果规定记录选择,用访问路径可以提高查询性能。

如果不存在访问路径,可以生成一个与记录选择中某一字段匹配的键字段,如果记录选择(WHERE子句)选择文件中20%或更少的记录,可以仅建立一个访问路径。

为了强制使用已存在的访问路径,修改查询中的ORDER BY子句来规定访问路径的第一个键字段。

CPI432A――文件&1的查询优化超时

当花费在优化查询所用的时间超出这行查询估计的有关时间,且超出被查询文件中的记录数时,优化会停止考虑访问路径。一般的说,文件中记录越多,要考虑的访问路径数量越大。

当估计这行查询的时间超出后,优化使用当前最好的方式进行查询,或者找到一个访问路径来获得好的性能,或者必要的话建立访问路径。超过估计的查询运行的时间,意味着优化不考虑使用最佳访问路径运行查询。

信息帮助中有优化超过估计时间前需考虑的访问路径列表。为确保一个访问路径是优化考虑的,可规定与此访问路径有关的逻辑文件做为查询文件。优化会首先考虑在查询中或SQL语句中规定的文件访问路径,记住,SQL索引是不能查询的。

可以删除不再需要的访问路径。

CPI432B--子选择做连接查询处理

两个或多个SQL子选择由查询优化合并在一起且做一个连接查询处理,一般来讲,这种处理方式是一个不错的性能选项。

CPI432C――考虑文件&1所有的访问路径

优化考虑所有建立在某个文件上的访问路径,既然优化检查文件所有的访问路径,就可以确定文件当前最佳访问路径。

信息帮助包括访问路径列表。每个访问路径有一个原因码,原因码解释为何不用访问路径。

CPI432D――使用附加的访问路径原因码

这一信息前发出了CPI432A和CPI432C信息,由于信息长度的限制,由CPI432A和CPI432C使用的一些原因码在CPI432D的信息帮助中加以解释。使用这个信息的信息帮助去解释CPI432A或CPI432C返回的信息。

CPI432E――选择字段被映射为不同属性

这一信息指出查询优化不能考虑用索引处理一个或多个查询选择规定,如果有索引可用,可用来限制查询仅处理少数几行,那么查询性能可以起作用。

比较值和比较列的属性必须匹配,否则会发生转换以使之相符,一般的这种转换发生在有最小属性的值映射给其他值的属性,当比较列的属性已经映射或与比较值可进行比较时,优化就不再使用索引来完成这个选择。

CPI4338――使用访问路径&1处理文件&2的位映象

优化选择使用多个访问路径,用连接查询选择(WHERE子句)来建立位映象,结果位映象指示出实际选择的记录。

理论上说,每个记录包括一位位映象,被选择的记录对应位为‘1’,其他位为“0”。

位映象一旦建立,即被用于防止在未被查询选择的记录做映象,位映象的使用取决于位映象是与到达顺序或主访问路径一起处理。当位映象与到达顺序一起处理时,在些信息前会发送CPI4327或CPI4329,这时,位映象用来帮助从表中选择查询要选择的记录映象。

当位映象与主访问路径一起使用,在此信息前会发送信息CPI4326或CPI4328。在从表中映象记录前,要再检查由主访问路径选择的记录映象。

20.2.5性能信息及打开数据路径

以下SQL运行时间信息引用打开数据路径。

打开的数据路径(ODP)定义在打开游标或运行其他SQL语句时产生的、一个内部目标,它直接联接数据,这样输入/输出的操作才得以进行,在OPEN、INSERT、UPDATE、DELETE 和SELECT INTO语句中用ODPs完成对数据的操作。

即使用SQL关闭游标,SQL命令已经运行,数据库管理在多数的情况下会保留SQL操作的相关ODP以便在下一次运行时再使用。这样,一个SQL CLOSE命令可以关闭游标但留下有用的ODP,在下一次打开光标时再次使用,这能明显减少运行SQL命令的处理和响应时间。

当反复运行SQL命令时,重复使用ODPs是争取快速操作重点考虑的问题。

以下信息在SQL运行时产生:

SQL7910――所有SQL游标关闭

当作业调用堆栈中不再有运行SQL命令程序时,发送此信息。

除非规定了CLOSQLCSR(*ENDJOB)或是CLOSQLCSR(*ENDACTGRP),重用ODPs的SQL环境垮越程序调用,直到运行SQL语句的实际程序完成。除了与*ENDJOB *ENDACTGRP游标相关的ODP外,所有ODPs当在调用堆栈所有SQL程序完成及SQL环境结束时被删除。

这种完成处理包括关闭光标,删除ODPs,去掉准备的命令,及解锁。

放在应用程序中第一个运行的SQL语句可使SQL环境在应用执行期间保持活动,这就允许反复调用程序时,可在其他SQL程序中重用ODPs,也能规定CLOSQLCSR(*ENDJOB)或CLOSQLCSR(*ENDACTGRP)。

SQL7911――重用ODP

这一信息指出语句最后一次运行或是为游标运行CLOSE语句时,ODP没被删除,现在即可再次使用。这样做通过消除不必要的打开、关闭操作而有效利用资源。

SQL7912――ODP生成

找不到能够再次使用的ODP,第一次运行这条语句或打开游标时,总是必须生成一个ODP,但如果在每一次运行这条语句或打开游标时,都出现这条信息,则建议用22.19.1的内容去修改应用程序。

SQL7913――ODP删除

对于每个作业仅运行一次的程序,这一信息是正常的。但,如果这一信息在每一次运行语句或打开游标都出现的话,建议用22.19.1的内容去修改应用程序。

SQL7914――ODP未删除

如果语句重新运行或是游标重新打开的话,ODP能再次使用。

SQL7915――SQL语句的访问方案已经建立

即使所需表丢失了,AS/400预编译仍允许生成程序目标,在这种情况下,此程序第一次运行时建立访问方案,此信息指出访问方案已建立且成功的存在程序目标中。

SQL7916――用于查询使用块操作

在运行这条语句时,SQL会向数据库管理请求多个记录,而不是一次请求一条记录。

SQL7917――访问方案未更新

数据库管理为这一语句重建访问方案,但程序不用新的访问方案更新,当前运行程序的另一个作业有程序访问方案的共享锁。程序不能用新的访问方案更新直到作业获得程序访问方案的排它锁,共享锁释放后才能获得排它锁。

语句仍会运行,且使用新的访问方案。然而只要语句运行,访问方案就还会重建一直持续至程序更新。

SQL7918――删除重用的ODP

在这一语句中存在可重用的ODP,但作业库列表和替换规定已经修改了。

现在语句引用不同的文件或使用与已有ODP中不同的替换规定,已有的ODP不能重用,必须生成新的ODP。为可重用ODP,要避免修改库列表和替换规定。

SQL7919――在FETCH或SELECT中需要数据转换。

当往主变量中映象数据时,需要数据转换。当将来运行这些语句时,要求做数据转换的就要慢于没有要求转换的。语句能成功运行,消除这些数据转换则能提高性能,例如,在把一定长度的字符串映象给不同长度字符串的主变量时,会由于发生数据转换而发出此信息。在把数值值映象给不同类型的主变量时(十进制整数),也会产生这种错误。为避免多数的转换,使用与列匹配的主变量类型和长度。

SQL7939――在INSERT或UPDATE中需要数据转换。

插入和更新值的属性和接受值的列的属性是不同的,既使值必须转换,它们就不能直接移入列中,如果插入或更新值的属性与接收值的列的属性匹配,可以提高性能。

第二十一章使用AS/400 DB2预测查询管理

如果查询估计或预计的运行时间(弹性执行时间)过长,AS/400 DB2预测查询管理会停止查询的开始,管理在查询运行前开始而不是在查询运行的同时动作,管理器可以在AS/400的交互或批作业中使用,它可以用在AS /400 DB2查询的所有界面且不限制使用SQL 查询。

管理器在查询开始之前对其进行预测和停止的能力是很重要的,在长时间运行查询又非正常结束查询且得不到任何结果,这会浪费系统资源。

AS/400 DB2的管理器以估计查询时间为基准,如果查询估计的运行时间超过用户限定时间,从开始就会被停止查询。

时间限制由用户定义,在CHGQRYA CL命令中的QRYTIMLMT参数中规定以秒为单位的时间值,没有SQL语句设置限制。

管理器是与查询优化一起使用的,当用户要求AS/400 DB2运行查询时,发生下列情况:

1.由优化评估查询访问方案

作为评估的一部分,优化预测或估计查询的运行时间,这有助于决定访问的最好途径来从查询中获取数据。

2.估计的运行时间与当前作业或用户对话中有效的用户定义查询时间限制做比较。

3.如果预计查询的时间少于或等于查询时间限制,查询管理器让查询不间断地运行,

并且不向用户发送信息。

4.如果超出时间限制,查询信息CPA4259发送给用户,这个信息指出估计的查询处理时间XX秒超过YY秒的时间限制。

注:对此信息建立一个缺省的回答,这样用户就不用回答该信息,从而结束这一查询要求。

5.如果没用缺省回答,用户可以选择以下做法之一:

在实际开始运行前结束查询要求。

即使运行时间超出管理器时间限制仍继续运行查询。

21.1 取消查询

当一个查询希望运行比预先时间限制长一些时,管理器发出询问信息CPA4259,用户进入C取消该查询或者进入I忽略时间限制,使查询运行直到完成。如果用户进入C,发出逃逸信息CPF427F给SQL运行时码,SQL返回SQLCODE -666。

21.2 一般实施考虑

当使用管理器时要记住优化估计的查询运行时间仅仅是估计值,实际的查询时间可能比估计的时间长或者短,但是两个值大致相同。

21.3 用户应用程序实施的考虑

在CHGQRYA命令中对管理器规定的时间限制是为作业或交互用户对话建立的。CHGQRYA 命令也可以导致管理器影响系统中不是当前作业的其它作业。这是由JOB参数实现的。在源作业运行CHGQRYA命令以后,在目的作业上的管理器的影响不依赖于源作业。查询时间限制在作业或用户对话期间都保持有效,直至用CHGQRA改变了时间限制。,在程序控制下,查询时间根据生成应用的功能、日工作时间和可用操作系统资源的总量,用户能得到不同的查询时间限制。这在平衡系统资源的临时查询需求时提供很大的灵活性。

21.4 对查信息的缺省回答控制

系统管理员可以使用下面的CHGJOB命令来控制交互作业用户忽略数据库查询询问信息:

如果在CHGJOB命令的INQMSGRPY参数规定*DFT,那么交互用户看不到询问信息,查询立即被取消。

如果在CHGJOB命令的INQMSGRPY参数规定*RQD,那么交互用户可以看到询问信息,必须回答询问。

如果在CHGJOB命令的INQMSGRPY参数规定*SYSRPYL,系统回答列表用来决定交互的用户能否看到询问和是否有回答的必要。系统回答列表项基于用户配置文件名、用户标识或处理名来制定不同的缺省回答。

对于查询信息CPA4259的信息数据,可用全限定的作业名。这允许用键字CMPDTA来选择处理应用或用户配置文件的系统回答列表项,用户配置文件名有10个字符,从51列开始,处理名字为10个字符,从27列开始。下面的例子加一个回答列表项,规定用C做缺省回答,它取消用户配置文件名是“QPGMR”的作业请求:

ADDRPYLE SEQNBR(56) MSGID(CPA4259) CMPDTA(QPGMR 51) RPY(C)

下面的例子应答一个列表项,它规定用C做缺省回答,取消处理过程名为“QPADEV0011”作业的请求。

ADDRPYLE SEQNBR(57) MSGID(CPA4259) CMPDTA(QPADEV0011 27) RPY(C)

21.5 便用性能测试管理

查询管理使你不必运行几个反复的查询来优化性能,如果查询时间限制用CHGQRYA QRYTIMLMT(0)设置为零,查询信息总是送往用户,指出时间超过了查询时间限制给程序员提示查询信息,并且从PRTSQLINF命令也能看到同样的信息。

此外,如果查询被取消,查询优化要评估访问方案且把优化信息送到作业日志中,即使作业不在调试方式也发生这种情况。用户或程序员可以浏览在作业日志中的优化信息,看是否要用附加调整来得到优化的查询性能,实际的数据查询不再活动,所以能节省系统资源,如果被查询的文件有大量记录,这种方法能明显的节省系统资源。

21.6 例子

要设置或修改当前作业或用户会话的查询时间限制,用CHGQRYA命令,用下面的命令可

以把查询时间限制设为45秒:

CHGQRYA JOB(*) QRYTIMLMT(45)

如果用户运行查询估算时间不到或等于45秒,则查询不中断运行,这个时间限制在作业或用户会话期间保持有效,直到用CHGQRYA修改。

如果查询运行时间估算是135秒,则会有信息发给用户,指出运行时间超过45秒。

要修改查询时间限制,用CHGQRYA命令的JOB参数。要对作业123456 /USERNAME/JOBNAME 设置查询时间限制为45秒,用下面命令:

CHGQRYA JOB(123456/USERNAME/JOBNAME) QRYTIMLMT(45)

如果运行查询时间不大于45秒则正常运行查询,否则会将信息送到用户,指出查询时间超时,这个时间限制在此作业运行期间一直有效,直到用命令CHGQRYA来改它。

第二十二章 AS/400 DB2数据管理和查询优化

这一章为设计一个SQL更有效地利用系统资源的程序给出一些指导。做为一般原则,大部分的指导可以被忽略,不会影响结果的正确性,但是如果在设计程序运用这些方法,会使程序运行更加有效。

注:本章信息很复杂,阅读本章,会得到有关AS/400系统的许多有帮助的信息。

如果能够知道AS/400 DB2如何处理查询,那么就很容易理解本章讨论的有关性能的影响。有两个AS/400 DB2的重要部分:

1.数据管理方法

这些方法是用来从磁盘中取数据的规则,这个方法包括使用索引和行选择技术。另外,也可用并行访问方法与DB2对称多处理操作系统特性。

2.查询优化

查询优化可用来实施查询和选择最有效的技术。

22.1 数据管理方法

这节介绍AS/400 DB2和AS/400特许内码访问数据的基本技术。

22.1.1 访问路径

访问路径用来规定查询中定位数据的方法,一条访问路径可以是索引的,顺序的或两者结合的。

22.1.1.1 顺序访问路径

一条顺序访问路径用来安排存在表中的行定位在查询规定的数据顺序,用顺序访问路径处理表类似于在传统系统中处理顺序的或直接的文件。

22.1.1.2 键字顺序访问路径

键字顺序访问路径提供按键字字段(索引)的内容来访问表,键字顺序是检索行的顺序。这种访问路径,在表中增加或删除行时或者修改索引列内容时是自动维护的,键字访问路径的最好例子是用GREATE INDEX语句来生成索引。

用来生成键字顺序访问路径所用的列最好是:

在WHERE子句中选择谓词频繁引用的列,

在GROUP BY和ORDER BY子句中频繁引用的列,

用来连接表所用的列。

如果想进一步了解访问路径,请参考数据管理。

22.1.2 访问方法

特许内码和AS/400 DB2共享访问方法,特许内码做包括选择、连接、散列和访问路径建立的低级处理。

查询优化处理对每个查询选择最有效的访问方法,并且在访问方案中保留这些信息,类型依赖行的数目,页故障的数目(1)及其它限制。

优化用于检索数据的可能方法。包括:

数据空间扫描方法(22.1.2.4)

并行预取方法(22.1.2.5)

键字选择方法(22.1.2.7)

键字定位方法(22.1.2.9)

并行表或者索引预装入(22.1.2.12)

索引之索引方法(22.1.2.13)

仅索引访问方法(22.1.2.11)

散列方法(22.1.2.14)

位图处理方法(22.2)

DB2对称的多处理特性提供优化及包括并行处理的检索数据方法。对称多处理(SMP)是对单系统并行形式的改进,这里用多处理共享内存和硬盘资源,这样就改进了单处理的最终结果。这种并行处理意味着数据库管理能同时有多个系统处理器同时处理一个查询,这样,CPU边界查询性能明显改善,这是由于在多处理器系统上用分布处理器装入跨越多个处理器。

图22-1 数据库对称多处理

在你的系统如果有对称多处理特性可用下列方法优化:

并行数据空间扫描方法(22.1.2.5)

并行键字选择方法(22.1.2.7)

并行键字定位方法(22.1.2.9)

并行仅索引访问方法(并行或非并行)(22.1.2.10)

并行散列方法(并行或非并行)(22.1.2.13)

并行位图处理方法(22.2)

(1)当程序引用不在主存的4字节页时,发生中断。

22.1.2.1 排序

为保证结果的特殊顺序,必须规定ORDER BY子句,在用并行访问方法前数据库管理用一种顺序方式处理表中的行(键字顺序),即使在原查询要求中没有包括排序,在结果中也能排序。因为并行方法会同时处理表行的一块和索引值,检索的排序变得更随机且不可预测,ORDER BY子句是保证结果有规定顺序列的唯一方法,但是,只有当绝对必要时,才可指定排序列请求,因为排序结果会增加CPU的利用和响应时间。

22.1.2.2 实现并行处理

应用程序和用户必须实现对查询的并行处理,优化不会自动使用并行作为访问方式,可用系统值QQRYDEGREE和CHGQRYA命令的DEGREE参数来控制查询优化所用的并行级别。详细内容请看22.27。

系统启动时,会生成一数据系统任务给数据管理使用,DB管理用这些任务处理从硬盘设备获得的数据,既然这些任务可同时在多处理器上运行,就可减少查询时间,这些任务甚至可以做很多并行查询的I/O和CPU处理,I/O和CPU资源计数会传送给作业,应用程序这类的I/O和CPU资源总计,可由WRKACTJOB命令准确地显示。

22.1.2.3 自动数据展开

AS/400 DB2会跨过硬盘设备在可用ASP上自动展开定位数据,这就保证了数据的展开无用户干予。数据展开让数据管理很容易在不同硬盘设备上并行处理成块记录。

即使AS/400 DB2会跨越硬盘设备在一个ASP中展开数据,有时数据宽度的定位(数据的连续集)可能无法平缓地展开。当设备空间分配不均,或新设备添加到ASP时,会发生这种情况。可用保存,删除,然后重存表来再次展开数据空间的分配。

22.1.2.4 数据空间扫描访问方法

在无法保证序列表中的行用无序处理时,若想得到特定序列的结果必须规定QRDER BY 子句。读表中所有行,每行都要符合选择限制,给应用程序只返回适合限制的行。

由于下列原因数据空间扫描是有效的:

因为处理给定页的所有行,并且一旦页在主存,就不用再检索,所以页的I/O操作

的数减小。

数据库管理很容易预测数据检索的页顺序。由于这个原因,数据库管理能调度从辅

存到主存的页的I/O,这通常叫作予取。这样做当数据库管理需要访问数据时在主

存中有可用的页。

当要选择的行占很大百分比时用这个方法非常好,百分比通常是20%或更多。

当从表中选择的行包括删除的行时,数据空间扫描处理可以造成不利影响。这是因为删除操作仅对删去行做标记,对数据空间扫描处理,数据库管理读所有删除的行,因为删除的行没有一个真的没有了。可以使用RGZPFM命令去消去删除的行,对物理文件规定REUSEDLT (*YES)也可重用删除记录的空间。在用CREATE TABLE语句生成表后,可在CRTLF命令中指定REUSEDLT(*YES)。

数据空间扫描处理在表中选择,因为要检查表中所有行,这导致使用不必要的I/O和处理单元资源。

由QPRTSQLINF命令建立的信息描述使用数据空间选择方法的SQL程序的查询,会出现下面内容:

SQL4010 Arrival sequence access for file 1.

特许内码当数据空间扫描处理时,会对选择使用两种算法之一,中间缓冲选择和数据空间元素选择。

下列伪码解释中间缓冲选择算法:

DO UNTIL END OF FILE

1、定位下一行(或第一个)记录;

2、把所有列值映射给中间缓冲,完成所有派生的操作;

3、使用复制到中间缓冲的列值对TRUE和FALSE值做选择评估;

4、IF 选择为TURE,

THEN

把值从中间缓冲复制到用户的回答缓冲中,

ELSE

无操作

END

数据空间项算法如下:

DO UNTIL END OF FILE

1、计算检索限制,限制通常为已在活动内存中的记录数,或已做I/O请求装入到

内存中;

2、DO UNTIL(到达检索限制或记录选择限制是TURE)

a.定位下一个(或第一个)记录;

b.评估选择限制,它不需要派生值而直接处理数据空间记录。

END

3、IF 选择为真

THEN

a.把所有列值映射到中间缓冲,完成所有的派生操作;

b.把值从中间缓冲复制到用户回答缓冲。

ELSE

END 无操作

由于下列两个原因,数据空间项算法提供比中间缓冲选择更好的性能:

数据移动和计算仅在被选择的记录上完成。

数据空间项选择算法第二步的循环生成一个可执行码,当实际选择很小百分比记录时,AS/400 DB2运行这个很小的程序直到找到记录。

这类查询实际不需使用数据空间扫描方法,任何查询接口可以利用这种改进,然而,下列内容决定一个选择能否作为数据空间选择完成:

谓词中没有一个操作数是任何类型的派生值、函数、子串、连接或数值表达式。

当选择谓词的两个操作数是数值列,两列都有相同类型、范围和精度,否则操作数要映射为派生值,例DECIMAL(3,1)仅能与另一个DECIMAL(3,1)列比较。

当选择谓词的一个操作数是数值列而另一个是字母或主变量,类型必须相同且字母/主变量的精度和范围必须少于或等于列的精度和范围。

如果表是由SQL CREATE TABLE生成的,那么只能包括压缩十进制或数值类型列的选择谓词。

不能在选择谓词中引用变长字符列。

当选择谓词的一个操作数是字符列,另一个是字母或主变量,主变量的长度不能大于列的长度。

字符列数据的比较不需要CCSID或键盘转换。

避免中间缓冲选择是很重要的,因为在数据项选择高于70-80%时,CPU使用和响应时间会降低。大多数从数据空间选择受益的查询是那些实际选择少于文件的60%的,选择记录的百分比越低,越要注意受益。

21.1.5 并行预取访问方法

AS/400 DB2使用并行预取处理来缩短长时间运行的I/O边界数据空间扫描查询所需的时间。

这个方法与数据空间扫描方法有相同特性,除了I/O处理用并行完成,这是由对表的预取数据启动多输入流完成。当下列为真时这个方法最有效:

数据展开跨越多个磁盘设备。

查询不是CPU处理集中的。

对每个输入流保持数据收集有相当数量的主存。

以前讲过AS/400 DB2能自动展开数据跨越磁盘设备而不用用户干预,允许数据库管理并行预取表数据。数据库管理使用任务从不同磁盘设备检索数据。通常请求是针对整个范围(数据的连续集),这样由于磁盘设备能用平滑的顺序的访问数据,故性能提高了。由于这种优化,并行预取能比SETOBJACC命令更快的把数据预装入到活动主存。虽然AS/400 DB2在一个ASP中可跨越磁盘展开数据,有时数据空间范围的分配不能平缓的展开,当在设备中有不平缓的空间分配时或新的装置加到ASP中时会发生这种情况。数据空间的分配可用保存和重存表来重展开。

优化查询选择能利用这类实施优点来候选查询,估计查询处理所需的CPU时间,并把估计时间与输入处理所用时间的总量相比较,当估计的进程时间超过CPU时间时,优化查询选那些用并行I/O实施的查询。

并行预取要求并行I/O处理必须由系统值QQRYDEGREE或CHGORYA命令中的DEGREE参数激活,详细内容请看22.27。由于用并行预取处理的查询会过份地使用主存和磁盘I/O资源,所以要限制和控制使用并行预取的查询。并行预取使用多个磁盘臂,但每个查询用的CPU 很少,并行预取I/O将剧烈地使用I/O资源。在系统中允许并行预取查询与超落实I/O子系统一起可加重超落实问题。

可以在共享存储池中用*CALL分页选项运行作业,这样,能更有效地利用活动主存。

AS/400 DB2使用自动系统调整去决定在这个处理要用多少内存。运行时,如果内存统计指出它没有超落实主存资源,则特许内码允许使用并行预取,详细内容请看数据管理。

并行预取要求有足够的主存去储存通过多次输入流取用的数据,对于大的文件,典型的

扩展尺寸是1兆字,即必须有2兆内存可用才能同时使用二个输入流。在池中增加可用内存可允许使用更多的输入流。如果有大量的可用内存,表的全部数据空间在打开查询时可以装入到活动内存中去。

由PRTSQLINF命令生成的信息说明查询使用并行预取访问方式的SQL程序查询,出现的信息为:

SQL4023 Parallel dataspace pre-fetch used

22.1.2.6 并行数据空间扫描方法(仅当安装了DB2对称多处理性能时才可用)

AS/400 DB2用此并行访问方法缩短长时间运行的数据空间扫描查询所需的处理时间,并行数据空间扫描方法象并行预取访问方法一样会减少I/O处理时间。另外,在系统上有多个处理器运行时,把数据空间扫描处理分割成可同时在多个处理器上运行的任务,这样减少了查询时间,所有选择和列处理都在任务中完成,应用程序作业调度这些任务的工作请求,把结果合并到结果缓冲区并返给应用程序。

当下列为真时,此方法最有效:

数据展开跨越多个硬盘设备

系统有多个处理器可用

有大容量主存可用容纳数据及结果缓冲区。

象前面提到的,AS/400 DB2不要用户干预能自动展开数据跨越硬盘设备,且允许数据库管理用并行方式预取表数据。

查询优化选择能利用此类操作优点的候选查询,优化通过评估处理查询所用的CPU时间和比较输入处理所用的时间总数,优化根据它计算所用的任务数来减少数据空间扫描的时间,它计算系统中基于处理数的任务数,作业池中可用的内存,DEGREE查询属性的当前值,如果并行数据空间扫描是最快的访问方法,就选择它。

并行数据扫描需要用系统值QQRYDEGREE或CHGQRYA中的DEGREE参数来激活SMP并行处理。详细内容请看22.27。

并行数据空间扫描不能用于要求以下之一的查询:

规定*ALL的落实控制级。

嵌套的循环连接方法。

向后翻卷。例如,对用OPNQRYF命令定义的查询一般不能使用并行数据空间扫描。

(这类应用可以定位最后一个记录)。SQL定义的查询若定义做可翻卷的,可以使

用这种方法。

在产生临时结果期间可使用平行数据空间扫描法,例如排序或散列操作,而不管用

什么界面来定义查询。

游标位置的恢复。例如做为SQL ROLLBACK HOLD语句或ROLLBACK命令的结果,

要恢复游标的位置。提交控制级不是*NONE的的SQL应用程序要规定*ALLREAD,

做为预编译参数ALWBLK的值来允许使用这种方法。

更新或删除能力。

用页选项*CALC在共享缓冲池运行这个作业,这样就会更有效的使用活动内存。

并行数据空间扫描需要活动的内存来缓冲检索来的数据,并为每个任务分开结果缓冲区。每个任务需要的内存大约是两兆字节,要有四个数据空间扫描同时运行必须有八兆内存可用。在存储池中增加可用内存数量,允许使用更多的输入流,访问有大量变长列的表的查询或生成比表实际记录长的结果值的查询,需要为每个任务分配更多的内存。

如果多数记录锁冲突或者有发生数据映射错误并行的数据空间扫描性能会受限制。

22.1.2.7 键字选择访问方法

这种访问方法需要键字顺序访问路径。读全部索引,所有对索引的键字列引用的选择标准都要应用在索引中。这种方法的优点是数据空间仅访问那些要读检索行附合索引选择标准的那些数据,不能由键字选择方法完成的选择是在数据空间级完成的。

如果检索条件适合于大量的行,键字选择存取方法是非常昂贵的,这是因为:要处理整个索引

从索引中选择的每个键字,发生一个数据空间随机的输入输出。

正常情况下当检索条件适合于相当多的行时,这种优化选择用数据空间扫描处理。如果被选择的键字小于20%或者强迫使用索引操作,优化会选择键字选择方法。强制使用索引的选项包括:

排序

分组

连接

在这些情况下,优化可以选择生成一个临时索引而不使用已有的索引。当优化生成一个临时索引时,它使用32K页尺寸,用CREATE INDEX语句生成的索引通常只用4K页尺寸。当建立临时索引时,优化能处理尽可能多的选择。几乎所有由优化建立的临时索引都是选择/省略或稀少索引。最后,优化在生成索引时也能使用多并行任务。依据从很少几页翻动的性能改进,页尺寸是不同的,使用并行任务来生成索引的能力足够抵消生成一个索引的花费,数据空间选择用来建立临时键字访问路径。

如果查询规定排序需要索引要用键字选择方法,就可以用下列预编译参数的组合在查询分类中使用排序,以提高查询性能:

_ ALWCPYDTA(*OPTIMIZE), ALWBLK(*ALLREAD), and COMMIT(*CHG or *CS)

_ ALWCPYDTA(*OPTIMIZE) and COMMIT(*NONE)

22.1.2.8 并行键字选择访问方法(仅在安装DB2对称多处理特性时才可用)

对于并行键字选择访问方法,可能的键字值被逻辑的分开,每一部分由分开的任务处理,就像使用索引选择访问方法一样。查询优化决定当前处理的分部数,因为不按顺序处理键字,如果用索引做排序,优化就不能使用这个方法。包含来自现存索引键字大部分的键字分区,将来会分开作为别的部分来处理。

以下例子给出,优化选择键字选择方法的查询:

CREATE INDEX X1

ON EMPLOYEE(LASTNAME,WORKDEPT)

DECLARE BROWSE2 CURSOR FOR

SELECT * FROM EMPLOYEE

WHERE WORKDEPT = 'E01'

OPTIMIZE FOR 99999 ROWS

如果优化选择用四级并行运行这个查询,以下是可同时处理的逻辑键字部分:

LASTNAME的值 LASTNAME 的值

引导字符引导字符

分区开始分区结束

‘A’‘F’

‘G’‘L’

‘M’‘S’

‘T’‘Z’

若第一、二分区有很少几个键字,这些键值的处理会完成得比第三、四分区快些,在完成前两个分区后,剩下的后两个分区键值会进一步分割。以下给出在第一、二分区完成处理后可以处理四个分区,会有分割发生:

LASTNAME的值LASTNAME的值

引导字符引导字符

分区开始分区结束

‘O’‘P’

‘Q’‘S’

‘V’‘W’

‘X’‘Z’

并行键字选择不可用于要求以下之一的查询:

规定*ALL的落实控制级。

嵌套的循环连接方法。

向后翻卷。例如,对用OPNQRYF命令定义的查询一般不能使用并行数据空间扫描。

(这类应用可以定位最后一个记录)。SQL定义的查询若定义做可翻卷的,可以使

用这种方法。在产生临时结果期间可使用平行数据空间扫描法,例如排序或散列

操作,而不管这用什么界面来定义查询。

游标位置的恢复。例如做为SQL ROLLBACK HOLD语句或ROLLBACK命令的结果,

要恢复游标的位置。提交控制级不是*NONE的SQL应用程序要规定*ALLREAD,做

为预编译参数ALWBLK的值来允许使用这种方法。

更新或删除能力。

用页选项*CALL在共享缓冲区运行这个作业,这样会更有效地使用活动内存。

并行键字选择需要SMP并行处理,这是由系统值QORYDEGREE或由CHGORYA中的中的DEGREE参数激活的。请看22.7。

22.1.2.9 键字定位访问方法

此访问方法与键字选择访问方法十分相似,它们都需要键字顺序访问路径,用键字选择访问方法,从索引开始启动处理直至末尾。用键字定位访问方法,对键字符合某些或全部选择标准范围内的索引直接做选择,从这个范围内读所有键字,再执行余下的键字选择。这与键字选择方法执行的选择很相似。任何通过键字定位或键字选择完成的选择在数据空间级上执行,因为键字定位只处理索引中的键字的子集,所以键字定位的性能比键字选择方法性能更好。

当选择的行比例少于20%时,键字定位方法最有效。如果超过20%的行时,优化一般会选择:

使用数据空间扫描处理(如不要求索引)

使用键字选择(如果要求索引)

使用查询分类例程(如给出条件)

对于不要求索引的查询(无排序、分组或连接操作),优化会试图寻找已有的索引做键

字定位,如果找不到已有的索引,优化会停止使用键字访问数据,因为用数据空间扫描处理比建立一个索引然后运行键字定位更快。

下例解释优化选择键字定位方法的查询:

CREATE INDEX X1 ON EMPLOYEE(WORKDEPT)

DECLARE BROWSE2 CURSOR FOR

SELECT * FROM EMPLOYEE

WHERE WORKDEPT = 'E01'

OPTIMIZE FOR 99999 ROWS

此例中,数据库支持用X1定位到值为WORKDEPT的第一个索引输入。对于每个值为‘E01’的键字,它随机访问数据空间(2)且选择行,当索引选择移到索引值E01外,查询结束。

注:此例中所有处理的键字项和获取的行都符合选择标准。如果加上不能用键字定位完成的其它选择(例如在多列上选择的列不符合索引的第一个键字列),优化会用键字选择完成尽可能多的其它选择,剩下的选择会在数据空间级上运行。

由PRTSQLINF命令生成的信息描述了在SQL程序中的查询,会显示如下:

SQL4008 Access path X1 used for file 1.

SQL4011 Key row positioning used on file 1.

键字定位访问方法有附加的处理性能,它完成的选择范围越过几个值,例如:

CREATE INDEX X1 EMPLOYEE(WORKDEPT)

DECLARE BROWSE2 CURSOR FOR

SELECT * FROM EMPLOYEE

WHERE WORKDEPT BETWEEN 'E01' AND 'E11'

OPTIMIZE FOR 99999 ROWS

以上例子中,数据库支持定位第一个索引项的值为’E01’,并且处理行,直到处理最后一个值为‘E11’的索引项。

由PRTSQLIHF命令生成的信息描述了在SQL程序中的查询,会显示如下:

SQL4008 Access path X1 used for file 1.

SQL4011 Key row positioning used on file 1.

做为这种访问方法的进一步扩充,可以使用叫做多范围键字定位,它允许在多列上索引的第一个键字列上选择行的多个值范围。

CREATE INDEX X1 ON EMPLOYEE(WORKDEPT)

DECLARE BROWSE2 CURSOR FOR

SELECT * FROM EMPLOYEE

WHERE WORKDEPT BETWEEN 'E01' AND 'E11'

OR WORKDEPT BETWEEN 'A00' AND 'B01'

OPTIMIZE FOR 99999 ROWS

在上例中,因为二次定位和处理技术,对每个值范围使用一次。

由PRTSQLINF命令生成的信息描述了在SQL程序中的查询,它可以显示为:

SQL4008 Access path X1 used for file 1.

SQL4011 Key row positioning used on file 1.

所有键字定位例子都只用一个键,是索引中的最左键,键字定位也处理多个键。(虽然这些键必须是连在最左键的)。

CREATE INDEX X2

ON EMPLOYEE(WORKDEPT,LASTNAME,FIRSTNME)

DECLARE BROWSE2 CURSOR FOR

SELECT * FROM EMPLOYEE

WHERE WORKDEPT = 'D11'

AND FIRSTNME = 'DAVID'

OPTIMIZE FOR 99999 ROWS

因为两个选择键字(WORKDEPT和FIRSTNME)不是连着的,此例不支持多键字定位。因此,只有选择WORKDEPT =‘D11’部分可提供给索引(单键字定位),当可以接受时,它意味着行处理从第一个键字‘D11’开始,然后用键字选择对WORKDEPT键字值为“011”的9个键字,处理FIRSTNME =‘DAVID’。

由生成下列的索引X3,上述查询例子会用多键字定位运行。

CREATE INDEX X3

ON EMPLOYEE(WORKDEPT, FIRSTNME, LASTNAME)

多键字定位支持能为选择的各部分做键字定位,这样改善了性能,起始值是由把两个选择值合并为‘D11DAVID’而建立的,选择定位在最左两个键有这个值的索引项上。

由PRTSQLINF命令产生的信息描述了SQL程序中的查询,显示如下:

SQL4008 Access path X3 used for file 1.

SQL4011 Key row positioning used on file 1.

下面这个例子给出如何使用键字定位:

CREATE INDEX X3 ON EMPLOYEE(WORKDEPT,FIRSTNME)

DECLARE BROWSE2 CURSOR FOR

SELECT * FROM EMPLOYEE

WHERE WORKDEPT = 'D11'

AND FIRSTNME IN ('DAVID','BRUCE','WILLIAM')"

OPTIMIZE FOR 99999 ROWS

查询优化分析WHERE子句,然后用相等的格式重写这个子句:

DECLARE BROWSE2 CURSOR FOR

SELECT * FROM EMPLOYEE

WHERE (WORKDEPT = 'D11' AND FIRSTNME = 'DAVID')

OR (WORKDEPT = 'D11' AND FIRSTNME = 'BRUCE')

OR (WORKDEPT = 'D11' AND FIRSTNME = 'WILLIAM')

OPTIMIZE FOR 99999 ROWS

在重写的查询格式中,对WORKDEPT和FIRSTNME连结的值实际上有三个分开的键值范围。

Index X3 Start value Index X3 Stop value

'D11DAVID' 'D11DAVID'

'D11BRUCE' 'D11BRUCE'

'D11WILLIAM' 'D11WILLIAM'

键字定位每个范围上完成,明显地减少了选择的键的数目,刚好为三,所有的选择能通过键字定位完成。

在下面例子中,可进一步使用复杂的范围分析。

DECLARE BROWSE2 CURSOR FOR

SELECT * FROM EMPLOYEE

WHERE (WORKDEPT = 'D11'

AND FIRSTNME IN ('DAVID','BRUCE','WILLIAM'))

OR (WORKDEPT = 'E11'

AND FIRSTNME IN ('PHILIP','MAUDE'))

OR (FIRSTNME BETWEEN 'CHRISTINE' AND 'DELORES'

AND WORKDEPT IN ('A00','C01'))

查询优化分析WHERE子句并把子句重写相等的格式:

DECLARE BROWSE2 CURSOR FOR

SELECT * FROM EMPLOYEE

WHERE (WORKDEPT = 'D11' AND FIRSTNME = 'DAVID')

OR (WORKDEPT = 'D11' AND FIRSTNME = 'BRUCE')

OR (WORKDEPT = 'D11' AND FIRSTNME = 'WILLIAM')

OR (WORKDEPT = 'E11' AND FIRSTNME = 'PHILIP')

OR (WORKDEPT = 'E11' AND FIRSTNME = 'MAUDE')

OR (WORKDEPT = 'A00' AND FIRSTNME BETWEEN

'CHRISTINE' AND 'DELORES')

相关文档