0

我有一個存儲過程來插入記錄。循環的SQL性能差異vs調用函數

我必須計算具有特定邏輯的列的日期值。目前,我已經爲插入的數據創建了一個循環,並進行計算來填充日期。

問題是我需要避免使用循環插入數據並需要將它們作爲批處理插入。爲了做到這一點,我必須將日期計算邏輯移到一個函數中。

循環數據(當前有)和使用函數在性能方面有什麼不同。

這裏是我的存儲過程:

WHILE @C <= @WeeklyDataCount 
BEGIN 
    DECLARE @PopulateDate DATE; 

    SELECT 
     @Value = D.Value, 
     @FromDate = D.FromDate 
    FROM 
     #WeeklyData D 
    WHERE 
     D.AutoId = @C; 

    -- Sample Date calculation logic that needs to move to a function 
    @DayCount = SELECT COUNT(*) 
       FROM DayTable 

    @Counter2 = 1; 

    WHILE @Counter2 < @DayCount 
    BEGIN 
     SET @PopulateDate = DATEADD(DAY, (-1 * @Counter2), @FromDate); 
     SET @Counter2 = @Counter2 + 1; 
    END 
    -- End of Day Calculation Logic 

    INSERT INTO TABLE1 (Value, PopulateDay) 
    VALUES(@Value, @PopulateDate) 

    SET @C= @C +1; 
END 
+3

一般來說,應該避免循環使用SQL。如果沒有樣本數據(最好是DDL + DML)和期望的結果,很難給出確切的答案。 –

+2

'(某些邏輯)'你能告訴我們它是什麼嗎?也許有可能用一些「朗朗上口」的陳述取代你的整個循環。 – Rokuto

+0

@Rokuto - 我已經更新了答案 – tarzanbappa

回答

0

你的整個循環可以用一個聲明(我假設表DayTable等於從#WeeklyData每一行)來代替。

INSERT INTO TABLE1 (Value,PopulateDay) 
SELECT 
    D.Value, 
    DATEADD(DAY,(-1 * ((DayCount * (DayCount - 1))/2)),D.FromDate) 
FROM #WeeklyData D 
CROSS JOIN (SELECT COUNT(*) AS DayCount FROM DayTable) C 
    WHERE D.AutoId <= @WeeklyDataCount 
+2

只是挑剔 - 「內部連接...在1 = 1上」實際上是「交叉連接」...... –