Update..Union All Vs multiple individual Updates -- performance?
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