使用排除列表优化递归查询

时间:2012-10-29 19:20:50

标签: tsql variables optimization while-loop temp-tables

我正在尝试优化递归查询速度。完整查询运行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和Ret_Wh都有上面列的列

查询目标:从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中删除它。

关于这方面的任何想法,或者如何加快这一点?

1 个答案:

答案 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