我正在使用相对较大的结果集(300K行)运行几个查询,并以链式方式将它们插入表中:
我将数据批量插入 Table0 ,然后从 Table0 读取数据并批量插入 Table1 ,从 Table1读取插入 Table2 等。为了读取数据,我使用ADO.NET命令在后台触发exec_sql
存储过程。
我经历过一个有趣的现象。当我重新创建数据库并在几个表上运行整个过程时,每个表大约需要20秒。但是,在每次后续执行过程时,查询只需要10秒钟即可执行。在插入数据之前,表总是被截断,因此数据量不会增长。
起初我认为这与缓存的执行计划有关,所以我在第二次运行后使用DBCC FREEPROCCACHE
清除缓存,第三次运行仍然是10秒。
第一次执行查询时是否还有其他事情发生,并且可以更快地计算出来(即没有实际执行查询)?
答案 0 :(得分:2)
第一次执行查询时,它正在被解析,编译和优化。下次执行查询时,DBMS将获取内部编译和优化版本并执行它。这就是造成执行时间差异的原因。
有关此过程的详细信息,请参阅this article。
答案 1 :(得分:2)
我假设SQL Server有各种各样的缓存,包括表和索引,所以在第二次执行时,它可能已经有很多内存所需的数据。