You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DB2数据库大表关联优化咨询:920万行表连接查询过慢

DB2大表关联查询优化方案

问题背景

现有DB2两张表:

  • Table_1:920万行,结构如下:
Customer_IDOfferItem_list
AX1
AY2
BY2
  • Table_2:8.3万行,结构如下:
Item_listItem_ID
1111
1222
1333
2111
2444

需求是关联两表,得到每个客户对应的唯一Item_ID列表,预期结果:

Customer_IDItem_ID
A111
A222
A333
A444
B111
B444

原SQL运行25分钟无结果:

SELECT      A.CUSTOMER_ID, B.ITEM_ID
FROM        TABLE_1 A
LEFT JOIN
            TABLE_2 B
ON          A.ITEM_LIST = B.ITEM_LIST
GROUP BY    A.CUSTOMER_ID, B.ITEM_ID
;

原SQL性能瓶颈分析

原SQL直接用920万行的Table_1做LEFT JOIN,会先生成大量重复的关联结果(同一个客户同个Item_list会因多条Offer重复关联),再通过GROUP BY去重,相当于先膨胀数据再压缩,IO和计算量极大,导致性能极差。

优化方案

1. 先对Table_1去重再关联

先提取Table_1中Customer_ID和Item_list的唯一组合,再关联Table_2,大幅减少关联的数据量:

-- 方案1:用DISTINCT去重子查询
SELECT DISTINCT A.CUSTOMER_ID, B.ITEM_ID
FROM (
    SELECT DISTINCT CUSTOMER_ID, ITEM_LIST
    FROM TABLE_1
) A
JOIN TABLE_2 B ON A.ITEM_LIST = B.ITEM_LIST;
-- 方案2:用GROUP BY去重子查询
SELECT A.CUSTOMER_ID, B.ITEM_ID
FROM (
    SELECT CUSTOMER_ID, ITEM_LIST
    FROM TABLE_1
    GROUP BY CUSTOMER_ID, ITEM_LIST
) A
JOIN TABLE_2 B ON A.ITEM_LIST = B.ITEM_LIST;

2. 调整JOIN类型(可选)

如果业务上不需要保留Table_1中没有匹配到Item_ID的客户记录,将LEFT JOIN改为INNER JOIN,避免处理无匹配的冗余数据,进一步提升效率。

3. 添加索引加速查询

创建以下索引,让数据库可以快速定位数据,避免全表扫描:

-- 给Table_1创建联合索引,加速去重子查询
CREATE INDEX idx_t1_cid_item ON TABLE_1(CUSTOMER_ID, ITEM_LIST);

-- 给Table_2创建索引,加速关联匹配
CREATE INDEX idx_t2_item ON TABLE_2(ITEM_LIST);

内容的提问来源于stack exchange,提问作者SRJCoding

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 04:49:53