2012-08-28 59 views
2

我對一個表中的約1,300,000條記錄進行了查詢。它需要滿足某些WHERE條件的某些記錄並將它們插入到另一個表中。它首先完全清除目標表。爲什麼我的SQL查詢的使用速度更快?

拍攝完成查詢的時間變得與每個執行更好地完成:

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

兩個詞:查詢計劃 – LittleBobbyTables

+0

甜。你應該多放點肉,並把它作爲答案,以便我可以標記它。 – CptSupermrkt

回答

8

如果在每次運行時相同的查詢得到更快的速度,那麼存在一個很好的緩存機會。那麼,什麼地方可以緩存?

  • SQL Server查詢計劃緩存
  • SQL Server的查詢緩存
  • 操作系統IO緩衝區
  • 硬盤控制器緩存
  • 硬盤磁盤緩存

可以清除運行之間的SQL Server查詢緩存以查看該緩存的影響是什麼

How can I clear the SQL Server query cache?

SQL Server將使用任何RAM專用於它來保留在RAM中而不是在磁盤上訪問的內容。運行相同查詢的次數越多,通常在磁盤上找到的數據就越有可能駐留在RAM中。

如果您希望查看它們是否有助於改進結果,則OS級別和硬件級別緩存最容易通過重新啓動來重置。

如果您發佈SQL Server用於查詢執行的查詢計劃,則可以執行更詳細的診斷。

+0

好,詳細的解答 – LittleBobbyTables

1

當Sql Server在企業管理器中執行查詢時,它會在第一次執行後創建一個「執行」或「查詢計劃」,並緩存該計劃。簡而言之,「查詢計劃」描述了SQL Server如何攻擊滿足結果所需的表,字段,索引和數據。每次您重新運行該查詢時,該查詢都會從計劃緩存中獲取,而查詢預處理器通常必須執行的「繁重工作」將被省略。這可以使查詢在第二次執行和後續執行時更快速地執行。

你要知道,這是一個更詳細的(因此,本質上冷卻器)工藝過於簡單,但這是查詢計劃101個:)

+0

真實的,但本身並不需要的東西從5分鐘到3秒。 –

+0

它*威力*如果查詢緩存已經直接移動到RAM :)我沒有注意到這是過程的過於簡單化。 –

相關問題