4

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

数据库是这样创建的:

创建数据库 DB 别名 DB AUTOMATIC STORAGE YES ON /home/db2inst1 使用 codedeset UTF-8 区域 en 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. 这个性能问题是否可能与数据库的配置有关?
4

2 回答 2

3

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

db2exfmt -d 数据库 -e 模式 -t -v % -w -1 -s % -# 0 -n % -g OTIC

于 2013-02-13T11:32:00.540 回答
1

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

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

最好的祝福,

于 2017-11-28T13:37:29.340 回答