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

从.Net应用程序调用SQL函数与在Management Studio中进行相同调用时,为什么会有性能差异?

姚臻
2023-03-14
问题内容

测试和开发环境中,我们遇到了一个问题,该函数有时会从.Net应用程序调用时运行得非常慢。当我们直接从Management
Studio调用此功能时,它可以正常工作。

剖析它们时的区别是:从应用程序:
CPU:906
读取:61853
写入:0
持续时间:926

从SSMS发送:
CPU:15次
读取:11243次
写入:0
持续时间:31

现在我们已经确定,当我们重新编译该函数时,性能将返回到期望的值,并且从应用程序运行时的性能配置文件与从SSMS运行时获得的性能配置文件相匹配。它会以随机间隔再次开始减速。

我们尚未在产品中看到这一点,但它们的部分原因可能是因为每周都会重新编译所有内容。

那么什么可能导致这种行为呢?

编辑-
我们终于能够解决这个问题,并重组变量以处理参数嗅探似乎已经解决了问题……我们在此处所做的一小段:感谢您的帮助。

        -- create set of local variables for input parameters - this is to help performance - vis a vis "parameter sniffing"
    declare @dtDate_Local                  datetime
           ,@vcPriceType_Local             varchar(10)
           ,@iTradingStrategyID_Local      int
           ,@iAccountID_Local              int
           ,@vcSymbol_Local                varchar(10)
           ,@vcTradeSymbol_Local           varchar(10)
           ,@iDerivativeSymbolID_Local     int
           ,@bExcludeZeroPriceTrades_Local bit

   declare @dtMaxAggregatedDate     smalldatetime
          ,@iSymbolID               int
          ,@iDerivativePriceTypeID  int

   select @dtDate_Local                  = @dtDate
          ,@vcPriceType_Local             = @vcPriceType
          ,@iTradingStrategyID_Local      = @iTradingStrategyID
          ,@iAccountID_Local              = @iAccountID
          ,@vcSymbol_Local                = @vcSymbol
          ,@vcTradeSymbol_Local           = @vcTradeSymbol
          ,@iDerivativeSymbolID_Local     = @iDerivativeSymbolID
          ,@bExcludeZeroPriceTrades_Local = @bExcludeZeroPriceTrades

问题答案:

这通常是因为您在SSMS连接中获得了不同的执行计划。通常与参数嗅探问题相关,在该问题中,何时生成计划时使用的特定值对于参数的其他值而言是次最佳的。这也解释了为什么重新编译可以解决该问题。此线程似乎对SQL
Server中的参数嗅探(或欺骗)
有很好的解释。



 类似资料:
  • 问题内容: 我没有使用VB6进行很多编码,但是我现在正在更新现有的应用程序,并且遇到了一些麻烦。 我解决了这个问题。在VB6中,使用 LIKE* 时查询必须使用 % 通配符 ,但是在MS Access中,您必须使用 *通配符** 。 *** 我正在查询相同的数据库-(在MS Access中)。 在MS Access中进行查询时,以下查询有效: 当我在VB6中建立该查询时,我必须这样做: 发生了什么

  • 在我的应用程序中,我以以下方式加载缓存。 加载用户缓存loadUserCache() 加载帐户缓存loadAccountCache() 加载客户缓存loadCustomerCache() 上述每个调用都涉及一个数据库调用。像怀斯一样,有6-7个电话。 当我的应用程序加载时,我必须等待缓存加载。 那些都是一个接一个的顺序调用。 如果我能找到一种方法并行地进行这些调用,那么应用程序加载期间的等待时间将

  • 我目前试图控制静态功能运行时,例如单击静音,然后静音调用。目前,当添加或删除通道时,一切都在运行,但我的for lope根本不做任何事情。 我只是想控制您将在下面看到的代码何时在服务器端被调用,如果有意义的话,不需要添加或删除通道。 我使用的是express、AriJS客户端、JQuery和AsteriskAri。 有人能解释一下我是如何做到这一点的吗? 只需运行该函数,即静音阵列中的所有通道。

  • 我试图调用ViewModel中片段中的函数,但每次调用时它都会崩溃,我不知道为什么。下面是代码: 呼吁协程: 函数的代码: 如果我不使用协同程序,只使用我收到一个错误,说我必须从其他挂起函数或协同程序调用这个函数。 这就是错误: 我的ViewModel是: 在我称之为协程的片段中,我这样声明它:

  • 问题内容: 我想在SQL Server中创建调用函数,该函数接收两个参数并返回一个整数。当我调用存储过程时,我使用以下代码: 在这种情况下,我有一个由存储过程返回的表。如果我想使用返回标量值的函数而不是存储过程,会有什么变化? 问题答案: 您不能直接调用该函数,只是,( 查询 ),并且是允许的。由于您已经接触过存储过程,因此为什么不创建一个具有该功能的过程呢? 在您的C#代码中,您可以使用命令对象

  • 我使用从iPython笔记本下载CSV时建议的代码动态构建javascript代码,并在从jupyter笔记本调用时使用python中的javascript()将其传递给浏览器。代码工作得很好。如果我在python函数中嵌入相同的代码,并从同一个jupyter笔记本调用python函数,那么python中的调用Javascript()将不再有效。如何使可重用功能正常工作? 我正在Windows 1