为什么第一次执行查询需要两倍的时间?

时间:2011-04-01 09:05:21

标签: .net sql-server database tsql select

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

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

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

起初我认为这与缓存的执行计划有关,所以我在第二次运行后使用DBCC FREEPROCCACHE清除缓存,第三次运行仍然是10秒。

第一次执行查询时是否还有其他事情发生,并且可以更快地计算出来(即没有实际执行查询)?

2 个答案:

答案 0 :(得分:2)

第一次执行查询时,它正在被解析,编译和优化。下次执行查询时,DBMS将获取内部编译和优化版本并执行它。这就是造成执行时间差异的原因。

有关此过程的详细信息,请参阅this article

答案 1 :(得分:2)

我假设SQL Server有各种各样的缓存,包括表和索引,所以在第二次执行时,它可能已经有很多内存所需的数据。