如何创建不会导致DB2挂起的查询?

时间:2013-02-13 08:50:14

标签: sql db2

我有一个包含三个表A,B和C的DB2数据库。

因此创建了数据库:

  

创建数据库数据库别名DB AUTOMATIC STORAGE YES ON / home / db2inst1   使用代码集UTF-8领域到PAGESIZE 32768

  • 表A为28列宽,1.8毫米。行和PID是主要的 键。列主要有int类型,但有些是varchar(200-400)。 索引:PID
  • 表B为7列宽,14号。行和主键PID_L。 它还有列C_SOURCE和ROW_COUNT。索引:PID,C_SOURCE
  • 表C为20列宽,14号。行和主键PID_S。 它还有一个列ROLE。索引:PID,PID_S

所有表都有列PID

我需要一个表格来汇总表B和C中的一些信息。选择适当项目的查询是:

SELECT
    T.*,
    (
        SELECT 
            COALESCE(SUM(ROW_COUNT),0)
        FROM 
            C as ITS,
            B as ITL
        WHERE 
            ITS.ROLE = 1
            AND ITS.PID = ITL.PID
            AND ITS.PID_S = ITL.C_SOURCE
            AND ITS.PID = T.PID
    ) AS RR
FROM 
    A as T;

运行此查询时,DB2服务器会快速使用大约3Gb内存。然而,使用top,CPU使用率很少超过5%,有些跳跃到大约13%。 DB2服务器是RedHat6.2 VM,每个内核有4个内核和2Ghz。

我让这个查询运行了24小时,似乎没有任何事情发生。其他查询,如简单选择等等,可以顺利运行。

问题:

  1. 您对可能完成同样事情的其他更高效的查询有什么建议吗?
  2. 此性能问题是否可能与数据库的配置有关?

2 个答案:

答案 0 :(得分:3)

我会尝试“解释”功能,看看db2在你的查询中做了什么

db2exfmt -d database -e schema -t -v%-w -1 -s% - #0 -n%-g OTIC

答案 1 :(得分:1)

您使用嵌套选择,我建议在第二个查询中调用您的表A,并将连接条件保留在表A和表C中。

我认为它可以优化查询的响应时间,但这一切都取决于表的创建(例如索引声明)。

致以最诚挚的问候,