SQL - 使用日期间隔填充临时表,对性能的影响最小

问题描述 投票:0回答:1

在存储过程中,我需要在@StartDate和@EndDate之间以7天的日期间隔填充临时表,如下所示:

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

它工作正常,但执行需要1483毫秒。如果我随后将此表与更多数据连接起来,则需要更多时间来执行。我需要以某种方式减少这个时间来提高SP的整体性能。

任何想法如何做到这一点?

sql-server performance date stored-procedures temp-tables
1个回答
1
投票

您可以使用以下单个语句执行此操作

   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);

这应该比53个单独的语句/事务更快,但1.5秒对于临时表来说听起来非常慢。

© www.soinside.com 2019 - 2024. All rights reserved.