我正在尝试优化递归查询以提高速度。完整查询运行 15 分钟。我尝试优化的部分需要大约 3.5 分钟才能执行,并且在查询中使用了两次相同的逻辑。
描述:
Table Ret contains over 300K rows with 30 columns (Daily snapshot)
Table Ret_Wh is the werehouse for Ret with over 5million rows (Snapshot history, 90days)
datadate - 记录信息的日期(如 10-01-2012)
statusA - 帐户可以拥有的状态,例如(红色,蓝色)。
statusB - 帐户可以拥有的不同状态,例如(大,小)。
状态每天都在变化。
old - 帐户的整数年龄。如果帐户上有付款,则可以增加/减少年龄。否则每天增加 1。
account - 帐号和一行的主键。
在 Ret 中,该帐户是唯一的。
在 RetWh 中,每个数据日期的帐户都是唯一的。
money - 帐户中的美元
Ret 和 Ret_Wh 都有上面列出的列
查询目标:从 Ret_Wh 中选择所有年龄在某个范围内、在当月的任何时间、在该范围内具有特定状态的所有帐户。
然后从这些结果中选择,匹配 Ret 中具有特定年龄“今天”的帐户,无论其状态如何。
我的目标:以不需要 3.5 分钟的方式完成此操作
伪代码:
@sdt='2012-10-01' -- or the beginning of any month
@dt = getdate()
create table #temp (account char(20))
create table #result (account char(20), money money)
while @sdt < @dt
BEGIN
insert into #temp
select
A.account
from Ret_Wh as A
where a.datadate = @sdt
and a.statusA = 'Red'
and a.statusB = 'Large'
and a.old between 61 and 80
set @sdt=(add 1 day to @sdt)
END
------
select distinct
b.account
,b.money
into #result
from #temp as A
join (Select account, money from Ret where old = 81) as B
on A.account=B.account
我想在 Ret_Wh 中创建一个不同的帐户列表(称为 #shrinking_list)。然后,在此期间,我将 Ret_Wh 加入到#shrking_list。最后,我从#shrinking_list 中删除了一个帐户。然后 while 迭代,将一个较小的列表加入到 Ret_Wh,从而随着 @sdt 增加 1 天而加快查询速度。但是,我不知道如何将选择的完全相同的帐号同时传递给外部变量,以便我可以将其从#shrinking_list 中删除。
对此有什么想法,或者总体上如何加快速度?