肯定有办法重写谓词,使得谓词列上不再使用函数。要记住:在SQL语句的Select部分对列编写标量函数是完全可以的,不过如果在Where部分中对列使用函数,就会自动将谓词变成不可索引的谓词,并成为一个Stage 2谓词。例如:
SELECT EMPNO, LASTNAME
FROM EMP
WHERE YEAR(HIREDATE)=2005
应当写为:
SELECT EMPNO, LASTNAME
FROM EMP
WHERE HIREDATE BETWEEN'2005-01-01'and'2005-12-31'
如上所示重写这个语句之后,DB2可以选择使用列HIREDATE上的索引(如果存在这样一个索引)。但是如果在谓词中使用了YEAR函数,DB2就无法使用该列的索引了。
DB2 V9中,在列上创建索引时可以使用函数。V9称之为表达式索引(Index on Expression)。用函数和/或表达式创建这种表达式索引时,DB2会查看索引,如果它与SQL语句中的具体SQL函数和/或表达式匹配,就会使用这个索引。需要注意,即便如此,仍然要尽可能像上面那样重新编写查询。维护更多的索引可能成本很高,因为这样一来DBA需要管理的索引也会更多,而且它们会增加插入、删除和一些更新的成本。例如:
CREATE INDEX XEMP4 ON
EMP(YEAR(HIREDATE))
USING STOGROUP……
PRIQTY……SECQTY……