【问题标题】:Testing for Performance in Multiple SQL Queries在多个 SQL 查询中测试性能
【发布时间】:2012-04-10 09:46:54
【问题描述】:

我正在努力提高 SQL-Server-2008 上某些 SQL 查询的效率。执行每个查询有不同的方法,我想找到其中最快的方法。

但是,我遇到的问题是我无法确定哪个实际上执行得更快。理想情况下,我可以一个接一个地运行每个查询,看看哪个运行得最快。理想情况下...

问题是,SQL 对我来说太聪明了。在构建这些查询时,我多次运行它们。当我这样做时,查询的效率会自行提高。我想这是因为 SQL 所做的一些幕后工作。这是什么?如何避免?

例如,我运行一次查询,需要 30 秒。我再次运行它,它需要 10 秒。我运行查询的次数越多,它似乎运行得越快。

所以.. 有什么方法可以“清除缓存”或 SQL 中的任何等效方法吗?我想准确指示哪个查询实际上运行得更快。或者,进行我想要的测试类型的最佳方法是什么?

与此主题有关的任何信息都将被视为有效输入。

【问题讨论】:

  • 所以您是在代码中“构建”这些查询,然后也从代码中调用它们?
  • 是的@Icarus。我正在构建查询,并从 SQL Server 中的查询窗口执行它们。
  • SET STATISTICS IO ON 可以产生质量信息以及实际的执行计划,而不是依赖于查询持续时间(这取决于许多因素)。

标签: sql sql-server performance tsql sql-server-2008


【解决方案1】:

当查询首先运行时,数据很可能仍在磁盘上,SQl Server 必须获取此数据,当您运行相同的查询时,数据已经在 RAM 中,因此它会比进入磁盘快得多

运行DBCC DROPCLEANBUFFERSDBCC FREEPROCCACHE 来清除缓存而不需要重新启动

您需要查看执行计划、统计 io 和统计时间才能真正了解发生了什么。在计划中寻找转化和扫描(如果可能,你想寻找)。

另见Client Statistics in SSMS. Check execution times

【讨论】:

  • 在实时数据库@DarrenDavies 上使用它有什么需要注意的吗?很遗憾,我无法制作测试副本。
  • 是的..不要在实时数据库上运行它,因为它必须再次获取所有数据并且还会重新编译 procs
  • 如果我只能使用实时数据库,我应该..?
  • 在这种情况下查看执行计划并尝试通过查询SARGable来消除扫描
  • 我在某处读到关闭和重新打开 SQL Server 的效果与这些命令基本相同,对吗?
【解决方案2】:

您看到的速度提高是数据库查询缓存的结果。大多数关系数据库引擎都具有此功能,它会缓存查询结果,直到您读取的表被更新。

This post 提供了有关如何解决此问题以进行性能调整的良好指示。您还应该查看Execution Plans,它向您展示了数据库将如何运行查询,而不是实际运行它。这样做的好处是您可以查看是否在可以使用索引的地方进行全表扫描。

【讨论】:

    【解决方案3】:

    包括实际执行计划并执行以下命令:

    CHECKPOINT; 
    GO 
    DBCC DROPCLEANBUFFERS; 
    GO
    

    【讨论】:

      猜你喜欢
      • 2011-10-14
      • 1970-01-01
      • 2010-10-08
      • 2011-02-14
      • 1970-01-01
      • 2011-07-21
      • 1970-01-01
      相关资源
      最近更新 更多