0

Ich habe eine gespeicherte Prozedur zum Einfügen von Datensätzen.SQL-Leistungsdifferenz von Schleifen im Vergleich zum Aufrufen einer Funktion

Ich muss einen Datumswert für eine Spalte mit einer bestimmten Logik berechnen. Zur Zeit habe ich eine Schleife für die einzufügenden Daten erstellt und berechne das Datum.

Das Problem ist, ich muss vermeiden, die Schleife zu verwenden, um Daten einzufügen und müssen sie als Batch einfügen. Um das zu tun, muss ich die Datumsberechnungslogik auf eine Funktion verschieben.

Was ist der Unterschied in der Leistung Schleifen von Daten (derzeit haben) und die Verwendung einer Funktion.

Hier ist meine gespeicherten Prozedur:

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

Im Allgemeinen sollten Schleifen mit SQL vermieden werden. Es ist schwierig, eine genaue Antwort ohne Probendaten (vorzugsweise DDL + DML) und gewünschten Ergebnissen zu geben. –

+2

'(Einige Logik)' könnten Sie uns sagen, was es ist? Vielleicht ist es möglich, Ihre ganze Schleife durch eine "einprägsame" Aussage zu ersetzen. – Rokuto

+0

@Rokuto - Ich habe die Antwort aktualisiert – tarzanbappa

Antwort

0

Ihre ganze Schleife mit einer Anweisung ersetzen kann (Ich gehe davon aus Tabelle DayTable für jede Zeile von #WeeklyData gleich ist).

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

Nur nitpicking - "inner join ... on 1 = 1" ist in der Tat "cross join" ... –

Verwandte Themen