编写包含非列表达式(non-column expression)的谓词时,有一点很重要,即要确保各个表达式的结果与所比较的列有相同的定义。优化工具首先确定等号左边列的数据类型(例如,smallint),然后计算右边表达式结果的最大规模。如果smallint定义能满足结果的最大规模,那么这个谓词就是一个可索引的Stage 1谓词。如果最大规模过大,smallint定义无法满足,或者结果是一个小数(这就要求为这个比较完成数据转换),这样谓词就是Stage 2不可索引谓词。
优化工具可以完成向下类型强制转换,从而将列与更小的值比较,但是(目前还)不能完成向上强制转换,无法将列与一个更大的值比较。对于V8或更高版本,这通常不是问题,因为DB2已经改进了与不同数据类型数值的比较,不过保证表达式与列定义一致是一个好习惯,这样可以考虑到那些可能还未涵盖的情况。
例如:
WHERE EDLEVEL=123.45*12
应该写为:
WHERE EDLEVEL=SMALLINT(ROUND(123.45*12,0))
首先会执行乘法,取整,然后转换为一个smallint。将smallint类型的列EDLEVEL与这个值比较,可以确保这是一个Stage 1可索引谓词。