【问题标题】:Passing SqlDataRecords to procedure is slower almost 9 times than without?将 SqlDataRecords 传递给过程比不传递要慢近 9 倍?
【发布时间】:2016-08-05 17:29:42
【问题描述】:

我有一个带有几个参数的存储过程。我的数据表类型有 2 列 (int, nvarchar)。

当我运行这个存储过程并传递具有定义类型的IEnumerable<SqlDataRecords> 时,我机器上的查询结果比不传递此参数的相同存储过程慢 9 倍。

存储过程不会触及这个参数。只是路过。

看起来像(sql server?)对作为结构化(表值)值传递的数据进行处理。

也许我错过了什么。也许有特殊的开关:

  • 关闭任何类型的验证
  • 还有什么?

类型:

CREATE TYPE dbo.MyData AS TABLE 
(
    [Ver] INT NOT NULL,
    [Name] NVARCHAR(225) NOT NULL
)

存储过程:

CREATE PROCEDURE [dbo].[SaveData]
    (@Id UNIQUEIDENTIFIER, @Data MyData READONLY)
AS
BEGIN
    SET NOCOUNT ON;
END

更新 1:

我已更改查询。这个存储过程什么都不做。区别在于传递值或空值。

更新 2:

添加了存储过程和类型定义。

更新 3:

我使用的是 SQL Server 2014 Express。

更新 4:

带参数的 5000 次迭代需要 11281 毫秒(443/秒),没有表值参数 - 1029 毫秒(4856/秒)。

【问题讨论】:

  • 发布您的存储过程以及您如何通过IEnumerable
  • 研究优化未知
  • @JoelCoehoorn 优化未知数?
  • @dariol,包括你的 IEnumerable 代码。
  • 具体时间是多少(以毫秒为单位)?没有规模的慢9倍没什么好说的。您通过该表参数发送的数据量是多少?即使 sproc 不使用它,自然也会涉及一些开销。

标签: c# sql-server performance table-valued-parameters


【解决方案1】:

我建议运行 SQL Profiler 来检查您对数据库的查询。您还可以通过右键单击数据库、单击“活动监视器”来查看使用 SSMS 活动监视器,并且可能会幸运地看到“最近昂贵的查询”。

【讨论】:

  • 已将更新 2 添加到问题中。
  • 如果不查看您的数据库,您可能会假设很多事情。如果将可枚举对象传递给查询,则通常使用“包含”或“输入”。如果您在查询中看到指数时间,您可以从查看索引、关系、网络延迟等开始。
猜你喜欢
  • 2019-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-09
  • 2016-07-14
  • 2010-12-08
  • 1970-01-01
相关资源
最近更新 更多