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!

suggestion to improve performance of a query

lxiscasDec 12 2012 — edited Dec 18 2012
Hi, guys:

I am looking for any suggestion to improve performance of the following query:
select inv2.invno, inv2.amt, inv2.clientkey, inv2.debtorkey, inv2.invdate, inv_temp.client_name, inv_temp.clientno, inv_temp.debtor_name,  inv_temp.debtorno,
inv_temp.earlest_inv_date, inv_temp.last_inv_date
from invoices inv2,
(select cl.clientkey, cl.name client_name, cl.clientno, dt.debtorkey, dt.name debtor_name,  dt.debtorno, max(inv.invdate) last_inv_date, min(inv.invdate) earlest_inv_date
from invoices inv, payments pa, debtors dt, clients cl
where inv.invoicekey=pa.invoicekey
and inv.clientkey=cl.clientkey
and inv.debtorkey=dt.debtorkey
and (upper(dt.name)<>upper('ADVANCES') or  upper(dt.name)<>upper('cash'))
and upper(dt.debtorno)<>upper('advance')
group by cl.clientkey, cl.name, cl.clientno, dt.debtorkey, dt.name,  dt.debtorno
having max(inv.invdate)>min(inv.invdate)
)inv_temp
where inv2.debtorkey=inv_temp.debtorkey
and inv2.clientkey=inv_temp.clientkey
and inv2.balance>0
and inv2.lastpmtdate is null
and inv2.invoicekey not in (select payments.invoicekey FROM payments)
and inv2.invdate <= inv_temp.last_inv_date
and inv2.invdate >= inv_temp.earlest_inv_date
and (trunc(sysdate) - inv2.invdate) <= :P45_DP_INVOICE_PAYMENT_DATE
The major cost looks the full table scan of payments, but I do not know how to reduce the cost of it. here is the execution plan:
 SELECT STATEMENT 
	    	    	 6344 
    	
	 SORT 
	    	 ORDER BY  	 6344 
    	    	
	 FILTER 
	    	    	   
    	    	    	
	 Filter Predicates 
    	    	    	    	
	 AND 
    	    	    	    	    	
	 MAX(INV.INVDATE)>MIN(INV.INVDATE) 
    	    	    	    	    	
	 INV2.INVDATE<=MAX(INV.INVDATE) 
    	    	    	    	    	
	 INV2.INVDATE>=MIN(INV.INVDATE) 
    	    	    	
	 HASH 
	    	 GROUP BY  	 6344 
    	    	    	    	
	 FILTER 
	    	    	   
    	    	    	    	    	
	 Filter Predicates 
    	    	    	    	    	    	
	 NOT EXISTS (SELECT 0 FROM PAYMENTS PAYMENTS WHERE PAYMENTS.INVOICEKEY IS NULL) 
    	    	    	    	    	
	 NESTED LOOPS 
	    	 ANTI SNA  	 6342 
    	    	    	    	    	    	
	 NESTED LOOPS 
	    	    	 2657 
    	    	    	    	    	    	    	
	 NESTED LOOPS 
	    	    	 2655 
    	    	    	    	    	    	    	    	
	 NESTED LOOPS 
	    	    	 2574 
    	    	    	    	    	    	    	    	    	
	 NESTED LOOPS 
	    	    	 2541 
    	    	    	    	    	    	    	    	    	    	
	 TABLE ACCESS 
	 DEBTORS  	 FULL  	 368 
    	    	    	    	    	    	    	    	    	    	    	
	 Filter Predicates 
    	    	    	    	    	    	    	    	    	    	    	    	
	 AND 
    	    	    	    	    	    	    	    	    	    	    	    	    	
	 UPPER(DT.DEBTORNO)<>'ADVANCE' 
    	    	    	    	    	    	    	    	    	    	    	    	    	
	 OR 
    	    	    	    	    	    	    	    	    	    	    	    	    	    	
	 UPPER(DT.NAME)<>'ADVANCES' 
    	    	    	    	    	    	    	    	    	    	    	    	    	    	
	 UPPER(DT.NAME)<>'CASH' 
    	    	    	    	    	    	    	    	    	    	
	 TABLE ACCESS 
	 INVOICES  	 BY INDEX ROWID  	 34 
    	    	    	    	    	    	    	    	    	    	    	
	 Filter Predicates 
    	    	    	    	    	    	    	    	    	    	    	    	
	 AND 
    	    	    	    	    	    	    	    	    	    	    	    	    	
	 INV2.LASTPMTDATE IS NULL 
    	    	    	    	    	    	    	    	    	    	    	    	    	
	 INV2.BALANCE>0 
    	    	    	    	    	    	    	    	    	    	    	    	    	
	 TRUNC(SYSDATE@!)-INV2.INVDATE<=TO_NUMBER(:P45_DP_INVOICE_PAYMENT_DATE) 
    	    	    	    	    	    	    	    	    	    	    	
	 INDEX 
	 INVOICE_DEBTORKEY_INDEX  	 RANGE SCAN  	 2 
    	    	    	    	    	    	    	    	    	    	    	    	
	 Access Predicates 
    	    	    	    	    	    	    	    	    	    	    	    	    	
	 INV2.DEBTORKEY=DT.DEBTORKEY 
    	    	    	    	    	    	    	    	    	
	 TABLE ACCESS 
	 CLIENTS  	 BY INDEX ROWID  	 1 
    	    	    	    	    	    	    	    	    	    	
	 INDEX 
	 AAAAACLIENTS_PK  	 UNIQUE SCAN  	 0 
    	    	    	    	    	    	    	    	    	    	    	
	 Access Predicates 
    	    	    	    	    	    	    	    	    	    	    	    	
	 INV2.CLIENTKEY=CL.CLIENTKEY 
    	    	    	    	    	    	    	    	
	 TABLE ACCESS 
	 INVOICES  	 BY INDEX ROWID  	 3 
    	    	    	    	    	    	    	    	    	
	 INDEX 
	 INVOICES_CLIENT_DEBTOR_INDEX  	 RANGE SCAN  	 2 
    	    	    	    	    	    	    	    	    	    	
	 Access Predicates 
    	    	    	    	    	    	    	    	    	    	    	
	 AND 
    	    	    	    	    	    	    	    	    	    	    	    	
	 INV.DEBTORKEY=DT.DEBTORKEY 
    	    	    	    	    	    	    	    	    	    	    	    	
	 INV.CLIENTKEY=CL.CLIENTKEY 
    	    	    	    	    	    	    	
	 INDEX 
	 PAYMENTS_INVOICEKEY_IDX  	 RANGE SCAN  	 2 
    	    	    	    	    	    	    	    	
	 Access Predicates 
    	    	    	    	    	    	    	    	    	
	 INV.INVOICEKEY=PA.INVOICEKEY 
    	    	    	    	    	    	
	 INDEX 
	 PAYMENTS_INVOICEKEY_IDX  	 RANGE SCAN  	 2 
    	    	    	    	    	    	    	
	 Access Predicates 
    	    	    	    	    	    	    	    	
	 INV2.INVOICEKEY=PAYMENTS.INVOICEKEY 
    	    	    	    	    	
	 TABLE ACCESS 
	 PAYMENTS  	 FULL  	 3683 
    	    	    	    	    	    	
	 Filter Predicates 
    	    	    	    	    	    	    	
	 PAYMENTS.INVOICEKEY IS NULL 
Thanks a lot in adavnce!

Edited by: lxiscas on Dec 12, 2012 2:40 PM

Edited by: lxiscas on Dec 12, 2012 2:41 PM

Edited by: lxiscas on Dec 12, 2012 3:52 PM
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Jan 15 2013
Added on Dec 12 2012
5 comments
272 views