WEB开发网
开发学院数据库DB2 DB2 最佳实践: 编写并调优查询语句以优化性能最佳... 阅读

DB2 最佳实践: 编写并调优查询语句以优化性能最佳实践

 2009-11-12 00:00:00 来源:WEB开发网   
核心提示: 在描述中避免使用连接谓词在描述中使用连接谓词把连接方法限制为了嵌套循环,另外,DB2 最佳实践: 编写并调优查询语句以优化性能最佳实践(3),对基数的评估可能不准确,下面是一些连接描述的例子:WHERESALES.PRICE*SALES.DISCOUNT=TRANS.FINAL_PRICEWHE

在描述中避免使用连接谓词

在描述中使用连接谓词把连接方法限制为了嵌套循环。另外,对基数的评估可能不准确。下面是一些连接描述的例子:

WHERE SALES.PRICE * SALES.DISCOUNT = TRANS.FINAL_PRICE 
 WHERE UPPER(CUST.LASTNAME) = TRANS.NAME

避免对本地谓词有过多的列描述

使用相反的描述来替代应用中的一个在本地谓词上有太多列的描述。考虑下面的例子:

XPRESSN(C) = 'constant' 
 INTEGER(TRANS_DATE)/100 = 200802

你可把它们语句重写为:

C = INVERSEXPRESSN('constant') 
 TRANS_DATE BETWEEN 20080201 AND 20080229

应用多列的描述将妨碍索引开始和结束键的使用,从而导致不准确的可选评估,并需要在查询运行时花费额外的时间来处理。这些描述同样会阻止对查询的重写优化,比如在列相等时的识别、使用常量来替换各列并且对只有一行返回的情况进行识别。在这之后的进一步的优化也可能会被阻止,因此会失去更多的优化机会。考虑下面的查询:

SELECT LASTNAME, CUST_ID, CUST_CODE FROM CUST 
 WHERE (CUST_ID * 100) + INT(CUST_CODE) = 123456 ORDER BY 1,2,3

你也可以用下面的语句:

SELECT LASTNAME, CUST_ID, CUST_CODE FROM CUST 
 WHERE CUST_ID = 1234 AND CUST_CODE = '56' ORDER BY 1,2,3

如果在 CUST_ID 上有一个唯一索引,重写的查询版本让查询优化器注意到最多一行记录将被返回。这避免了引入一个没有必要的排序操作。这也让 CUST_ID 和 CUST_CODE 列被 1234 和‘ 56 ’替代,从而避免了从数据页或索引页复制数据。最终,使得在 CUST_ID 上的谓词应用成一个索引开始或结束键。

上一页  1 2 3 4 5 6 7 8  下一页

Tags:DB 最佳 实践

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接