多同结构不同名表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
相关产品推荐
相关产品推荐

