September 14, 2011
While taking a look at the OTN threads this morning, I found an interesting test case, where the OP was asking why a query used a full table scan and not an index range scan. The OP would like for the query to use the index without using a hint in the query. So, why doesn’t the OP’s test case use an index range scan? Just for fun I will state that my first two initial guesses were not quite on target.
A slightly modified table creation script of the setup for the OP’s test case:
DROP TABLE T1 PURGE; CREATE TABLE T1 AS SELECT * FROM DBA_OBJECTS WHERE STATUS='VALID'; UPDATE T1 SET STATUS='INVALID' WHERE ROWNUM=1; COMMIT; CREATE INDEX IND_T1_STATUS ON T1(STATUS);
Let’s take a look at the data distribution in the table:
SELECT STATUS, CNT, ROUND((RATIO_TO_REPORT(CNT) OVER ())*100,6) PERCENT FROM (SELECT STATUS, COUNT(*) CNT FROM T1 GROUP BY STATUS); STATUS CNT PERCENT ------- ---------- ---------- INVALID 1 .001513 VALID 66095 99.998487
99.998% of the table’s rows have a STATUS of VALID with just a single row having a STATUS of invalid.
Now let’s collect the statistics for the table and index and check the execution plan:
ANALYZE INDEX IND_T1_STATUS COMPUTE STATISTICS;
ANALYZE TABLE T1 COMPUTE STATISTICS;
SET AUTOTRACE TRACEONLY EXPLAIN
SET PAGESIZE 1000
SET LINESIZE 140
SELECT
*
FROM
T1
WHERE
STATUS='INVALID';
Execution Plan
----------------------------------------------------------
Plan hash value: 3617692013
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 33048 | 3227K| 265 (1)| 00:00:04 |
|* 1 | TABLE ACCESS FULL| T1 | 33048 | 3227K| 265 (1)| 00:00:04 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("STATUS"='INVALID')
If you were assigned to help the OP achieve his task with the test case, what would you do?

Recent Comments