如何优化使用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
相关产品推荐
相关产品推荐

