动态SQL比硬编码等效的时间长得多

use*_*427 7 sql sql-server

我有一个动态的SQL.运行大约需要4分钟.如果我改为使用SQL的输出并运行它,则需要大约20秒.为什么会出现差异?我知道在动态版本中构建SQL会花费一些时间,但我无法想象它的价格昂贵.

有人有主意吗?这两个查询应该是相同的,所以我怀疑它是查询计划缓存的奇怪之处,但实际上并没有多少想法.

编辑: 通过输出来澄清我的意思.

在动态SQL中,最后一行是

EXEC sp_executesql @myQuery,
    N'@var1 INT,
    @var2 INT,
    @var2 INT',
    @var1,
    @var2,
    @var3
Run Code Online (Sandbox Code Playgroud)

我获取了myQuery的值并将其放在自己的SQL文件中.那是在20秒运行,而使用执行的动态需要4分钟.

编辑2 我删除了参数.我得到了有趣的结果.动态SQL语句看到了性能提升.硬编码版本的性能受到了极大的打击.两者现在差不多了.

Bil*_*win 7

我将假设您使用的是Microsoft SQL Server(您只标记了您的问题"sql").

在某些情况下,不同的参数值可能导致不同的优化计划.然后缓存该优化计划,并在下次使用不同参数值执行查询时使用.但优化计划不是后续参数值的最佳计划.

这是一篇关于这个问题的文章和一些解决方法:https: //www.simple-talk.com/sql/t-sql-programming/parameter-sniffing/

所以是的 - 在某些情况下,与没有参数化运行相同的查询相比,使用参数化查询会导致性能不佳.

如果您无权发布您的代码,我们无法知道这是否适用于您的情况.

我尊重您不能这样做 - 通过发布到StackOverflow,您隐式地使用知识共享许可证许可您的代码和/或单词.但是,除非他们同意,否则分享由您的雇主拥有的代码是不合适的.


nin*_*xel 5

正如Bill Karwin所说,这可能是一个"参数嗅探"问题.尝试包括以下内容:

OPTION (RECOMPILE)
Run Code Online (Sandbox Code Playgroud)

在SQL查询结束时.

这里有一篇文章解释了什么参数嗅探:http://blogs.technet.com/b/mdegre/archive/2012/03/19/what-is-parameter-sniffing.aspx


que*_*uth 5

如果您使用的是 SQL Server 2008 或更高版本,请使用 OPTIMIZE FOR UNKNOWN 查询提示。将以下内容添加到动态查询的末尾:

OPTION (OPTIMIZE FOR (@var1 UNKNOWN, @var2 UNKNOWN, @var3 UNKNOWN))
Run Code Online (Sandbox Code Playgroud)

尝试更改输入或输出 @var1、@var2 和 @var3 的三个输入。是的,如果查询优化器试图对真正特别的东西使用统计信息,它真的会很昂贵。如果您的一个或多个变量是相当可预测的,则针对特定值优化这些变量,并针对未知值优化其余变量。查看此链接了解更多详情。

https://blogs.msdn.microsoft.com/sqlprogrammability/2008/11/26/optimize-for-unknown-a-little-known-sql-server-2008-feature/

需要明确的是,这可能是上面 ninjaPixel 所指出的参数嗅探问题。 OPTIMIZE FOR UNKNOWN可以为您提供比重新编译每个查询更好的结果,因为查询优化器依赖统计信息来进行编译。