我在一个表中对大约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个小时的延迟?
发布于 2012-08-28 02:44:01
如果相同的查询在每次运行时都变得更快,那么缓存数据的可能性很大。那么,数据可以缓存在哪里呢?
<代码>F211
您可以在两次运行之间清除SQL Server查询缓存,以查看该缓存的影响
How can I clear the SQL Server query cache?
SQL Server将使用任何专用于它的RAM,将它经常访问的内容保存在RAM中,而不是磁盘上。运行同一查询的次数越多,通常可以在磁盘上找到的数据就越有可能驻留在RAM中。
如果您希望查看操作系统级缓存和硬件级缓存是否有助于提高性能,则最容易通过执行重新启动来重置它们。
如果发布SQL Server用于每次执行查询的查询计划,则可以进行更详细的诊断。
发布于 2012-08-28 02:45:04
当Sql Server在Enterprise Manager中执行查询时,它会在第一次执行后创建一个“执行”或“查询计划”,并缓存该计划。简而言之,“查询计划”描述了SQL Server将如何攻击满足结果所需的表、字段、索引和数据。每次重新运行它时,都会从计划缓存中提取该查询,并且省略了查询预处理器通常必须执行的“繁重任务”。这允许在第二次和随后的执行中更快地执行查询。
请注意,这是对一个更详细(因此,本质上更酷)的过程的过度简化,但这是查询计划101:
https://stackoverflow.com/questions/12152012
复制