Skip to Main Content

SQL & PL/SQL

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Update..Union All Vs multiple individual Updates -- performance?

user32322435Aug 26 2009 — edited Aug 31 2009
Hi All,

I have a procedure which fetches data from a remote database. It performs multiple updates on a single table. Will it be any better in terms of performance if I have all the updates combined into one update using a UNION ALL.

Please advice in terms of performance or any other options of improving performance..

INSERT INTO BALAN (
deal_id, projection_period, deposit, spread
)
SELECT DEALID, 1, nvl(to_char(sum(avg_deposit) / count(avg_deposit), '99999999999.99'), 0) deposit,
nvl(to_char(sum(avg_float)/ count(avg_float), '99999999999.99'), 0) spread
FROM BILLING.CAP_ANST1@LINK_BILLN01D a
WHERE account = AACCOUNT
AND group_ind = GROUPID
AND stamp = v_stamp_date

UNION ALL

SELECT DEALID, 3, nvl(to_char(sum(avg_deposit) / count(avg_deposit), '99999999999.99'), 0) deposit,
nvl(to_char(sum(avg_float)/ count(avg_float), '99999999999.99'), 0) spread
FROM BILLING.CAP_ANST1@LINK_BILLN01D
WHERE account = AACCOUNT
AND group_ind = GROUPID
AND stamp >= v_stamp_date_minus_2

UNION ALL

SELECT DEALID, 6, nvl(to_char(sum(avg_deposit) / count(avg_deposit), '99999999999.99'), 0) deposit,
nvl(to_char(sum(avg_float)/ count(avg_float), '99999999999.99'), 0) spread
FROM BILLING.CAP_ANST1@LINK_BILLN01D
WHERE account = AACCOUNT
AND group_ind = GROUPID
AND stamp >= v_stamp_date_minus_5

UNION ALL

SELECT DEALID, 12, nvl(to_char(sum(avg_deposit) / count(avg_deposit), '99999999999.99'), 0) deposit,
nvl(TO_CHAR(SUM(avg_float)/ COUNT(avg_float), '99999999999.99'), 0) spread
FROM billing.CAP_ANST1@LINK_BILLN01D a
WHERE account = AACCOUNT
AND group_ind = GROUPID
AND stamp >= v_stamp_date_minus_11;

---------------- OR---------------------------------

INSERT INTO IDM.balan
(DEAL_id, PROJECTION_PERIOD, deposit, spread)
SELECT DEALID, 1, nvl(SUM (avg_deposit) / COUNT (avg_deposit), 0) deposit,
nvl(SUM (avg_float) / COUNT (avg_float),0) spread
FROM BILLING.CAP_ANST1@LINK_BILLN01D a
WHERE aaccount = a.ACCOUNT
AND a.group_ind = groupid
AND stamp = (SELECT to_date(value, 'MM/DD/YYYY')
FROM APP_ENV
WHERE name = 'CUR_STAMP');


INSERT INTO IDM.balan
(DEAL_id, projection_period, deposit, spread)
SELECT DEALID, 3, nvl( TO_CHAR(SUM (avg_deposit) / COUNT (avg_deposit), '99999999999.99'),0) deposit,
nvl( TO_CHAR(SUM (avg_float)/ COUNT (avg_float), '99999999999.99'),0) spread
FROM BILLING.CAP_ANST1@LINK_BILLN01D a
WHERE aaccount = a.ACCOUNT
AND a.group_ind = groupid
AND stamp >= (SELECT ADD_MONTHS (to_date(value, 'MM/DD/YYYY'), -2)
FROM APP_ENV
WHERE name = 'CUR_STAMP');


INSERT INTO IDM.balan
(DEAL_ID, projection_period, deposit, spread)
SELECT DEALID, 6,
nvl( TO_CHAR(SUM (avg_deposit) / COUNT (avg_deposit), '99999999999.99'),0) deposit,
nvl( TO_CHAR(SUM (avg_float)/ COUNT (avg_float), '99999999999.99'),0) spread
FROM billing.CAP_ANST1@LINK_BILLN01D a
WHERE a.ACCOUNT = aaccount
AND a.group_ind = groupid
AND stamp >= (SELECT ADD_MONTHS (to_date(value, 'MM/DD/YYYY'), -5)
FROM APP_ENV
WHERE name = 'CUR_STAMP');



INSERT INTO IDM.balan
(DEAL_ID, projection_period, deposit, spread)
SELECT DEALID, 12, nvl( TO_CHAR(SUM (avg_deposit) / COUNT (avg_deposit), '99999999999.99'),0) deposit,
nvl( TO_CHAR(SUM (avg_float)/ COUNT (avg_float), '99999999999.99'),0) spread
FROM billing.CAP_ANST1@LINK_BILLN01D a
WHERE aaccount = a.ACCOUNT
AND a.group_ind = groupid
AND stamp >= (SELECT ADD_MONTHS (to_date(value, 'MM/DD/YYYY'), -11)
FROM APP_ENV
WHERE name = 'CUR_STAMP');


Thanks in advance!

Appreciate your help!

Thanks
Bob
This post has been answered by 713017 on Aug 31 2009
Jump to Answer
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Sep 28 2009
Added on Aug 26 2009
6 comments
740 views