优化DB2中WHERE子句评估的顺序

时间:2011-07-27 19:56:54

标签: sql optimization db2 query-optimization where-clause

我正在使用两个非常大的表(A是~20E6行,B是~65E3行),我有非常详细的where子句来获取我需要的项目。可以加快速度的一件事是首先评估条目的创建日期(信息可以追溯到10年以上,只需要过去3年);这样可以在进行昂贵的字符串处理之前消除大部分数据。有没有办法强制评估WHERE date > cutoff_date在其他条款之前发生?

这是我的查询的样子。

SELECT A.C1, A.C2, 
SUM(CASE WHEN B.C1 = '[condition 1]' OR ...  [condition n] THEN 1 ELSE NULL END) 
    AS SUM_OF_B_C1, ... [other sums]
FROM DB.TABLE_A A LEFT JOIN DB.TABLE_B AS B ON B.COMMON_COL = A.COMMON_COL
WHERE B.DATE > DATE('[cutoff date]')
    AND [complex substr conditions]
    AND NOT [other complex string conditions]
GROUP BY A.C1, A.C2

一个问题是,我只有DB的读权限。通过控制中心查看,表A或B上似乎没有索引,因此优化路径已经用完。

你能提供的任何帮助都会很棒;我的小测试查询大约花了5分钟,产品查询大约要大20倍。

2 个答案:

答案 0 :(得分:2)

尝试超越现代查询优化器通常不会很有效率。我想你应该把时间花在做其他两件事上。

  1. 找出哪些业务流程可以让您在其上创建索引 应该有索引的列。
  2. 了解如何运行和解释EXPLAIN PLAN的输出。这个 让您通过显示代码的数字来管理 死得慢不是因为你不称职,而是因为他们 是 DB2被迫在整个地方进行表扫描。
  3. 具有 no 索引的表通常由程序生成,以简化查询和报告,或减少主数据库服务器上的负载。找出谁负责那些计划。和他们交朋友。给他们买披萨。想想“社会工程”。

答案 1 :(得分:0)

您可以在SELECT statement中使用WITH子句:

WITH
B2(col1, col2, ... ) AS (
    SELECT col1, col2, ...
    FROM DB.TABLE_B AS B
    WHERE B.DATE > DATE('[cutoff date]')
)
SELECT A.C1, A.C2, 
SUM(CASE WHEN B2.C1 = '[condition 1]' OR ...  [condition n] THEN 1 ELSE NULL END) 
    AS SUM_OF_B_C1, ... [other sums]
FROM DB.TABLE_A A LEFT JOIN B2 ON B2.COMMON_COL = A.COMMON_COL
WHERE 
    AND [complex substr conditions]
    AND NOT [other complex string conditions]
GROUP BY A.C1, A.C2