在存储过程中,我需要在@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的整体性能。
任何想法如何做到这一点?
您可以使用以下单个语句执行此操作
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秒对于临时表来说听起来非常慢。