Sql-Server
如何在 CPU 時間方面減少 Temp Table 創建時間?
在頻繁執行的儲存過程中(有時高達每秒 10-15 次),有兩條特定語句顯示在按累積 CPU 影響排名前 10 的最重查詢中
這些是用於創建 #Temp 表的 DDL 語句:
SELECT cast(0 as int) as rowId , Column1 as tColumn1 , Column2 as tColumn2 , ... , Column14 as tColumn14 , cast(0 as datetime) as tUTC , -1 as tRefId INTO #TempTable1 FROM Table1 WITH(NOLOCK) WHERE 0=1
SELECT tColumn1, ..., tColumn14, tUtc, tRefId INTO #TempTable2 FROM #TempTable1 WHERE 0=1
上述任何 DDL,平均佔用 10-15 毫秒 CPU 時間,僅用於創建 #temp 表
更改儲存過程的邏輯,使其不創建臨時表,不是一種選擇
問題:就 CPU 時間而言,如何加快臨時表的創建時間?
SELECT ... INTO ... WHERE 0=1
可能是創建空表的便捷方法,但我希望簡單的
CREATE TABLE
DDL 語句更有效。不需要
CREATE TABLE
經過計劃編譯過程(編譯一個簡化為從恆定掃描中選擇的執行計劃)然後執行它。可能更重要的是(對於本次討論),
CREATE TABLE
儲存過程中的版本還可以允許更好地使用SQL Server 臨時對象記憶體,從而完全避免創建所需的大部分工作。為此,您需要避免某些阻止記憶體的結構。有關詳細資訊,請參閱連結的文章。其中之一是“在對象創建後執行“DDL”。
CREATE TABLE
允許在創建時以聲明方式定義索引和約束。
SELECT ... INTO
將要求在創建後添加它們,因此此路由更有可能最終處於表不滿足記憶體要求的狀態。