Sql-Server-2008-R2

我應該將數據載入到臨時表中還是繼續從普通表中呼叫它?

  • November 6, 2013

我正在編寫一個程序,發現自己經常使用select帶有相同where子句的相同語句。目前,該表包含超過 55000 行,並且每天增長大約 100 行左右。這兩個where子句總共將數據減少到幾百行。

我多次執行完全相同的 select 語句,並且在同一次執行中數據結果將始終相同。在性能方面,繼續執行相同的選擇語句會更好,還是我應該insert into select只用我需要的數據填充臨時表並從那裡提取?

選擇語句執行(編輯了一些 ID):

SELECT WorkDay1, WorkDay1Brea, StartBreak, StrtTm
FROM dbo.DriverTimes
WHERE DriverTime.DrvrID = @DriverID
AND CONVERT(VARCHAR(12), dtwrkd, 112) = CONVERT(VARCHAR(12), @StartDate, 112)
AND PryllID IN (
ListOfIDs
);

每個驅動程序總共執行 8 次此選擇,並且有 40 個奇怪的驅動程序。

如果您要檢索的數據量很大 - 大致是數百萬條窄行,或數十萬條寬行,或帶有大對象的數万行 - 您可能應該將數據記憶體在臨時表中並重用它. 如果您正在執行重要的處理以獲取數據 - 例如表掃描 - 您可能應該記憶體它。除了速度之外,我還可以想到將數據轉儲到臨時表的其他幾個原因:

  • 它最大限度地減少了源表被鎖定的時間長度(這可能非常重要)。
  • 它使您有機會重命名欄位或使用僅適用於您的數據集的更嚴格的數據類型(例如 NOT NULL 約束)。
  • 它使您有機會添加原始中不存在的計算欄位或索引。

…反對:

  • 它需要一些額外的開發工作。
  • 它需要額外的空間、記憶體、磁碟或兩者兼而有之。

也就是說,這可能是過早的優化;你的 sproc 需要多長時間才能執行?

引用自:https://dba.stackexchange.com/questions/52615