DB2数据库大表关联优化咨询:920万行表连接查询过慢
DB2大表关联查询优化方案
问题背景
现有DB2两张表:
- Table_1:920万行,结构如下:
| Customer_ID | Offer | Item_list |
|---|---|---|
| A | X | 1 |
| A | Y | 2 |
| B | Y | 2 |
- Table_2:8.3万行,结构如下:
| Item_list | Item_ID |
|---|---|
| 1 | 111 |
| 1 | 222 |
| 1 | 333 |
| 2 | 111 |
| 2 | 444 |
需求是关联两表,得到每个客户对应的唯一Item_ID列表,预期结果:
| Customer_ID | Item_ID |
|---|---|
| A | 111 |
| A | 222 |
| A | 333 |
| A | 444 |
| B | 111 |
| B | 444 |
原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
相关产品推荐
相关产品推荐

