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

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

 2009-11-12 00:00:00 来源:WEB开发网   
核心提示: 当一个描述在谓词中时,它可能不是总这么明显,DB2 最佳实践: 编写并调优查询语句以优化性能最佳实践(4),这种情况经常发生在涉及视图的查询中,尤其当视图列是通过描述定义的时候,这个谓词减少了对来自于部分查询计划的评估的行数,这个更小的行估计通常为后面的查询计划减少了行数和评估成本,比如,考虑下

当一个描述在谓词中时,它可能不是总这么明显。这种情况经常发生在涉及视图的查询中,尤其当视图列是通过描述定义的时候。比如,考虑下面视图定义和查询:

CREATE VIEW CUST_V AS 
 (SELECT LASTNAME, (CUST_ID * 100) + INT(CUST_CODE) AS CUST_KEY FROM CUST) 
 SELECT LASTNAME FROM CUST_V WHERE CUST_KEY = 123456

查询优化器把查询和视图定义合并了,产生下面的查询:

这是前面例子中有问题的谓词。你可以通过使用 explain 功能显示优化后的 SQL 语句来观察视图合并的结果。

如果相反的功能很难表达,考虑使用一个生成列。例如,如果你想找到一个满足 LASTNAME IN ('Woo', 'woo', 'WOO', 'WOo', and so on) 描述标准的姓氏,你可以创建一个生成列 UCASE(LASTNAME) = 'WOO' ,如下 :

CREATE TABLE CUSTOMER 
 (LASTNAME VARCHAR(100), 
 U_LASTNAME VARCHAR(100) GENERATED ALWAYS AS (UCASE(LASTNAME))) 
 CREATE INDEX CUST_U_LASTNAME ON CUSTOMER(U_LASTNAME)

避免连接列上的数据类型不匹配

在某些情况下,数据类型不匹配将妨碍使用哈希连接。哈希连接在连接谓词上比其他连接方法要多一些约束。特别是连接列的数据类型必须完全相同。例如,如果一个连接列是 FLOAT 另外一个是 REAL,哈希连接将不支持。另外,如果连接列数据类型是 CHAR、GRAPHIC、DECIMAL 或 DECFLOAT 则长度必须一样。

在谓词中不要使用 no-op 描述来更改优化器评估

一个“ no-op ” coalesce() 谓词以“ COALESCE(X, X) = X ”会引入一个评估错误到使用它的所有查询的计划中。现在 DB2 查询编译器没有能力不去选则那个谓词并确定是否所有的行具体满足它。作为结果,这个谓词减少了对来自于部分查询计划的评估的行数。这个更小的行估计通常为后面的查询计划减少了行数和评估成本,而有时选择不同计划的结果是因为不同候选计划之间的相关评估条件改变了。

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

Tags:DB 最佳 实践

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