2

我对一个表中的大约 1,300,000 条记录进行了查询。它获取满足某些 WHERE 条件的某些记录并将它们插入到另一个表中。它首先完全清除目标表。

每次 Execute 完成查询所需的时间会大大缩短:

1st: 5 minutes, 3 seconds
2nd: 2 minutes, 43 seconds
3rd: 12 seconds
4th: 3 seconds

除了点击执行之外,我什么也没做。我的查询看起来像这样(出于长度目的,有些缩写):

DELETE FROM dbo.ConsolidatedLogs --clear target table

DECLARE @ClientID int

DECLARE c CURSOR FOR SELECT ClientID FROM dbo.Clients
OPEN c

FETCH NEXT FROM c INTO @ClientID --foreach LogID
WHILE @@FETCH_STATUS = 0
BEGIN

   INSERT INTO dbo.ConsolidatedLogs
        (col1, col2)
        SELECT col1, col2
        FROM dbo.CompleteLogsRaw
        WHERE col3 = true AND
              ClientID = @ClientID

   FETCH NEXT FROM c INTO @ClientID

END
CLOSE c
DEALLOCATE c

如何/为什么会发生这种情况?SQL Server 究竟在做什么使这成为可能?

此查询将作为 SQL Server 代理作业运行,每 3 小时运行一次。每次都需要整整 5 分钟,还是会更短,因为作业只运行这一个查询,即使它有 3 小时的延迟?

4

2 回答 2

8

如果每次运行相同的查询都变得更快,则很有可能会缓存内容。那么,东西可以缓存在哪里呢?

  • SQL Server 查询计划缓存
  • SQL Server 的查询缓存
  • 操作系统 IO 缓冲区
  • 硬盘控制器缓存
  • 硬盘磁盘缓存

您可以在运行之间清除 SQL Server 查询缓存,以查看该缓存的影响是什么

如何清除 SQL Server 查询缓存?

SQL Server 将使用任何专用于它的 RAM 将它经常访问的东西保存在 RAM 中而不是磁盘上。运行相同查询的次数越多,通常会在磁盘上找到的数据就越可能驻留在 RAM 中。

操作系统级别和硬件级别的缓存最容易通过重新启动来重置,如果您希望查看它们是否有助于改善结果。

如果您发布 SQL Server 用于每次执行查询的查询计划,则可以进行更详细的诊断。

于 2012-08-28T02:44:00.960 回答
1

当 Sql Server 在企业管理器中执行查询时,它会在第一次执行后创建一个“执行”或“查询计划”,并缓存该计划。简而言之,“查询计划”描述了 SQL Server 如何攻击满足结果所需的表、字段、索引和数据。每次重新运行它时,都会从计划缓存中获取该查询,并且省略了查询预处理器通常必须做的“繁重的工作”。这允许在第二次和后续执行时更快地执行查询。

请注意,这是对更详细(因此,本质上更酷)过程的过度简化,但那是查询计划 101 :)

于 2012-08-28T02:45:04.347 回答