为什么/如何使用SQL查询更快?

为什么/如何使用SQL查询更快?,sql,sql-server,query-optimization,Sql,Sql Server,Query Optimization,我在一个表中查询了大约1300000条记录。它获取满足某些WHERE条件的某些记录,并将它们插入到另一个表中。它首先完全清除目标表 每次执行后,完成查询所需的时间大大缩短: 1st: 5 minutes, 3 seconds 2nd: 2 minutes, 43 seconds 3rd: 12 seconds 4th: 3 seconds 除了按执行键,我什么都没做。我的查询如下所示(出于长度目的,有些缩写): 这是怎么发生的/为什么发生的?SQL Server到底在做什么来实现这一点 此查询

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

每次执行后,完成查询所需的时间大大缩短:

1st: 5 minutes, 3 seconds
2nd: 2 minutes, 43 seconds
3rd: 12 seconds
4th: 3 seconds
除了按执行键,我什么都没做。我的查询如下所示(出于长度目的,有些缩写):

这是怎么发生的/为什么发生的?SQL Server到底在做什么来实现这一点


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

如果相同的查询每次运行都会加快速度,则缓存内容的可能性很大。那么,在哪里可以缓存东西呢

  • SQL Server查询计划缓存
  • SQL Server的查询缓存
  • 操作系统IO缓冲区
  • 硬盘控制器高速缓存
  • 磁盘缓存上的硬盘
您可以在运行之间清除SQL Server查询缓存,以查看该缓存的影响

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

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


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

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


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

Sweet。你应该在上面多放一点肉,然后把它作为答案,这样我就可以标记它。没错,但这本身并不需要5分钟到3秒的时间。如果查询缓存直接移动到RAM,可能会发生这种情况:)我确实注意到这是一个过于简化的过程。
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