Sql-Server

如何在 CPU 時間方面減少 Temp Table 創建時間?

  • January 7, 2022

在頻繁執行的儲存過程中(有時高達每秒 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 TABLEDDL 語句更有效。

不需要CREATE TABLE經過計劃編譯過程(編譯一個簡化為從恆定掃描中選擇的執行計劃)然後執行它。

可能更重要的是(對於本次討論),CREATE TABLE儲存過程中的版本還可以允許更好地使用SQL Server 臨時對象記憶體,從而完全避免創建所需的大部分工作。

為此,您需要避免某些阻止記憶體的結構。有關詳細資訊,請參閱連結的文章。其中之一是“在對象創建後執行“DDL”。

CREATE TABLE允許在創建時以聲明方式定義索引和約束。

SELECT ... INTO將要求在創建後添加它們,因此此路由更有可能最終處於表不滿足記憶體要求的狀態。

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