“Dynamic SQL 提升性能”这个说法并不绝对,准确地说:动态 SQL 在特定场景下可以提升性能,也可能降低性能。它提升性能的核心原因,主要是减少不必要的开销、提高执行计划复用率、避免全表扫描等。
下面从原理和常见场景说明。
静态 SQL 常写成:
SELECT * FROM orders
WHERE (status = @status OR @status IS NULL)
AND (city = @city OR @city IS NULL);
问题:
动态 SQL:
DECLARE @sql NVARCHAR(MAX) = 'SELECT * FROM orders WHERE 1=1';
IF @status IS NOT NULL
SET @sql += ' AND status = @status';
IF @city IS NOT NULL
SET @sql += ' AND city = @city';
✅ 只生成真正需要的 WHERE 条件
✅ 更容易走索引
✅ 减少 IO 和 CPU
例如:
动态 SQL 可以为不同场景选择不同最优路径
静态 SQL:
CREATE PROC p @type INT
AS
SELECT * FROM t WHERE type = @type;
动态 SQL + OPTION(RECOMPILE) 或不同 SQL 文本:
SET @sql = 'SELECT * FROM t WHERE type = @type OPTION(RECOMPILE)';
✅ 每次按真实参数生成计划
静态 SQL 常 SELECT *
动态 SQL 可:
➡ 减少网络、内存、临时表压力
SET @sql = 'SELECT * FROM log_' + @month;
⚠️ 注意事项:
✅ 多条件搜索(管理后台)
✅ 参数差异极大(数据分布不均)
✅ 动态表名 / 分表
✅ 静态 SQL 执行计划明显不合理
❌ 简单 CRUD
❌ 高频小查询
❌ 参数固定
Dynamic SQL 提升性能的本质:
让 SQL 在“正确的时间,用正确的结构,走正确的索引”
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。