2017-12-28 28 views
0

innerhalb einer gespeicherten Prozedur, muss ich mit 7-Tage-Datum Abständen zwischen einigen @StartDate und @EndDate meine temporäre Tabelle füllen, etwa so:SQL - Bestücken temporäre Tabelle mit Datumsintervalle mit minimalen Auswirkungen auf die Leistung

CREATE TABLE #DateIntervals (
    PeriodStartDate date, 
    PeriodEndDate date 
) 

DECLARE @StartDate datetime = '1/1/2017'; 
DECLARE @EndDate datetime = '1/1/2018'; 

WHILE @StartDate <= @EndDate 
BEGIN 
    INSERT INTO #DateIntervals (PeriodStartDate, PeriodEndDate) 
    SELECT @StartDate, DATEADD(day, 6, @StartDate) 

    SET @StartDate = DATEADD(day, 7, @StartDate) 
END 

Es funktioniert gut, aber es dauert 1483 Millisekunden auszuführen. Wenn ich dann dieser Tabelle mit mehr Daten beitrete, wird es noch mehr Zeit zur Ausführung benötigen. Ich muss diese Zeit irgendwie reduzieren, um die Gesamtleistung des SP zu verbessern.

Irgendwelche Ideen, wie man das macht?

+1

Können Sie eine "Datums" -Tabelle erstellen und diese mit allen 7-Tage-Spannen für Jahre und Jahre füllen? Dann '' einfach '' '' bei Bedarf an den Tisch? Das Indizieren würde auch Ihrer Leistung helfen. – Forty3

+0

Es gibt bessere Möglichkeiten, aber das ist unglaublich langsam, 53 Zeilen einzufügen. Für mich dauert es 13ms https://i.stack.imgur.com/BCLd8.png –

+0

Möglicherweise war etwas falsch mit meinem SQL Server. Ich habe die App neu geladen, es begann viel schneller zu arbeiten. –

Antwort

1

Sie können dies als mit einer einzigen Anweisung tun unter

WITH 
    E1(N) AS 
    (
     SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
     SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
     SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 
    )          -- 1*10^1 or 10 rows 
    , E2(N) AS (SELECT 1 FROM E1 a, E1 b) -- 1*10^2 or 100 rows 
    , Nums(N) AS (SELECT ROW_NUMBER() OVER (ORDER BY @@SPID) FROM E2 a, E2 b) -- 1*10^4 or 10,000 rows 
    INSERT INTO #DateIntervals 
       (PeriodStartDate, 
       PeriodEndDate) 
    SELECT DATEADD(DAY, N * 7 - 7, @StartDate), 
      DATEADD(DAY, N * 7 - 1, @StartDate) 
    FROM Nums 
    WHERE N <= CEILING(DATEDIFF(DAY, @StartDate, @EndDate)/7.0); 

Dies sollte schneller als 53 einzelne Aussagen/Transaktionen, aber 1,5 Sekunden ertönt, dass gegen eine temporäre Tabelle erstaunlich langsam.

Verwandte Themen