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

多同结构不同名表UNION查询优化及新增表便捷处理方案咨询

SQL优化方案

1. 核心性能优化:替换UNION为UNION ALL

你当前使用的UNION会自动对结果集做去重排序,12张表拼接时这部分开销占比极高。如果确认各client表之间没有重复数据(业务上独立存储不同client数据一般不会重复),直接替换为UNION ALL,查询耗时可下降50%以上。

2. 降低后续维护成本:封装统一client视图

把所有client表的拼接逻辑封装到视图中,后续新增client表仅需要修改视图定义,业务查询代码完全无需调整:

视图创建语句

CREATE OR REPLACE VIEW v_all_client AS
-- 已有client表统一拼接
SELECT id, code, name, created_date, updated_date FROM client_1_tbl
UNION ALL
SELECT id, code, name, created_date, updated_date FROM client_2_tbl
UNION ALL
SELECT id, code, name, created_date, updated_date FROM client_3_tbl
-- ... 其他9张client表依次添加
UNION ALL
SELECT id, code, name, created_date, updated_date FROM client_12_tbl;

优化后的业务查询语句

仅需要关联一次master_tbl,避免原来每张表单独关联的重复开销:

SELECT ct.id, ct.code, ct.name, ct.created_date, ct.updated_date,
       mt.id, mt.section, mt.description, mt.image_path
FROM v_all_client AS ct
LEFT OUTER JOIN master_tbl AS mt ON ct.id = mt.client_id
-- 所有过滤条件统一写在这里即可
WHERE ct.code IN ('101','102','103','201','202','203','301','302','303');

3. 长期最优方案:改造为分区表

如果你的数据库支持分区表(MySQL、PostgreSQL、Oracle等均支持),建议直接将12张结构相同的client表合并为一张按业务维度分区的总表:

  • 分区键可以选择code的前缀,或者新增client_type字段做List分区,每个分区对应原有的一张client表
  • 后续新增client业务仅需要新增一个分区,不需要修改任何视图、查询代码
  • 数据库查询时会自动命中对应分区,性能远高于视图拼接方案

额外性能优化建议

  • 给所有client表的code字段、master_tbl的client_id字段添加索引,大幅提升过滤、关联的执行效率
  • 如果必须做结果去重,建议在拼接完成后统一做一次DISTINCT,不要用UNION逐次去重

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 01:27:01