2015-05-22 6 views
0

У меня есть 2 вопроса. Индивидуально, оба работают хорошо. Как, когда я их совмещаю, они бегут ужасно медленно и время от времени на меня. Второй запрос возвращает список счетов-фактур, которые я хочу использовать в предложении 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.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) 
+0

При Объяснить 2-й запрос Что такое оценочное количество строк? Если это фактический запрос, кажется, что вам вообще не нужен этот подзапрос. Просто переместите условие WHERE на внешний запрос. 'Где ba.acct_id = i.bac_acc_id и ba.bill_acct_nbr IN ('16785616') и экстракт (месяц от i.prnt_tmsp) = 5 и экстракта (год от i.prnt_tmsp) = 2015)' – dnoeth

+0

Суб запросы могут быть довольно дорогими, особенно если количество строк у вас велико. Есть ли способ попытаться написать запрос, чтобы получить те же результаты без использования подзапросов? –

+0

Кроме того, «ЭКСТРАКТЫ» могут привести к неправильным оценкам, «i.prnt_tmsp> = timestamp» 2015-05-01 00:00:00 и «i.prnt_tmsp dnoeth

ответ

0

Я могу дать вам решение для объединения двух, которые хорошо зарекомендовали себя для нашего продукта. Это выглядит ужасно, но значительно улучшило производительность, создав список идентификаторов вверх в таблице temp.

(В стороне, вам действительно нужно взглянуть на огромное количество INNER JOIN в вашем запросе, так как это не помогает вашей производительности).

Вы бы хотели что-то вроде этого:

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 
+0

@llessa .......... ........ Спасибо .......... Раньше я использовал производную таблицу. Это одно и то же? Я думаю, что у меня только доступ к чтению, поэтому я не уверен, что могу создать временную таблицу, но я попытаюсь попробовать. Еще раз спасибо – Shaves

+0

@Shaves ........ Первый ответ [здесь] (http://stackoverflow.com/questions/2326395/) объясняет разницу довольно хорошо. Поскольку ваши идентификаторы фиксированы и не будут меняться, временная таблица даст вам лучшую производительность, так как вы не будете каждый раз получать список идентификаторов, а вместо этого просматриваете список идентификаторов, который уже существует. – Ilessa

+0

@illessa .............Я попытался создать таблицу, но не имею безопасности для этого; поэтому я использовал производную таблицу в прошлом. Я бухгалтер, и я больше занимаюсь ролью отчета; поэтому я относительно новичок в этом Спасибо за вашу помощь .... – Shaves

Смежные вопросы