我正在尝试优化递归查询速度。完整查询运行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次。
帐户 - 帐号和行的主键。
在Ret中,帐户是唯一的。
在RetWh帐户中,每个数据日都是唯一的。
查询目标:从Ret_Wh中选择年龄在特定范围内的所有帐户,在该月的任何时间,并在该范围内具有特定状态。
然后从这些结果中选择,匹配Ret中的帐户,具有特定年龄“今天”,无论其状态如何。
我的目标:以不需要3.5分钟的方式执行此操作
Pseudo_Code:
@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加入#shrkining_list。最后,我从#shrinking_list中删除了一个帐户。然后while while,将一个较小的列表连接到Ret_Wh,从而加快查询,因为@sdt增加了1天。但是,我不知道如何将所选的完全相同的帐号传递给while中的外部变量,以便我可以从#shrinking_list中删除它。
关于这方面的任何想法,或者如何加快这一点?
答案 0 :(得分:2)
为什么使用游标一次从@sdt到@dt获取日期?
select distinct b.account, b.money
from Ret as B
join Ret_Wh as A
on A.account = B.account
and a.datadate >= @sdt
and a.datadate < @dt
and a.statusA = 'Red'
and a.statusB = 'Large'
and a.old between 61 and 80
where b.old = 81