Tuning SQL to drop execution cost
SELECT n.MSISDN, (SELECT ptc2.PRIMARY_ACCOUNT_NUMBER FROM p_topup_cards ptc2 WHERE ptc2.NUMR_MSISDN = n.MSISDN --AND ptc2.CARD_TYPE = 1 AND ptc2.PRIMARY_ACCOUNT_NUMBER LIKE '894428%' AND ROWNUM < 2) pan FROM numbers n ,p_number_history pnh WHERE n.MSISDN = pnh.NUMR_MSISDN AND n.STATUS = 'A' AND n.Barred = 'N' AND n.spid_spid = '416' --AND n.first_transaction IS NOT NULL --AND pnh.END_TIMESTAMP IS NULL AND pnh.PLFM_PLTP_CODE = 'IN' AND ROWNUM <= 2000
Plan
SELECT STATEMENT FIRST_ROWS Cost: 758,319 Bytes: 72,000 Cardinality: 2,0003 COUNT STOPKEY
2 TABLE ACCESS BY INDEX ROWID LIVEUSER.PREPAY_TOPUP_CARDS Cost: 6 Bytes: 32 Cardinality: 11 INDEX RANGE SCAN UNIQUE LIVEUSER.PPTC_PK Cost: 4 Cardinality: 18 COUNT STOPKEY
7 NESTED LOOPS Cost: 758,319 Bytes: 8,591,616 Cardinality: 238,6565 TABLE ACCESS BY INDEX ROWID LIVEUSER.NUMBERS Cost: 46,110 Bytes: 4,748,060 Cardinality: 237,4034 INDEX RANGE SCAN NON-UNIQUE LIVEUSER.NUMR_SPID_FK_I Cost: 3,682 Cardinality: 949,6106 INDEX RANGE SCAN UNIQUE LIVEUSER.PFM_NUM_HS_PK Cost: 3 Bytes: 16 Cardinality: 1
Initial Analysis
This SQL needs to be re-written to avoid any join and mainly try and avoid statement “n.spid_spid = ‘416’”
Why?
This simple stmt “select * from numbers where spid_spid = ‘416’;” and it shows the cost of 46K+
Plan
SELECT STATEMENT FIRST_ROWS Cost: 46,110 Bytes: 40,833,230 Cardinality: 949,610
2 TABLE ACCESS BY INDEX ROWID CPI_SYSTEM.NUMBERS Cost: 46,110 Bytes: 40,833,230 Cardinality: 949,610
1 INDEX RANGE SCAN NON-UNIQUE CPI_SYSTEM.NUMR_SPID_FK_I Cost: 3,682 Cardinality: 949,610
Leave a Reply
You must be logged in to post a comment.