14. 优先使用Stage 1谓词而不是Stage 2谓词

为了获取数据,DB2使用了一种两阶段架构。数据管理器(Data Manager)称为第一阶段,即Stage 1,照惯例这个阶段会应用简单的SQL谓词,另外可以使用索引来获取数据。有时,Stage 1谓词也称为“可求值”(sargable)谓词,这是IBM的说法,表示可搜索参数(searchable argument)。如果数据管理器无法处理这个谓词,会把它传递到DB2的关系型数据服务(relational data service,RDS)部分,作为一个Stage 2(剩余)谓词。

Stage 1谓词的性能要优于Stage 2谓词,因为不同阶段间的数据传递在列值级进行。如果行在第1阶段已经限定,就会减少向第2阶段传递的行。索引可以进一步缩小搜索的范围,并减少处理。要确保SQL查询只请求真正需要的列,这样还可以限制返回结果集所需的处理量。

要尽量编写Stage 1谓词,而且应当是可索引的谓词。一般来讲,Stage 2谓词的性能表现往往不太好,会消耗额外的CPU资源。可以参考IBM性能手册(V9和V10可以查看“性能监视与调优”,V10还可以参考“管理性能”),以确定谓词是第1阶段谓词还是第2阶段谓词,检查时要确保DB2版本正确。每个新版本通常都会把很多Stage 2谓词改为Stage 1谓词来得到更好的效率。一些DB2 Explain工具会把各个SQL语句中的谓词分为Stage 1谓词和Stage 2谓词。

IBM新推出的Data Studio是一个很棒的工具,可以用来解释查询,因为它能指出谓词是第1阶段还是第2阶段。这个工具可以从IBM网站免费下载,另外还可以购买升级版。对于开发人员来说,免费版本已经很完美了,它能够对外提供原本仅IBM可见的更多优化工具信息,这是前所未有的。

谓词可以分为以下几类:

Stage 1可索引谓词和Stage 1不可索引谓词

Stage 2 不可索引谓词

Stage 3 应用筛选谓词

第1阶段处理很了解查询中的对象,可以利用索引来完成处理。第2阶段会处理函数和表达式,不过不能直接访问表和/或索引。DB2从查询中取出所有Stage 1谓词,处理这些谓词来得到数据,再将数据传递到第2阶段做进一步处理。Stage 3谓词是返回到应用的谓词,由应用确定是否保留这一行。这些Stage 3谓词并不算是严格意义上的一类DB2谓词,不过有时会用来表示根据程序代码中If逻辑应用筛选逻辑来确定某一行是否已处理。

处理Stage 1可索引谓词总能得到最优的筛选性能。不过,有些情况下,尽管一个谓词列为Stage 1可索引谓词,但并不这样处理。例如,如果一个谓词列为Stage 1谓词,但是它的筛选出现在联接处理之后,这个谓词就会变成Stage 2谓词。另外还有一些类似的情况,即取决于Stage 1谓词如何使用或者它与什么进行比较,这个谓词可能会变成一个Stage 2谓词。

对于不可索引谓词,由于它们所采用的编写方式,不允许DB2使用相关列上的索引进行处理。Stage 2谓词总是在数据获取之后应用,而不是在数据获取期间应用。很多Stage 2谓词可以采用不同方式重写,以便改写为Stage 1谓词。

Visual Explain工具(V8)或IBM Data Studio tool(V9)的当前版本将查询中的所有谓词分为几类:匹配索引谓词、扫描索引谓词、 Stage 1谓词和Stage 2谓词。这个工具很棒,可以给出直观显示,使你能看出是否存在Stage 2谓词来进行分析和重写。V9包含了Visual Explain,这是其优化服务中心(Optimization Service Center)工具或IBM Data Studio工具的一部分。

附录A 提供了一些例子,介绍了如何重写谓词。另外可以参见附录B中的Stage 1和Stage 2定义。

除此以外,还可以利用网站www-306.ibm.com/software/data/db2/zos/v9books.html。其中提供了 IBM V8、V9和V10手册的相应标签。另外可以在网上搜索“谓词处理小结”了解有关内容。

posted @ 2013-07-15 09:17  小土_  阅读(369)  评论(0编辑  收藏  举报