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

如何优化使用UNION ALL合并多表的SQL查询?耗时约5秒

批量members_*表UNION ALL查询的优化建议

原查询示例:

set nocount on;
select name,phone,id from members_89 Where id=1639
union all
select name,phone,id from members_92 Where id=1639
union all
……(后续重复查询语句省略)

以下是针对性的优化方案:

  • *给所有members_表的id字段加覆盖索引
    每个members_*表都给id字段建非聚集索引,同时把name和phone包含进去,这样查询时直接从索引取数据,不用回表查原数据,能大幅减少单表查询的耗时:

    -- 单表创建索引语句,批量执行所有members_*表即可
    CREATE NONCLUSTERED INDEX IX_members_id_include ON members_89(id) INCLUDE(name, phone);
    
  • 用动态SQL自动拼接查询语句
    表数量多的话,手动写UNION ALL太麻烦还容易漏表,用动态SQL自动生成所有members_*表的查询:

    SET NOCOUNT ON;
    DECLARE @sql NVARCHAR(MAX) = '';
    
    SELECT @sql = @sql + 'SELECT name, phone, id FROM ' + QUOTENAME(TABLE_NAME) + ' WHERE id=1639 UNION ALL '
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_NAME LIKE 'members_%';
    
    -- 删掉最后多余的UNION ALL
    SET @sql = LEFT(@sql, LEN(@sql) - 10);
    
    EXEC sp_executesql @sql;
    
  • 合并为分区表(长期优化方案)
    如果这些members_*表是按规则拆分的(比如按用户id段、业务模块),建议合并成一个分区表,用原表后缀的数字作为分区键。这样查询时数据库会自动定位到对应分区,不用手动写一堆UNION ALL,后续新增表也不用改查询语句,维护成本低很多。

  • 排查服务器资源瓶颈
    看看查询的执行计划,有没有全表扫描的情况;同时检查服务器的CPU、内存、磁盘IO使用率,如果是资源不够导致的慢,得调整数据库配置(比如加大缓冲池)或者升级硬件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 23:25:18