【发布时间】:2021-02-04 03:57:36
【问题描述】:
我有以下代码,(基于社区成员的帮助):
use [Credible];
WITH DataSource AS
(
SELECT
ROW_NUMBER() OVER(ORDER BY epi.[client_id]) AS [row_id]
,epi.[client_id]
,CONVERT(date, epi.[admission_date]) AS [admission_date]
,CONVERT(date, DATEADD(MONTH, 3, epi.[admission_date])) AS [3Month Date]
,CONVERT(date, ISNULL(epi.[discharge_date], GETDATE())) AS [discharge_date]
FROM
[dbo].[ClientEpisode] epi
WHERE DATEADD(MONTH, 3, [admission_date]) <= ISNULL([discharge_date], GETDATE())
),
RecursiveDataSource AS
(
SELECT
[row_id]
,[client_id]
,[admission_date]
,[3Month Date]
,[discharge_date]
,0 AS [level]
FROM
DataSource
UNION ALL
SELECT
ds.[row_id]
,ds.[client_id]
,ds.[admission_date]
,DATEADD(MONTH, 3, rds.[3Month Date])
,ds.[discharge_date]
,[level] + 1
FROM
RecursiveDataSource rds
INNER JOIN DataSource ds ON
rds.[row_id] = ds.[row_id] AND DATEADD(MONTH, 3, rds.[3Month Date]) < ds.[discharge_date]
)
SELECT *
FROM RecursiveDataSource
ORDER BY [row_id]
,[level]
-- OPTION (MAXRECURSION 32767);
如果表中有多达 1000 条记录,此代码的运行速度约为 30 秒。
但我的表有超过 14 000 条记录,而且还会增长更多, 并且代码可以运行 10++ 分钟
有没有办法让它在 30 秒左右的时间内完成?
感谢您的帮助
【问题讨论】:
-
我想我会先在 DataSource 中获取查询并将其拆分到一个临时表中,然后尝试针对它运行 CTE。
-
我在这里回答了这个问题,但将答案移到了原始问题,因为它实际上是对原始问题的回应(例如,以不同的方式进行计算,而不是优化此 CTE)。我已经把它放在stackoverflow.com/questions/64383302/…
标签: sql performance tsql recursion common-table-expression