Thanks for the question, Rajvir.
Asked: February  25, 2021 - 11:10 am UTC
Last updated: March     01, 2021 - 3:34 pm UTC
Version: Oracle 11G
Viewed 1000+ times
 
 
You Asked 
Hi Tom,
We have a table which is having 18.2 crore data with 420 columns.
We have created 2 index on 2 different columns.
N_CUST_SKEY - Index and properly analyzed
COD_CUST_ID - Index and properly analyzed
Query 1:
select * from  DIM_KYC where N_CUST_SKEY=14879358670;
Explain plan for Query 1
Plan hash value: 1160736793
 
------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                          | Name                    | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                   |                         |     1 |  7110 |     4   (0)| 00:00:01 |       |       |
|   1 |  TABLE ACCESS BY GLOBAL INDEX ROWID| DIM_KYC                 |     1 |  7110 |     4   (0)| 00:00:01 | ROWID | ROWID |
|*  2 |   INDEX RANGE SCAN                 | IDX_DIM_KYC_N_CUST_SKEY |     1 |       |     3   (0)| 00:00:01 |       |       |
------------------------------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   2 - access("N_CUST_SKEY"=14879358670)
 
Note
-----
   - dynamic sampling used for this statement (level=2)Query 2: 
select * from  DIM_KYC where  COD_CUST_ID=250781885;
Explain plan for Query 2
Plan hash value: 2375061313
 
------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                          | Name                    | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                   |                         |   108K|   737M|   105K  (1)| 00:31:45 |       |       |
|   1 |  TABLE ACCESS BY GLOBAL INDEX ROWID| DIM_KYC                 |   108K|   737M|   105K  (1)| 00:31:45 | ROWID | ROWID |
|*  2 |   INDEX RANGE SCAN                 | IDX_COD_CUST_ID_DIM_KYC |   108K|       |    80   (0)| 00:00:02 |       |       |
------------------------------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   2 - access("COD_CUST_ID"=250781885)
 
Note
-----
   - dynamic sampling used for this statement (level=2)Both the columns which are having index are unique but still we are getting two different cost on the same table.
Any Suggestion why is this so? 
 
and Chris said...
If the optimizer chooses a unique index, you should see INDEX UNIQUE SCAN in the plan.
But these plans have use INDEX RANGE SCANs. So either:
- It's a multi-column unique index and you're only using the first column
- The unique constraint is supported by a non-unique index
- There is no unique index on these columns!
Either way, the cost difference is because the first query expects to find one row, the second 108,000 rows!
You can see this by looking at the "Rows" column. So the question is:
Are those estimates accurate?
You can verify this by getting the execution plan for these queries and comparing the E(stimated)-rows and A(ctual)-rows columns. Do this by:
set serveroutput off
alter session set statistics_level = all;
select ...
select * 
from   table ( dbms_xplan.display_cursor ( format => 'ALLSTATS LAST' ) );
 https://blogs.oracle.com/sql/how-to-create-an-execution-plan  
 
Is this answer out of date? If it is, please let us know via a Comment