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

时间:2012-08-28 02:26:21

标签: sql sql-server query-optimization

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

每次执行时,完成查询所需的时间会更好:

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

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

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个小时的延迟?

2 个答案:

答案 0 :(得分:8)

如果每次运行时相同的查询变得更快,那么很有可能会缓存事物。那么,哪些东西可以缓存?

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

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

How can I clear the SQL Server query cache?

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

如果您希望了解它们是否有助于改善结果,则可以通过重新启动来轻松重置操作系统级别和硬件级别缓存。

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

答案 1 :(得分:1)

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

请注意,这是一个过于简单化的(因此,本质上更冷却)过程,但那是查询计划101:)