2013-08-22 7 views
1

У меня есть следующий оператор обновления, который выполняется несколько раз и очень медленный (20+ секунд). Любые рекомендации о том, как улучшить свою производительность?Очень медленное заявление о обновлении

update acc_item 
set means_pay_no = m_pay_no 
where acc_item_no in (select distinct(acc.acc_item_no) 
         from acc_item acc, (select accm.acc_item_no acc1,accm.acc_item_no_2 acc2 
              from acc_item_match accm,acc_payment_item accp 
              where accp.acc_payment_no=pay_no 
              and (accm.acc_item_no = accp.acc_item_no or accm.acc_item_no_2 = accp.acc_item_no)) 
         where acc.acc_item_no = acc1 
         or acc.acc_item_no = acc2)      
and reversed_to_acc_item_no is null; 
+0

Покажите свой план выполнения. –

+0

Не забудьте принять ответ, чтобы мы смогли узнать, помогло ли оно –

ответ

0

Попробуйте вместо этого:

update acc_item 
set means_pay_no = m_pay_no 
where exists (select 1 
       from acc_item acc 
       where exists 
       (select 1 
       from acc_item_match accm,acc_payment_item accp 
       where accp.acc_payment_no=pay_no 
       and accp.acc_item_no in (accm.acc_item_no, accm.acc_item_no_2) 
       and acc.acc_item_no in (accm.acc_item_no, accm.acc_item_no_2) 
       ) and acc.acc_item_no = acc_item.acc_item_no 
      ) 
and reversed_to_acc_item_no is null; 
+0

Благодарим вас за ответ. Я попробовал, но, похоже, что-то не хватает. Мне трудно следовать логике. Что-то не хватает выше? – user2706266

+0

@ user2706266 Я попытался написать его снова, надеюсь, что на этот раз я ничего не забыл –

+0

Большое спасибо за вашу помощь, кажется, что он отлично работает с отличной производительностью – user2706266

0

Как насчет запроса инструкции insert в таблице temp?

select distinct(acc.acc_item_no) into #temptbl 
from acc_item acc, (select accm.acc_item_no acc1,accm.acc_item_no_2 acc2 
from acc_item_match accm,acc_payment_item accp 
where accp.acc_payment_no=pay_no 
and (accm.acc_item_no = accp.acc_item_no or accm.acc_item_no_2 = accp.acc_item_no)) 
where acc.acc_item_no = acc1 
or acc.acc_item_no = acc2 


update acc_item 
set means_pay_no = m_pay_no 
where acc_item_no in (select * from #temptbl)      
and reversed_to_acc_item_no is null; 
+0

Благодарим вас за ответ. – user2706266

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