当前位置: 首页 > 面试题库 >

sp_executesql使用参数很慢

臧威
2023-03-14
问题内容

我使用dapper-dot-net作为ORM,它会产生以下缓慢执行(1700毫秒)的SQL代码。

exec sp_executesql N'SELECT TOP 5 SensorValue FROM "Values" WHERE DeviceId IN (@id1,@id2) AND SensorId = @sensor AND SensorValue != -32768 AND SensorValue != -32767',N'@id1 bigint,@id2 bigint,@sensor int',@id1=139,@id2=726,@sensor=178

当我通过删除参数来修改此代码时,查询将以极快的速度(20毫秒)执行。缺少这些参数是否应该造成很大的不同,为什么?

exec sp_executesql N'SELECT TOP 5 SensorValue FROM "Values" WHERE DeviceId IN (139,726) AND SensorId = 178 AND SensorValue != -32768 AND SensorValue != -32767'

问题答案:

在末尾添加OPTION(RECOMPILE)

... AND SensorValue != -32767 OPTION (RECOMPILE) 

我怀疑您正在经历“参数嗅探”

如果是这种情况,我们可以将其留给OPTION或考虑替代方案

更新1

以下文章将向您介绍“参数嗅探” http://pratchev.blogspot.be/2007/08/parameter-sniffing.html

我建议您先了解它的来龙去脉,因为它会使您更好地了解sql server内部(可能会咬人)。

如果你了解它,你就会知道,用重新编译选项的权衡可如果执行的语句是一个性能下降非常频繁。

在我知道根本原因是参数嗅探之后,我亲自添加了选项重新编译,除非有性能问题,否则将其保留。重写语句以避免错误的参数嗅探会导致意图丧失,从而降低了可维护性。但是在某些情况下,重写是合理的(这样做时请使用良好的注释)。

更新2

我在该主题上获得的最佳阅读是在第32章中“ GRANT FRITCHEY撰写的“参数嗅探:您最好的朋友……”

推荐



 类似资料:
  • 问题内容: 我想从查询中获取ID,但是我得到的是NULL,我的错误在哪里? 为什么@Id参数始终为null?我看不到我的错误? 问题答案: 首先,选择所希望的使用的输出变量然后分配该中值使用可变。另外,您应该使用变量在where子句中传递数据,以避免类似sql的注入问题(即,您不应像那样将其串联起来)。试试这个 : 在这里查看详细信息

  • 问题内容: 在SQL Server 2014中,我试图创建一个动态的WHERE子句。 我已将查询构建为字符串,但是当我尝试使用sp_executesql执行查询时,出现以下错误:提示 13您必须声明标量变量“ @desde”。 我不知道如何使sp_executesql识别输入参数。 问题答案: 代替 使用 您必须定义在动态查询中使用的参数,例如 请参考sp_executesql 否则,您可以将动态

  • 问题内容: 在下面的示例代码中,表名称是一个输入参数。在这种情况下,如何避免使用进行SQL注入。下面是示例代码,我尝试使用它来避免它,但是它不起作用。谁能告诉我如何纠正它? 输出:打印消息: 所有输入参数将完全替换,并删除一行。请让我知道如何处理这种情况。 问题答案: 您可以将表名包含在 但是,如果使用两部分命名约定,例如,则必须添加其他解析,因为这将导致: 无效的对象名称[dbo.tablena

  • 题目描述 有一段SQL语句,我把 sql 单独拿出赋值使用,可以使用条件查询;放在一起使用时条件查询没有效果 题目来源及自己的思路 相关代码 完整SQL: 单独使用的SQL: 你期待的结果是什么?实际看到的错误信息又是什么? 这是什么原因???求大神解答

  • 本文向大家介绍JavaScript 使用rest参数创建参数数组,包括了JavaScript 使用rest参数创建参数数组的使用技巧和注意事项,需要的朋友参考一下 示例 如果您需要一个数组,其中包含您可能会或可能不会希望拥有的额外参数,除了您明确声明的参数外,还可以在参数声明内使用array rest参数,如下所示: 示例1,数组中的可选参数: 示例2,所有参数现在都是一个数组: 控制台输出tru

  • 问题内容: 我有一个php文件,其中定义了许多功能,比如: 我想打电话给使用 AJAX 。谢谢您的帮助 问题答案: 您不能直接通过AJAX调用来调用PHP函数,但是您可以这样做: PHP: JS: