‎2006 Aug 25 5:39 PM
Hi All,
The following code takes long time to run. Any inputs on how it can be tuned.
SELECT vbak~vbeln vbap~posnr vbak~erdat vbak~erzet
vbak~auart vbak~waerk vbkd~kdgrp vbak~lifsk
vbak~vsbed vbak~bstnk vbak~rplnr vbak~bsark vbak~kunnr
vbap~matnr vbap~arktx vbap~kzwi3 vbap~kzwi4 vbap~abgru
vbap~netwr
vbap~kwmeng vbak~vkorg vbkd~bzirk vbkd~ihrez
vbkd~bsark vbkd~zterm vbkd~prsdt
vbak~zzwebuname vbak~augru
vbap~matkl vbap~prodh
vbak~zzwebpid
INTO TABLE t_order
FROM vbak INNER JOIN vbkd
ON vbak~vbeln EQ vbkd~vbeln
INNER JOIN vbap
ON vbak~vbeln EQ vbap~vbeln
WHERE vbak~vkorg IN s_vkorg
AND vbak~erdat IN s_erdat
AND vbak~auart IN s_auart
AND vbkd~posnr EQ '000000'
AND vbkd~kdgrp IN s_kdgrp
AND vbkd~bzirk IN s_bzirk.
SORT t_order BY vbeln posnr.
CLEAR z_total_rec.
LOOP AT t_order.
CLEAR t_outso.
ON CHANGE OF t_order-vbeln.
CLEAR: fpltc, v_ccnum.
CLEAR: v_cre_rev, v_frd_rev, v_frd_rvr,
v_frd_rrr, v_crg_back.
IF NOT t_order-rplnr IS INITIAL.
SELECT fpltr ccins ccnum datbi rcavr ccold
audat autim aunum autra rcrsp cctyp
FROM fpltc UP TO 1 ROWS
INTO (fpltc-fpltr, fpltc-ccins, fpltc-ccnum,
fpltc-datbi, fpltc-rcavr, fpltc-ccold,
fpltc-audat, fpltc-autim, fpltc-aunum,
fpltc-autra, fpltc-rcrsp, fpltc-cctyp)
WHERE fplnr = t_order-rplnr
ORDER BY fpltr DESCENDING.
ENDSELECT.
ENDIF.
CONCATENATE sy-mandt t_order-vbeln INTO v_tabkey.
REFRESH cdpos_tab.
CLEAR: cdpos_tab,z5_block,z5_block_released.
SELECT * FROM cdpos INTO TABLE cdpos_tab
WHERE objectclas EQ 'VERKBELEG' AND
objectid EQ t_order-vbeln AND
tabname EQ 'VBAK' AND
tabkey EQ v_tabkey AND
fname EQ 'LIFSK'.
IF sy-subrc EQ 0.
LOOP AT cdpos_tab.
IF cdpos_tab-value_new = 'Z5' OR cdpos_tab-value_old = 'Z5'.
z5_block = 'Y'.
ENDIF.
IF cdpos_tab-value_new = ' ' AND cdpos_tab-value_old = 'Z5'.
z5_block_released = 'Y'.
ENDIF.
ENDLOOP.
IF z5_block IS INITIAL.
IF t_order-lifsk = 'Z5'.
z5_block = 'Y'.
ENDIF.
ENDIF.
SELECT SINGLE cmgst INTO vbuk-cmgst
FROM vbuk
WHERE vbeln EQ t_order-vbeln.
IF vbuk-cmgst EQ 'B'.
v_cre_rev = 'YES'.
ELSE.
CLEAR cdpos.
SELECT value_old FROM cdpos INTO cdpos-value_old
UP TO 1 ROWS
WHERE objectclas EQ c_verkbeleg
AND objectid EQ t_order-vbeln
AND tabname EQ c_vbuk
AND fname EQ c_cmgst
AND value_old EQ c_charb.
ENDSELECT.
IF sy-subrc EQ 0.
v_cre_rev = 'YES'.
ELSE.
v_cre_rev = 'NO'.
ENDIF.
ENDIF.
IF NOT t_order-rplnr IS INITIAL.
CLEAR: zcc_groupid, zcc_fraudres.
SELECT SINGLE groupid FROM zcc_groupid
INTO zcc_groupid-groupid
WHERE vbeln EQ t_order-vbeln.
CLEAR: w_oid,w_zcvm,w_zvbv,w_ex_resultcode,w_ex_resultmsg,
w_audat, w_autim, w_zavr.
CLEAR : w_rcrsp, w_score.
SELECT ex_resultcode ex_resultmsg audat autim
rcrsp score
FROM zcc_fraudres UP TO 1 ROWS
INTO (w_ex_resultcode , w_ex_resultmsg, w_audat,
w_autim, w_rcrsp, w_score)
WHERE groupid EQ zcc_groupid-groupid
ORDER BY audat DESCENDING
autim DESCENDING.
ENDSELECT.
CLEAR : t_zzoid, w_temp_zzoid, w_counter.
REFRESH t_zzoid.
SELECT * FROM zzoid INTO TABLE t_zzoid
WHERE z_groupid EQ zcc_groupid-groupid.
DELETE t_zzoid WHERE ccnum NE fpltc-ccnum.
SORT t_zzoid BY audat ASCENDING autim ASCENDING.
READ TABLE t_zzoid INDEX 1.
MOVE t_zzoid-zcvm TO w_zcvm.
MOVE t_zzoid-zvbv TO w_zvbv.
MOVE t_zzoid-oid TO w_oid.
MOVE t_zzoid-audat TO w_audat.
MOVE t_zzoid-autim TO w_autim.
SELECT zrsp INTO w_zrsp FROM zzoid UP TO 1 ROWS
WHERE audat = fpltc-audat
AND autim = fpltc-autim
AND aunum = fpltc-aunum
AND ccnum = fpltc-ccnum
AND autra = fpltc-autra.
ENDSELECT.
SELECT oid FROM zcc_fraudres
INTO zcc_fraudres-oid UP TO 1 ROWS
WHERE groupid EQ zcc_groupid-groupid
AND rcrsp EQ '05'.
ENDSELECT.
IF sy-subrc EQ 0.
v_frd_rev = 'YES'.
SELECT message_num FROM zcc_fraudres
INTO zcc_fraudres-message_num
WHERE groupid EQ zcc_groupid-groupid
AND message_num NE ' '.
IF v_frd_rvr IS INITIAL.
v_frd_rvr = zcc_fraudres-message_num.
ELSE.
CONCATENATE v_frd_rvr zcc_fraudres-message_num
INTO v_frd_rvr SEPARATED BY ','.
ENDIF.
ENDSELECT.
ELSE.
v_frd_rev = 'NO'.
ENDIF.
CLEAR zcc_fraudres.
SELECT res_code chargeback
FROM zcc_fraudres
INTO (zcc_fraudres-res_code,
zcc_fraudres-chargeback)
UP TO 1 ROWS
WHERE groupid EQ zcc_groupid-groupid
AND ( rcrsp EQ '06' OR
rcrsp EQ '07' ).
ENDSELECT.
IF sy-subrc EQ 0.
v_frd_rrr = zcc_fraudres-res_code.
ENDIF.
IF zcc_fraudres-chargeback IS INITIAL.
v_crg_back = 'NO'.
ELSE.
v_crg_back = 'YES'.
ENDIF.
CLEAR: v_zchk.
SELECT COUNT(*) INTO v_zchk FROM zcc_fraudres
WHERE groupid = zcc_groupid-groupid
AND message_num EQ space
AND source = 'ZCHK'.
FREE t_fpltc.
CLEAR: v_rtext, v_rtext_0002.
PERFORM get_header_text USING t_order-vbeln 'ZWBH'.
PERFORM get_header_text USING t_order-vbeln '0002'.
ENDON.
t_outso-vbeln = t_order-vbeln.
t_outso-posnr = t_order-posnr.
t_outso-erdat = t_order-erdat.
t_outso-erzet = t_order-erzet.
t_outso-auart = t_order-auart.
t_outso-waerk = t_order-waerk.
t_outso-kdgrp = t_order-kdgrp.
t_outso-bstnk = t_order-bstnk.
t_outso-matnr = t_order-matnr.
t_outso-kunnr_sp = t_order-kunnr.
t_outso-arktx = t_order-arktx.
t_outso-bsark = t_order-bsark.
t_outso-kwmeng = t_order-kwmeng.
v_kzwi0 = t_order-kzwi3 + t_order-kzwi4.
t_outso-zzwebuname = t_order-zzwebuname.
t_outso-augru = t_order-augru.
t_outso-matkl = t_order-matkl.
t_outso-prodh = t_order-prodh.
t_outso-zzwebpid = t_order-zzwebpid.
Regards
Brain
‎2006 Aug 25 7:41 PM
I think there are two many database hits within the loop endloop. Try to get the data beforehand into internal tables and try and use the same.
Regards
Anurag
‎2006 Aug 25 5:41 PM
Hi Brain,
Try removing SELECT ..... ENDSELECTS. Your code has too many SELECT ...ENDSELECTS. It will reducce ur performance.
Instead use array fetch and use READ with BINARY search.
Check this link...it gives some good tips
http://www.thespot4sap.com/Articles/SAPABAPPerformanceTuning_Introduction.asp
Cheers
VJ
Message was edited by: Vijayendra Rao
‎2006 Aug 25 5:51 PM
‎2006 Aug 25 5:54 PM
Hi,
Remove the SELECTs from the LOOP and use FOR ALL ENTRIES to get the data. Then use the READ STATEMENT OR LOOP AT..EXIT.ENDLOOP within the LOOP.
THanks,
Naren
‎2006 Aug 25 7:36 PM
Have you done a performance trace (ST05) to see where the bottleneck is?
If s_erdat is empty, that will cause problems.
Rob
‎2006 Aug 25 7:41 PM
I think there are two many database hits within the loop endloop. Try to get the data beforehand into internal tables and try and use the same.
Regards
Anurag
‎2006 Aug 31 10:31 PM
Hi All,
I have changed the code according to the suggestions. However there is no improvement in the performance. The updated code is below...Any suggestions...
SELECT vbak~vbeln vbak~vbeln vbap~posnr vbak~erdat vbak~erzet
vbak~auart vbak~waerk vbkd~kdgrp vbak~lifsk
vbak~vsbed vbak~bstnk vbak~rplnr vbak~bsark vbak~kunnr
vbap~matnr vbap~arktx vbap~kzwi3 vbap~kzwi4 vbap~abgru
vbap~netwr
vbap~kwmeng vbak~vkorg vbkd~bzirk vbkd~ihrez
vbkd~bsark vbkd~zterm vbkd~prsdt
vbak~zzwebuname vbak~augru
vbap~matkl vbap~prodh
vbak~zzwebpid
INTO TABLE t_order
FROM vbak INNER JOIN vbkd
ON vbak~vbeln EQ vbkd~vbeln
INNER JOIN vbap
ON vbak~vbeln EQ vbap~vbeln
WHERE vbak~vkorg IN s_vkorg
AND vbak~erdat IN s_erdat
AND vbak~auart IN s_auart
AND vbkd~posnr EQ '000000'
AND vbkd~kdgrp IN s_kdgrp
AND vbkd~bzirk IN s_bzirk.
IF sy-subrc NE 0.
WRITE: /5 text-e01 COLOR COL_NEGATIVE.
EXIT.
ENDIF.
t_order1[] = t_order[].
SORT t_order BY vbeln posnr.
SORT t_order1 BY vbeln posnr.
DELETE ADJACENT DUPLICATES FROM t_order1 COMPARING vbeln.
CLEAR z_total_rec.
IF t_order[] IS NOT INITIAL.
SELECT fplnr fpltr ccins ccnum datbi rcavr ccold
audat autim aunum autra rcrsp cctyp autwr ccpre
INTO TABLE t_ccdata
FROM fpltc FOR ALL ENTRIES IN t_order1
WHERE fplnr = t_order1-rplnr.
ENDIF.
SORT t_ccdata BY fplnr fpltr DESCENDING.
IF t_order[] IS NOT INITIAL.
SELECT objectid value_new value_old
INTO TABLE cdpos_tab
FROM cdpos FOR ALL ENTRIES IN t_order1
WHERE objectclas EQ 'VERKBELEG' AND
objectid EQ t_order1-vbeln1 AND
tabname EQ 'VBAK' AND
fname EQ 'LIFSK'.
SELECT vbeln cmgst
INTO TABLE t_vbuk
FROM vbuk FOR ALL ENTRIES IN t_order1
WHERE vbeln EQ t_order1-vbeln.
SELECT vbeln groupid
INTO TABLE t_zcc_groupid
FROM zcc_groupid FOR ALL ENTRIES IN t_order1
WHERE vbeln EQ t_order1-vbeln.
ENDIF.
IF t_zcc_groupid[] IS NOT INITIAL.
SELECT groupid ex_resultcode ex_resultmsg audat autim rcrsp
score oid message_num res_code chargeback source
INTO TABLE t_zcc_fraudres
FROM zcc_fraudres FOR ALL ENTRIES IN t_zcc_groupid
WHERE groupid EQ t_zcc_groupid-groupid.
SELECT *
INTO TABLE t_zzoid
FROM zzoid FOR ALL ENTRIES IN t_zcc_groupid
WHERE z_groupid EQ t_zcc_groupid-groupid.
ENDIF.
LOOP AT t_order.
CLEAR t_outso.
ON CHANGE OF t_order-vbeln.
CLEAR: v_ccnum.
CLEAR: v_cre_rev, v_frd_rev, v_frd_rvr,
v_frd_rrr, v_crg_back.
IF NOT t_order-rplnr IS INITIAL.
READ TABLE t_ccdata WITH KEY fplnr = t_order-rplnr BINARY SEARCH.
ENDIF.
CLEAR v_email.
PERFORM get_ip_or_email_address USING c_zeml.
CLEAR v_ipadr.
PERFORM get_ip_or_email_address USING c_zwip.
PERFORM get_shipping_condition_desc.
CLEAR: z5_block,z5_block_released.
LOOP AT cdpos_tab WHERE objectid EQ t_order-vbeln1.
IF cdpos_tab-value_new = 'Z5' OR cdpos_tab-value_old = 'Z5'.
z5_block = 'Y'.
ENDIF.
IF cdpos_tab-value_new = ' ' AND cdpos_tab-value_old = 'Z5'.
z5_block_released = 'Y'.
ENDIF.
ENDLOOP.
IF z5_block IS INITIAL.
IF t_order-lifsk = 'Z5'.
z5_block = 'Y'.
ENDIF.
ENDIF.
READ TABLE t_vbuk WITH KEY vbeln = t_order-vbeln BINARY SEARCH.
IF t_vbuk-cmgst EQ 'B'.
v_cre_rev = 'YES'.
ELSE.
CLEAR cdpos.
SELECT value_old FROM cdpos INTO cdpos-value_old
UP TO 1 ROWS
WHERE objectclas EQ c_verkbeleg
AND objectid EQ t_order-vbeln
AND tabname EQ c_vbuk
AND fname EQ c_cmgst
AND value_old EQ c_charb.
ENDSELECT.
IF sy-subrc EQ 0.
v_cre_rev = 'YES'.
ELSE.
v_cre_rev = 'NO'.
ENDIF.
ENDIF.
IF NOT t_order-rplnr IS INITIAL.
READ TABLE t_zcc_groupid WITH KEY vbeln = t_order-vbeln BINARY SEARCH.
CLEAR: w_oid,w_zcvm,w_zvbv,
w_audat, w_autim, w_zavr.
DELETE t_zzoid WHERE z_groupid EQ t_order-vbeln AND ccnum NE t_ccdata-ccnum.
SORT t_zzoid BY audat ASCENDING autim ASCENDING.
READ TABLE t_zzoid WITH KEY z_groupid = t_order-vbeln BINARY SEARCH.
IF SY-SUBRC = 0.
MOVE t_zzoid-zcvm TO w_zcvm.
MOVE t_zzoid-zvbv TO w_zvbv.
MOVE t_zzoid-oid TO w_oid.
MOVE t_zzoid-audat TO w_audat.
MOVE t_zzoid-autim TO w_autim.
ENDIF.
SELECT zrsp INTO w_zrsp FROM zzoid UP TO 1 ROWS
WHERE audat = t_ccdata-audat
AND autim = t_ccdata-autim
AND aunum = t_ccdata-aunum
AND ccnum = t_ccdata-ccnum
AND autra = t_ccdata-autra.
ENDSELECT.
CLEAR: v_zchk.
LOOP AT t_zcc_fraudres WHERE groupid = t_zcc_groupid-groupid.
IF t_zcc_fraudres-rcrsp = '05'.
v_frd_rev = 'YES'.
ENDIF.
IF ( t_zcc_fraudres-rcrsp = '06' OR t_zcc_fraudres-rcrsp = '07' ).
v_frd_rrr = t_zcc_fraudres-res_code.
IF t_zcc_fraudres-chargeback IS INITIAL.
v_crg_back = 'NO'.
ELSE.
v_crg_back = 'YES'.
ENDIF.
ENDIF.
IF t_zcc_fraudres-message_num NE ' '.
IF v_frd_rvr IS INITIAL.
v_frd_rvr = t_zcc_fraudres-message_num.
ELSE.
CONCATENATE v_frd_rvr t_zcc_fraudres-message_num
INTO v_frd_rvr SEPARATED BY ','.
ENDIF.
ENDIF.
IF t_zcc_fraudres-message_num EQ space AND t_zcc_fraudres-source EQ 'ZCHK'.
v_zchk = v_zchk + 1.
ENDIF.
ENDLOOP.
IF v_frd_rev = ' '.
v_frd_rev = 'NO'.
ENDIF.
v_auth_1 = 'N'.
v_decl_1 = 'N'.
v_auth_full = 'N'.
v_decl_full = 'N'.
LOOP AT t_ccdata WHERE fplnr = t_order-rplnr.
IF t_ccdata-ccpre EQ 'X' AND
( t_ccdata-autwr EQ 0 OR
t_ccdata-autwr EQ 1 ) AND
t_ccdata-rcrsp EQ '02'.
v_auth_1 = 'Y'.
ENDIF.
IF t_ccdata-ccpre EQ 'X' AND
( t_ccdata-autwr EQ 0 OR
t_ccdata-autwr EQ 1 ) AND
t_ccdata-rcrsp EQ '03'.
v_decl_1 = 'Y'.
ENDIF.
IF t_ccdata-ccpre NE 'X' AND
t_ccdata-autwr GT 1 AND
t_ccdata-rcrsp EQ '02'.
v_auth_full = 'Y'.
ENDIF.
IF t_ccdata-ccpre NE 'X' AND
t_ccdata-autwr GT 1 AND
t_ccdata-rcrsp EQ '03'.
v_decl_full = 'Y'.
ENDIF.
ENDLOOP.
ENDIF.
ENDON.
PERFORM get_name USING c_charre.
PERFORM get_name USING c_charwe.
t_outso-vbeln = t_order-vbeln.
t_outso-posnr = t_order-posnr.
t_outso-erdat = t_order-erdat.
t_outso-erzet = t_order-erzet.
t_outso-auart = t_order-auart.
t_outso-waerk = t_order-waerk.
t_outso-kdgrp = t_order-kdgrp.
t_outso-bstnk = t_order-bstnk.
t_outso-matnr = t_order-matnr.
t_outso-kunnr_sp = t_order-kunnr.
t_outso-arktx = t_order-arktx.
t_outso-bsark = t_order-bsark.
t_outso-kwmeng = t_order-kwmeng.
v_kzwi0 = t_order-kzwi3 + t_order-kzwi4.
t_outso-zzwebuname = t_order-zzwebuname.
t_outso-augru = t_order-augru.
t_outso-matkl = t_order-matkl.
t_outso-prodh = t_order-prodh.
t_outso-zzwebpid = t_order-zzwebpid.
IF t_outso-prodh IS NOT INITIAL.
PERFORM get_prodh_desc.
ENDIF.
t_outso-kzwi0 = v_kzwi0.
t_outso-ccins = t_ccdata-ccins.
t_outso-ccnum = t_ccdata-ccnum.
t_outso-datbi = t_ccdata-datbi.
t_outso-rcavr = t_ccdata-rcavr.
t_outso-ccold = t_ccdata-ccold.
t_outso-vtext = tvsbt-vtext.
t_outso-abgru = t_order-abgru.
t_outso-z5_block = z5_block.
t_outso-z5_block_released = z5_block_released.
t_outso-email = v_email.
t_outso-ipadr = v_ipadr.
t_outso-vkorg = t_order-vkorg.
t_outso-bzirk = t_order-bzirk.
IF t_order-lifsk EQ 'Z7'.
t_outso-z7block = 'YES'.
ELSE.
t_outso-z7block = 'NO'.
ENDIF.
t_outso-cre_rev = v_cre_rev.
t_outso-frd_rev = v_frd_rev.
t_outso-frd_rvr = v_frd_rvr.
t_outso-frd_rrr = v_frd_rrr.
t_outso-crg_back = v_crg_back.
t_outso-groupid = t_zcc_groupid-groupid.
t_outso-ihrez = t_order-ihrez.
t_outso-zchk = v_zchk.
t_outso-auth_1 = v_auth_1.
t_outso-decl_1 = v_decl_1.
t_outso-auth_full = v_auth_full.
t_outso-decl_full = v_decl_full.
t_outso-rtext = v_rtext.
t_outso-rtext_0002 = v_rtext_0002.
t_outso-bsark1 = t_order-bsark1.
t_outso-zterm = t_order-zterm.
t_outso-zcvm = w_zcvm.
t_outso-zvbv = w_zvbv.
t_outso-ex_resultcode = t_zcc_fraudres-ex_resultcode.
t_outso-ex_resultmsg = t_zcc_fraudres-ex_resultmsg.
t_outso-rcrsp = t_ccdata-rcrsp.
t_outso-score = t_zcc_fraudres-score.
t_outso-zrsp = w_zrsp.
t_outso-cctyp = t_ccdata-cctyp.
APPEND t_outso.
z_total_rec = z_total_rec + 1.
ENDIF.
ENDLOOP.
*****************
FORM get_name USING l_parvw.
CLEAR vbpa.
SELECT posnr adrnr FROM vbpa UP TO 1 ROWS
INTO (vbpa-posnr, vbpa-adrnr)
WHERE vbeln = t_order-vbeln
AND ( posnr = t_order-posnr OR
posnr = c_posnr )
AND parvw = l_parvw
ORDER BY posnr DESCENDING.
ENDSELECT.
SELECT SINGLE name1 name2 street city1 region post_code1
country tel_number
FROM adrc
INTO (adrc-name1, adrc-name2, adrc-street, adrc-city1,
adrc-region, adrc-post_code1, adrc-country, adrc-tel_number)
WHERE addrnumber = vbpa-adrnr
AND date_from = c_date_from
AND nation = ' ' .
CASE l_parvw.
WHEN c_charre.
t_outso-name_bp = adrc-name1.
t_outso-name2_bp = adrc-name2.
t_outso-street_bp = adrc-street.
t_outso-city_bp = adrc-city1.
t_outso-region_bp = adrc-region.
t_outso-pcode_bp = adrc-post_code1.
t_outso-country_bp = adrc-country.
t_outso-tel_bp = adrc-tel_number.
WHEN c_charwe.
t_outso-name_sh = adrc-name1.
t_outso-name2_sh = adrc-name2.
t_outso-street_sh = adrc-street.
t_outso-city_sh = adrc-city1.
t_outso-region_sh = adrc-region.
t_outso-pcode_sh = adrc-post_code1.
t_outso-country_sh = adrc-country.
t_outso-tel_sh = adrc-tel_number.
ENDCASE.
‎2006 Aug 31 10:52 PM
Nested loops! Try:
DATA: cd_index LIKE sy-tabix.
SORT t_order BY vbeln posnr,
cdpos_tab by objectid.
LOOP AT t_order.
READ TABLE cd_pos WITH KEY
objectid = t_order-vbeln1.
binary search.
WHILE sy-subrc = 0.
cd_index = sy-tabix + 1.
IF cdpos_tab-value_new = 'Z5' OR cdpos_tab-value_old = 'Z5'.
z5_block = 'Y'.
ENDIF.
IF cdpos_tab-value_new = ' ' AND cdpos_tab-value_old = 'Z5'.
z5_block_released = 'Y'.
ENDIF.
READ TABLE cd_pos INDEX cd_index.
IF sy-subrc = 0.
IF cd_pos OBJECTID <> T_ORDER-VBELN1.
sy-subrc = 9.
ENDIF.
ENDIF.
ENDWHILE.
ENDLOOP.
I wasn't able to test this, so you'll have to check it thoroughly.
Rob
Added ENDLOOP.
Message was edited by: Rob Burbank
‎2006 Aug 31 11:55 PM
thanks rob, will try it out and keep you posted.
Regards
Brain.
‎2006 Sep 01 3:41 AM
Hi Brain,
As the others have said, remove the select...endselect, use for all entries statement instead of joins, use binary search when reading internal tables, use INTO TABLE when inserting records in an internal table. And most important of all is CHECK your where clause. Try to use all the primary keys of that database table and if not possible, use secondary indexes to help speed up your select statement. That will give you a boost in performance.
Hope this helps...
P.S. Please award points for useful answers.