【问题标题】:Why does the first execution of the query take twice as long?为什么第一次执行查询需要两倍的时间?
【发布时间】:2011-07-27 13:04:14
【问题描述】:

我正在运行几个具有相对庞大的结果集(300K 行)的查询,并将它们以链式方式插入到表中:

我将数据批量插入Table0,然后从Table0读取数据并批量插入Table1,从Table1读取strong> 插入 Table2 等。为了读取数据,我使用 ADO.NET 命令在后台触发 exec_sql 存储过程。

我经历了一个有趣的现象。当我重新创建数据库并在几个表上运行整个过程时,每个表大约需要 20 秒。但是,在该流程的每次后续执行中,查询只需 10 秒即可执行。在插入数据之前,表格总是被截断,因此数据量不会增长。

一开始我以为这和缓存的执行计划有关,所以我在第二次运行后使用DBCC FREEPROCCACHE清除了缓存,第三次运行仍然是10秒。

第一次执行查询时是否会发生任何其他事情,是否可以更快地找出它们(即没有实际执行查询)?

【问题讨论】:

    标签: .net sql-server database tsql select


    【解决方案1】:

    我假设 SQL Server 对包括表和索引在内的各种内容都有缓存,因此在第二次执行时,它可能已经在内存中拥有大量所需的数据。

    【讨论】:

      【解决方案2】:

      第一次执行查询时,它正在被解析、编译和优化。下次执行查询时,DBMS 会采用内部编译和优化的版本并执行它。这就是导致执行时间不同的原因。

      有关此过程的更多信息,请阅读this article

      【讨论】:

      • 这就是我的想法,但清除所有缓存并不会使查询持续时间显着延长。另外,我不明白为什么编译和优化查询需要10秒(查询本身比较简单,只是数据量很大)。
      • 虽然缓存有这么多级别 - 这不仅仅是查询编译/缓存,还有您的 I/O 系统,它在操作系统和硬件中都有缓存。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-21
      • 1970-01-01
      • 1970-01-01
      • 2018-01-28
      • 2015-12-22
      • 1970-01-01
      • 2019-07-28
      相关资源
      最近更新 更多