我有一个同事声称在很多情况下动态 SQL 比静态 SQL 执行得更快,所以我经常看到 DSQL 到处都是。除了明显的缺点(例如在运行之前无法检测到错误以及难以阅读)之外,这是否准确?当我问他为什么一直使用 DSQL 时,他说:
当静态不会阻止缓存重用时,首选静态;当静态会阻止缓存重用且需要重用时,首选动态。
我问为什么静态 SQL 会阻止缓存重用,他说:
显然,当变量传递给语句谓词时,它可能会阻止该执行计划的缓存重用,而 DSQL 将允许在存储过程中重用缓存。
因此,例如:
select * from mytable where myvar = @myvar
Run Code Online (Sandbox Code Playgroud)
我不是 SQL Server 执行计划方面的专家,但这对我来说似乎不合理。为什么引擎会将统计信息保存在存储过程中的 DSQL 语句中,而不是静态 SQL 语句中?
动态 SQL 的优点是每次运行查询时都会重新编译。这样做的优点是执行计划可以利用表上的最新统计信息和任何参数的值。
除了更具可读性之外,静态 SQL 的优点是不需要重新编译——节省了运行查询的步骤(如果算上解析-->编译-->执行,实际上是两个步骤)。这可能是好事,也可能不是好事。
您可以使用该选项强制重新编译静态计划with (recompile)。
有时,您需要使用动态 SQL。不过,作为一般规则,在依赖动态 SQL 之前,我会使用编译器提示和其他措施来管理性能。
| 归档时间: |
|
| 查看次数: |
2688 次 |
| 最近记录: |