【问题标题】:DataAdapter.Fill performance anomalyDataAdapter.Fill 性能异常
【发布时间】:2016-09-11 21:39:33
【问题描述】:

我有两个DataBasesDB1 & DB2:两个 DB 相同,DB2 是从 DB1 的备份创建的)。当我在两个 DBs 上运行存储过程 SP1 时,大约需要 2 秒才能在两个 DBs 上给我一个输出(select 语句)。

现在的问题是,当我从 service 指向这些 DBs 并尝试使用 DataAdapter.Fill 方法时,它给了我不同的时间(54 - 63 秒 DB1 和在DB242 - 44 秒)在DBs 上始终如一。注意到我使用相同的服务指向DBs,所以它不能是服务行为/性能。现在我的问题是:

这可能是什么原因?欢迎任何建议我应该调查什么

帮助信息:

  1. 两个数据库位于不同的servers(相同配置)上,但由于在SQL Server Management Studio 上执行SP 需要相同的时间 在DBs 上,所以我排除了DB server 性能的可能性。 网络延迟可能是一个因素但极不可能因为servers 位于同一网络上,实际上位于同一物理位置。这是我的 最后一个检查选项。

  2. 其他一些服务正在使用SQLDependency ON DB1。一直填充DataAdapter(s),这可能是我的原因吗 DataAdapter fill 减速的方法? (我猜不太可能)

根据下面 cmets 的要求,是填充 DataSet 的代码:

PS:上面提到的时间是上图中高亮代码行的执行时间。

【问题讨论】:

  • 如果DB2DB1 的恢复备份,那么DB1 是否只是有更多的过程返回的数据?我在想DB1 可能是一个生产数据库,而DB2 是一个测试数据库。所以第一个可能会以更快的速度填充新数据......
  • 您的select 查询是否包含带有参数的where
  • 通常当你听到 SSMS 里面快,外面慢,这闻起来像是参数嗅探问题。 stackoverflow.com/search?q=parameter+sniffing
  • @KyloRen 仅用于测试目的,以帮助确定问题是在数据库查询执行(第一部分 - ExecuteReader)还是物化中。如果大部分时间都在第一部分,那么您应该查看查询计划、参数嗅探等。
  • 当您 1. 交换两台服务器时会发生什么?从 server2 运行 DB1 并从 server1 运行 DB2 2. 缩小数据库 3. 删除/重新创建所有索引 附加问题:当您从 SQL Profiler 检查查询文本、计划和时间(cpu 读取、持续时间等)时,它们之间有什么区别吗?

标签: c# sql-server ado.net


【解决方案1】:

这听起来很像查询计划问题。

Erland Sommerskog 写了一篇关于这类问题的优秀文章, Slow in the Application, Fast in SSMS?.

我的第一个猜测是“The Default Settings”,但它也可能是其他问题之一。

【讨论】:

  • 这完全不是我的问题。我的问题是两个数据库的性能差异。
  • @KyloRen:等等,所以您担心的是 DB1 和 DB2 之间 20% 的差异,而不是 SSMS 和 ADO.NET 之间 2000% 的差异?
  • 是的,这是一个庞大的数据集,所以数据集需要时间来填充,这是两个数据库上的不同性能,我不知道为什么?
  • @KyloRen 首先,您应该在操作期间检查磁盘活动。如果需要从磁盘读取数据,例如恢复的数据库在文件系统上的碎片较少,因此读取速度更快。如果磁盘上没有活动,则再次归结为不同的查询计划。提到的文章也有一些很好的信息。
  • 碎片化是一个很好的建议。我没有检查它,因为在 SSMS 上两个 db 的性能相同?我这样做是对的吗?还是碎片化会这样?
【解决方案2】:

您是否尝试过不使用 SQL.StoredProcedure 而只是将其作为一行 SQL 运行: “执行 dbname.dbo.storedprocname 参数”。

它需要做更多的工作,因为你必须循环参数以添加到最后的字符串,但它是一个 SQL 字符串,它不关心你在做什么,它不会在幕后做任何有趣的事情.应该有类似的时间,如果失败,请尝试检查存储过程正在使用的数据库表上的索引等内容。

【讨论】:

    【解决方案3】:

    第一步 - 重建或重组您的索引。这通常是 SQL Server 最常见的性能问题,并且很容易修复。有时重启 SQL Server 也很重要

    【讨论】:

      猜你喜欢
      • 2017-10-08
      • 2020-04-28
      • 2011-01-29
      • 2012-12-16
      • 2014-03-22
      • 1970-01-01
      • 1970-01-01
      • 2019-01-14
      • 2010-11-12
      相关资源
      最近更新 更多