| Full tablescan eventhough join is on indexed field [message #479588] | 
			Mon, 18 October 2010 08:08   | 
		 
		
			
				
				
				
					
						
						Anand Ramaswamy
						 Messages: 111 Registered: January 2005 
						
					 | 
					Senior Member  | 
					 | 
		 
		 
	 | 
 
	
		Hi, 
  I am posting the below query: 
 
   SELECT PEA.INCURRED_BY_PERSON_ID AS PERSON_ID,
          PEA.EXPENDITURE_ENDING_DATE AS WEEK_END_DATE,
          CASE
             WHEN (PEIA.PROJECT_ID IN (496, 497, 499, 502, 507)
                   OR (PEIA.PROJECT_ID = 7290
                       AND PEIA.TASK_ID IN
                              (187096,
                               187097,
                               187098,
                               187099,
                               187100,
                               187101,
                               187102,
                               187103,
                               187104,
                               187105)))
             THEN
                'V'
             ELSE
                PEIA.BILLABLE_FLAG
          END
             AS BILLABLE_FLAG,
          NVL (PEIA.QUANTITY, 0) AS QUANTITY,
          NVL (PEIA.TRANSACTION_SOURCE, 'EXPENDITURE BATCH')
             AS TRANSACTION_SOURCE
     FROM PA_EXPENDITURE_ITEMS_ALL PEIA
          INNER JOIN (SELECT *
                        FROM PA_EXPENDITURES_ALL
                       WHERE EXPENDITURE_ENDING_DATE > to_date( '29-MAR-2009', 'DD-MON-YYYY')) PEA
             ON PEIA.EXPENDITURE_ID = PEA.EXPENDITURE_ID
    WHERE PEIA.SYSTEM_LINKAGE_FUNCTION = 'ST'; 
 
 
The explain is below: 
 
SELECT STATEMENT  ALL_ROWSCost: 48,287  Bytes: 18,428,818  Cardinality: 297,239  		
	3 HASH JOIN  Cost: 48,287  Bytes: 18,428,818  Cardinality: 297,239  	
		1 TABLE ACCESS FULL TABLE PA.PA_EXPENDITURES_ALL Cost: 2,964  Bytes: 3,506,094  Cardinality: 194,783  
		2 TABLE ACCESS FULL TABLE PA.PA_EXPENDITURE_ITEMS_ALL Cost: 43,425  Bytes: 26,637,468  Cardinality: 605,397    
 
Can anyone suggest what can be done to avoid full table scan? 
 
Thanks 
Anand
		
		
		
 |  
	| 
		
	 | 
 
 
 | 
	
		
		
			| Re: Full tablescan eventhough join is on indexed field [message #479594 is a reply to message #479588] | 
			Mon, 18 October 2010 08:46    | 
		 
		
			
				
				
				
					
						
						cookiemonster
						 Messages: 13973 Registered: September 2008  Location: Rainy Manchester
						
					 | 
					Senior Member  | 
					 | 
		 
		 
	 | 
 
	
		How many rows in each table? 
How many rows does the query return? 
What indexes are present on the tables? 
 
And can you use the following method in future to get the explain plan: 
SQL> explain plan for select 1 from dual;
Explained.
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 1546270724
-----------------------------------------------------------------
| Id  | Operation        | Name | Rows  | Cost (%CPU)| Time     |
-----------------------------------------------------------------
|   0 | SELECT STATEMENT |      |     1 |     2   (0)| 00:00:01 |
|   1 |  FAST DUAL       |      |     1 |     2   (0)| 00:00:01 |
-----------------------------------------------------------------
8 rows selected.
SQL> 
  
 
It's easier to read.
		
		
		
 |  
	| 
		
	 | 
 
 
 | 
	
		
		
			| Re: Full tablescan eventhough join is on indexed field [message #479621 is a reply to message #479594] | 
			Mon, 18 October 2010 09:44    | 
		 
		
			
				
				
				
					
						
						Anand Ramaswamy
						 Messages: 111 Registered: January 2005 
						
					 | 
					Senior Member  | 
					 | 
		 
		 
	 | 
 
	
		pa_expenditures_all has  565399 rows 
pa_expenditure_items_all  has 2426174 rows 
The query returns 1014986 rows. 
 
PA_EXPENDITURE_ITEMS_ALL	 
INDEX_NAME	         COLUMN
PA_EXPENDITURE_ITEMS_ALL_N27	PROJECT_ID
PA_EXPENDITURE_ITEMS_N2	        TASK_ID
PA_EXPENDITURE_ITEMS_N2	        BILL_HOLD_FLAG
PA_EXPENDITURE_ITEMS_N2	        PROJECT_ID
PA_EXPENDITURE_ITEMS_N25	TASK_ID
PA_EXPENDITURE_ITEMS_N25	COST_DISTRIBUTED_FLAG
PA_EXPENDITURE_ITEMS_N25	SYSTEM_LINKAGE_FUNCTION
PA_EXPENDITURES_ITEMS_N18	BURDEN_SUM_DEST_RUN_ID
PA_EXPENDITURE_ITEMS_N1	        EXPENDITURE_ID
PA_EXPENDITURE_ITEMS_N1	        EXPENDITURE_ITEM_DATE
PA_EXPENDITURE_ITEMS_N10	TRANSACTION_SOURCE
PA_EXPENDITURE_ITEMS_N10	ORIG_TRANSACTION_REFERENCE
PA_EXPENDITURE_ITEMS_N12	REV_IND_COMPILED_SET_ID
PA_EXPENDITURE_ITEMS_N13	INV_IND_COMPILED_SET_ID
PA_EXPENDITURE_ITEMS_N14	SOURCE_EXPENDITURE_ITEM_ID
PA_EXPENDITURE_ITEMS_N16	REQUEST_ID
PA_EXPENDITURE_ITEMS_N16	COST_DISTRIBUTED_FLAG
PA_EXPENDITURE_ITEMS_N17	TASK_ID
PA_EXPENDITURE_ITEMS_N17	REVENUE_DISTRIBUTED_FLAG
PA_EXPENDITURE_ITEMS_N18	EXPENDITURE_TYPE
PA_EXPENDITURE_ITEMS_N18	SYSTEM_LINKAGE_FUNCTION
PA_EXPENDITURE_ITEMS_N19	DENORM_ID
PA_EXPENDITURE_ITEMS_ALL_N27	ADJUSTMENT_TYPE
PA_EXPENDITURE_ITEMS_N9	        TASK_ID
PA_EXPENDITURE_ITEMS_N9	        EXPENDITURE_ITEM_DATE
PA_EXPENDITURE_ITEMS_N20	CC_BL_DISTRIBUTED_CODE
PA_EXPENDITURE_ITEMS_N21	CC_CROSS_CHARGE_CODE
PA_EXPENDITURE_ITEMS_N22	RECVR_ORG_ID
PA_EXPENDITURE_ITEMS_N22	CC_IC_PROCESSED_CODE
PA_EXPENDITURE_ITEMS_N22	CC_CROSS_CHARGE_CODE
PA_EXPENDITURE_ITEMS_N22	EXPENDITURE_ITEM_DATE
PA_EXPENDITURE_ITEMS_N22	TASK_ID
PA_EXPENDITURE_ITEMS_N23	TP_IND_COMPILED_SET_ID
PA_EXPENDITURE_ITEMS_N3	        COST_DISTRIBUTED_FLAG
PA_EXPENDITURE_ITEMS_N4	        REVENUE_DISTRIBUTED_FLAG
PA_EXPENDITURE_ITEMS_N5	        ADJUSTED_EXPENDITURE_ITEM_ID
PA_EXPENDITURE_ITEMS_N6	        TRANSFERRED_FROM_EXP_ITEM_ID
PA_EXPENDITURE_ITEMS_N7	        REQUEST_ID
PA_EXPENDITURE_ITEMS_N7	        REVENUE_DISTRIBUTED_FLAG
PA_EXPENDITURE_ITEMS_U1	        EXPENDITURE_ITEM_ID
PA_EXPENDITURE_ITEMS_N11	COST_IND_COMPILED_SET_ID
PA_EXPENDITURE_ITEMS_N15	COST_BURDEN_DISTRIBUTED_FLAG
PA_EXPENDITURE_ITEMS_N8	        PROJECT_ID
PA_EXPENDITURE_ITEMS_N8	        EVENT_NUM
PA_EXPENDITURE_ITEMS_N8	        EVENT_TASK_ID
PA_EXPENDITURE_ITEMS_N24	EXPENDITURE_ITEM_DATE  
 
PA_EXPENDITURES_ALL 
INDEX_NAME	    COLUMN
PA_EXPENDITURES_ALL_N9	EXPENDITURE_GROUP
PA_EXPENDITURES_ALL_N9	INCURRED_BY_ORGANIZATION_ID
PA_EXPENDITURES_N8	TRANSFER_STATUS_CODE
PA_EXPENDITURES_N1	INCURRED_BY_PERSON_ID
PA_EXPENDITURES_N1	EXPENDITURE_ENDING_DATE
PA_EXPENDITURES_N2	INCURRED_BY_ORGANIZATION_ID
PA_EXPENDITURES_N3	EXPENDITURE_GROUP
PA_EXPENDITURES_N4	EXPENDITURE_STATUS_CODE
PA_EXPENDITURES_N5	ENTERED_BY_PERSON_ID
PA_EXPENDITURES_N6	REQUEST_ID
PA_EXPENDITURES_N7	ATTRIBUTE1
PA_EXPENDITURES_U1	EXPENDITURE_ID  
 
Regds, 
 
		
		
		
 |  
	| 
		
	 | 
 
 
 | 
	| 
		
 | 
	| 
		
 | 
	| 
		
 | 
	| 
		
 | 
	
		
		
			| Re: Full tablescan eventhough join is on indexed field [message #479652 is a reply to message #479632] | 
			Mon, 18 October 2010 10:43    | 
		 
		
			
				
				
				
					
						
						Anand Ramaswamy
						 Messages: 111 Registered: January 2005 
						
					 | 
					Senior Member  | 
					 | 
		 
		 
	 | 
 
	
		SELECT COUNT(0) FROM PA_EXPENDITURES_ALL WHERE EXPENDITURE_ENDING_DATE > to_date( '29-MAR-2009', 'DD-MON-YYYY'); 
--396406 rows 
 
 
SELECT COUNT(0) FROM PA_EXPENDITURE_ITEMS_ALL PEIA WHERE PEIA.SYSTEM_LINKAGE_FUNCTION = 'ST'; 
--2424041 
 
 
Sorry, the join query actually returns 1013921 rows. I did not update correct number in my previous update. 
 
 
 
Regds, 
		
		
		
 |  
	| 
		
	 | 
 
 
 | 
	| 
		
 | 
	
		
		
			| Re: Full tablescan eventhough join is on indexed field [message #479739 is a reply to message #479588] | 
			Tue, 19 October 2010 02:49   | 
		 
		
			
				
				
				
					
						
						Yasir Hashmi
						 Messages: 304 Registered: April 2006 
						
					 | 
					Senior Member  | 
					 | 
		 
		 
	 | 
 
	
		Why do you want to avoid full scans?Is this query slow? 
Full scans are not always evil,indexes are not always good. 
As cookiemonster has pointed out, 
your query belongs to category of week selectivity (396406/565399)=70% for table PA_EXPENDITURES_ALL  and (2424041/2426174)~100%,indexes might not help.
		
		
		
 |  
	| 
		
	 | 
 
 
 |