0

我正在尝试优化递归查询以提高速度。完整查询运行 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 中删除。

对此有什么想法,或者总体上如何加快速度?

4

1 回答 1

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
于 2012-10-29T19:33:27.587 回答