Sql 组合查询运行的时间更长
我有两个问题。就个人而言,两者都运行良好。当我把它们组合在一起时,它们运行得非常慢,并且在我身上超时。第二个查询返回我想在第一个查询的in子句中使用的发票列表。不确定我是否做错了什么。谢谢你的帮助Sql 组合查询运行的时间更长,sql,teradata,Sql,Teradata,我有两个问题。就个人而言,两者都运行良好。当我把它们组合在一起时,它们运行得非常慢,并且在我身上超时。第二个查询返回我想在第一个查询的in子句中使用的发票列表。不确定我是否做错了什么。谢谢你的帮助 select ba.bill_acct_nbr, ba.acct_name, i.inv_id, i.prnt_tmsp, i.due_dt, d.dvr_frst_name, d.dvr_srnm, r.ecr_ticket_no, r.co_tmsp, i.dr_note_amt , ht.am
select
ba.bill_acct_nbr,
ba.acct_name,
i.inv_id,
i.prnt_tmsp,
i.due_dt,
d.dvr_frst_name,
d.dvr_srnm,
r.ecr_ticket_no,
r.co_tmsp,
i.dr_note_amt ,
ht.amt HT,
vat.amt VAT
from rfs.rnt_agr_inv_notes i
inner join rfs.rnt_Agrs r on r.rnt_agr_nbr = i.rea_rnt_agr_nbr
inner join rfs_rv.dvr_rras d on r.rnt_agr_nbr = d.rdy_rnt_agr_nbr and d.main_dvr_flg = 'MR'
inner join rfs_rv.bus_acnts ba on ba.acct_id = i.bac_acc_id
inner join (select sum(chg_amt) amt, rain.inv_id
from rfs.rra_chgs rrc
inner join rfs.rnt_agr_inv_note_lns rainl on rrc.rrc_id=rainl.rrc_rrc_id
inner join rfs.rnt_agr_inv_notes rain on rainl.rai_inv_id=rain.inv_id
inner join rfs.rnt_agrs ra on rain.rea_rnt_agr_nbr=ra.rnt_agr_nbr
inner join rfs.rra_chg_typs rct on rrc.rct_chg_typ=rct.chg_typ
where rrc.rct_chg_typ not in ('TAX', 'SUR', 'VAT') and not ( ra.stn_system='ECR' and (rrc.rct_chg_typ ='02000' or rrc.rct_chg_typ ='02201'))
group by rain.inv_id) ht on ht.inv_id=i.inv_id
inner join (select sum(chg_amt) amt, rain.inv_id
from rfs.rra_chgs rrc
inner join rfs.rnt_agr_inv_note_lns rainl on rrc.rrc_id=rainl.rrc_rrc_id
inner join rfs.rnt_agr_inv_notes rain on rainl.rai_inv_id=rain.inv_id
inner join rfs.rnt_agrs ra on rain.rea_rnt_agr_nbr=ra.rnt_agr_nbr
inner join rfs.rra_chg_typs rct on rrc.rct_chg_typ=rct.chg_typ and not ( ra.stn_system='ECR' and rrc.rct_chg_typ ='02200')
where rrc.rct_chg_typ in ('TAX', 'SUR', 'VAT')
group by rain.inv_id) vat on vat.inv_id=i.inv_id
where
i.inv_id in (425001975206,550008226812,425002005105, 425002046396, 42500190929)
我注释掉了上面的最后一行,并将其替换为此代码;它本身运行良好
i.inv_id in (select
q.inv_id
from
rfs.rnt_agr_inv_notes q,
rfs_rv.bus_acnts ba
where
ba.acct_id = q.bac_acc_id
and ba.bill_acct_nbr IN ('16785616')
AND extract(MONTH from q.prnt_tmsp) = 5
AND extract(YEAR from q.prnt_tmsp) = 2015)
我可以给你一个结合这两者的解决方案,这对我们的产品很有效。它看起来很糟糕,但通过在临时表中提前生成ID列表,性能得到了极大的提高 另一方面,您确实需要查看查询中的大量内部联接,因为这无助于提高性能 你会想要这样的东西:
CREATE TABLE #invIds (id INT)
INSERT INTO #invIds (id) SELECT
q.inv_id
from
rfs.rnt_agr_inv_notes q,
rfs_rv.bus_acnts ba
where
ba.acct_id = q.bac_acc_id
and ba.bill_acct_nbr IN ('16785616')
AND extract(MONTH from q.prnt_tmsp) = 5
AND extract(YEAR from q.prnt_tmsp) = 2015
那么查询就会这样做
d.dvr_frst_name,
d.dvr_srnm,
r.ecr_ticket_no,
r.co_tmsp,
i.dr_note_amt ,
ht.amt HT,
vat.amt VAT
from rfs.rnt_agr_inv_notes I .....
.....where
i.inv_id in #invIds
当您解释第二个查询时,估计的行数是多少?如果这是实际的查询,那么您似乎根本不需要该子查询。只需将WHERE条件移动到外部查询。其中,“16785616”中的ba.acct_id=i.bac_acc_id和ba.bill_acct_nbr,i.prnt_tmsp=5的extractMONTH和i.prnt_tmsp=2015的extractYEAR子查询可能非常昂贵,尤其是在行数较大的情况下。有没有一种方法可以让您在不使用子查询的情况下尝试编写查询以获得相同的结果?此外,提取可能会导致错误的估计,i.prnt\u tmsp>=时间戳'2015-05-01 00:00:00'和i.prnt\u tmsp<时间戳'2015-06-01 00:00:00'可能更有效。我认为在子查询中添加相同的where,如42500197520650008226812425002005105、425002046396中的where inv\u id,42500190929将加快速度somewhat@dnoeth......The第二个查询中的行数将取决于客户编号。账单账户编号。在2015年5月5日的案例中,只有5个发票号码。2015年4月,共有10个发票编号。其他客户编号可能更多。@llessa…………谢谢…………我以前使用过派生表。这是同一件事吗?我想我只有读访问权限,所以我不确定我能不能创建一个临时表,但我想尝试一下。谢谢again@Shaves........The第一个答案很好地解释了这种差异。由于您的ID是固定的且不会更改,临时表将为您提供更好的性能,因为您不会每次都试图获取ID列表,而是根据已经存在的ID列表进行搜索。@illessa…………我已尝试创建该表,但没有这样做的安全性;这就是我过去使用派生表的原因。我是一名会计,越来越多地从事报告工作;所以我对这个比较陌生谢谢你的帮助。。。。