I have this proc that takes 12 seconds to update 1600 rows and enque
1600 messages(sendmsg is my enque procedure that calls oracles
dbms_enque).
I'm wondering if anyone has any suggestions for improving the
performance of this proc and if I can use FORALL(bulk binds) with AQ,
or possibly some other performance booster.
I'm running on a pentium III 800 Oracle 8.1.7...In production I won't
be using a PIII 800, I'll be on sun solaris, but the performance will
still be an issue...
PROCEDURE CheckForExpiredIOI IS
--PROCEDURE CheckForExpiredIOI (p_errRec OUT hsp_error_type) IS
--
- TYPES:
--
TYPE fixTabType is TABLE OF FIX_MESSAGE_TYPE;
TYPE ioiTabType is TABLE OF ioi.ioi_id%TYPE;
TYPE symbolTabType is TABLE OF ioi.symbol%TYPE;
TYPE sideTabType is TABLE OF ioi.side%TYPE;
TYPE ordTypeTabType is TABLE OF ioi.ord_type%TYPE;
TYPE clordidTabType is TABLE OF ioi.clordid%TYPE;
TYPE orderQtyTabType is TABLE OF ioi.order_qty%TYPE;
TYPE sciTabType is TABLE OF ioi.sender_comp_id%TYPE;
TYPE ssiTabType is TABLE OF ioi.sender_sub_id%TYPE;
TYPE obciTabType is TABLE OF ioi.on_behalf_comp_id%TYPE;
TYPE obsiTabType is TABLE OF ioi.on_behalf_sub_id%TYPE;
TYPE echoTextTabType is TABLE OF ioi.echo_text%TYPE;
--
- VARIABLES:
--
v_curTime Date := NEW_TIME(SYSDATE, 'EDT', 'GMT');
v_fixRec fix_message_type := fix_message_type.new;
v_fixRecTab fixTabType;
v_ioiTab ioiTabType;
v_symbolTab symbolTabType;
v_sideTab sideTabType;
v_ordTypeTab ordTypeTabType;
v_clordidTab clordidTabType;
v_orderQtyTab orderQtyTabType;
v_sciTab sciTabType;
v_ssiTab ssiTabType;
v_obciTab obciTabType;
v_obsiTab obsiTabType;
v_echoTextTab echoTextTabType;
--
--
BEGIN
/* SELECT ioi_id, symbol, side, ord_type, clordid, order_qty,
sender_comp_id sci, sender_sub_id ssi,
on_behalf_comp_id obci, on_behalf_sub_id obsi, echo_text
BULK COLLECT INTO v_ioiTab, v_symbolTab, v_sideTab, v_ordTypeTab,
v_clordidTab, v_orderQtyTab, v_sciTab, v_ssiTab,
v_obciTab, v_obsiTab, v_echoTextTab
FROM ioi
WHERE (status = 'A' OR status = 'V' OR status = 'M') and
(expire_time <=
v_curTime);
FORALL i IN 1..v_echoTextTab.COUNT
UPDATE IOI SET status = 'E' WHERE ioi_id = v_ioiTab(i);
*/--
UPDATE IOI
SET status = 'E'
WHERE (status = 'A' OR status = 'V' OR status = 'M') and
(expire_time <=
v_curTime)
RETURNING ioi_id, symbol, side, ord_type, clordid, order_qty,
sender_comp_id, sender_sub_id,
on_behalf_comp_id, on_behalf_sub_id, echo_text
BULK COLLECT INTO v_ioiTab, v_symbolTab, v_sideTab, v_ordTypeTab,
v_clordidTab, v_orderQtyTab, v_sciTab, v_ssiTab,
v_obciTab, v_obsiTab, v_echoTextTab;
--
- Get expired IOIs
--
FOR i IN 1..v_echoTextTab.COUNT LOOP
v_fixRec.order_id := v_ioiTab(i);
v_fixRec.symbol := v_symbolTab(i);
v_fixRec.side := v_sideTab(i);
v_fixRec.ord_type := v_ordTypeTab(i);
v_fixRec.client_ord_id := v_clordidTab(i);
v_fixRec.order_qty := v_orderQtyTab(i);
v_fixRec.sender_comp_id := v_sciTab(i);
v_fixRec.sender_sub_id := v_ssiTab(i);
v_fixRec.on_behalf_comp_id := v_obciTab(i);
v_fixRec.on_behalf_sub_id := v_obsiTab(i);
v_fixRec.hsp_echo_text := v_echoTextTab(i);
v_fixRec.hsp_status := 'E';
v_fixRec.exec_trans_type := '0';
v_fixRec.ord_status := 'C';
v_fixRec.transact_time := v_curTime;
v_fixRec.last_shares := 0;
v_fixRec.last_px := 0;
v_fixRec.cum_qty := 0;
v_fixRec.avg_price := 0;
hsp_utilities.SendFixMsg(hsp_utilities.v_fixQueOut, v_fixRec,
'8');
END LOOP;
END CheckForExpiredIOI;
Received on Tue Aug 28 2001 - 17:29:01 CDT