Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
Home -> Community -> Mailing Lists -> Oracle-L -> Re: Function-Based Index not working
Hi Naveen,
Thanks a lot for the efforts you are putting in for me for such a simple problem, but unfortunately, for me all the tips and tricks are not solving the problem.
Now these are my current statistics :-
+ alter session set QUERY_REWRITE_ENABLED=TRUE;
+ alter session set QUERY_REWRITE_INTEGRITY=TRUSTED;
+ alter session set optimizer_mode=FIRST_ROWS;
+ alter session set DB_FILE_MULTIBLOCK_READ_COUNT=1;
This procedure writes 180,000 records in employeees table
+ execute bulk_insert
Analyzing table and rebuilding index (though its not necessary)
+ analyze table employees compute statistics;
+ alter index upper_ix rebuild;
Making autotrace on
+ set autotrace traceonly explain
Fired the query:
SELECT last_name FROM employees WHERE UPPER(last_name) IS NOT NULL ORDER BY UPPER(last_name);
Elapsed: 00:00:00.00
Execution Plan
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=57 Card=4001 Bytes=2 0005) 1 0 SORT (ORDER BY) (Cost=57 Card=4001 Bytes=20005) 2 1 TABLE ACCESS (FULL) OF 'EMPLOYEES' (Cost=38 Card=4001 By tes=20005)
Any clues what is happening? Should I insert more records in the table.
TIA,
Marul.
See the table's size is very small. Till it atleast 2 times the value of DB_BLOCK_SIZE * DB_FILE_MULTIBLOCK_READ_COUNT it will not use index.
Set the value of DB_FILE_MULTIBLOCK_READ_COUNT to one.
Insert lots of values in the table. You can make a procedure to insert random characters into the table, and then put it in a big loop. Analyze table and thn run the same query.
It should work
naveen
-----Original Message-----
From: Marul Mehta [mailto:marul_at_zycus.com]
Sent: Saturday, August 31, 2002 4:03 PM
To: Multiple recipients of list ORACLE-L
Subject: Re: Function-Based Index not working
Thanks a lot Naveen,
Even after executing the following the execution plan shows full table scan :-
+ alter session set QUERY_REWRITE_ENABLED=TRUE; + alter session set QUERY_REWRITE_INTEGRITY=TRUSTED; + alter session set optimizer_mode=FIRST_ROWS; + Insert into employees values('A'); + Insert into employees values('B'); + analyze table employees compute statistics; + select last_name FROM employees WHERE UPPER(last_name) IS NOT NULL ORDER BY UPPER(last_name); 2 3Elapsed: 00:00:00.00
Execution Plan
0 SELECT STATEMENT Optimizer=FIRST_ROWS (Cost=3 Card=2 Bytes=2 ) 1 0 SORT (ORDER BY) (Cost=3 Card=2 Bytes=2) 2 1 TABLE ACCESS (FULL) OF 'EMPLOYEES' (Cost=1 Card=2 Bytes= 2)
Even after using the hint no change in the plan :- + select /* INDEX employees(upper_ix) */ last_name FROM employees WHERE UPPER(last_name) IS NOT NULL;
Please tell me what else should I do to make this query use the index which is created.
TIA,
Marul.
Marul,
The decision of going for a full tablescan is based on DB_BLOCK_SIZE * DB_FILE_MULTI_BLOCK_READCOUNT, which tells how much data Oracle fetches at one time. If your entire table can be fetched in atleast 2 fetches, full table scan will be done instead of INDEX scan, to avoid doubling of work.
Naveen -----Original Message----- From: Marul Mehta [mailto:marul_at_zycus.com] Sent: Saturday, August 31, 2002 2:18 PM To: Multiple recipients of list ORACLE-L Subject: Function-Based Index not working Hi, Can you please help me out in solving this weird problem of funcation-based index not being used when I query the table. This is the comand I fired and the result it returned me. 1. SQL> create table employees (last_name varchar2(20)); Table created. 2. SQL> CREATE INDEX upper_ix ON employees (UPPER(last_name)); Index created. Made the autotrace on and than:- 3. SELECT last_name FROM employees WHERE UPPER(last_name) IS NOT NULL ORDER BY UPPER(last_name); no rows selected. Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE 1 0 SORT (ORDER BY) 2 1 TABLE ACCESS (FULL) OF 'EMPLOYEES' I fired without order by clause also but no use. Now can any body please let tell me why this Oracle is having a full scan of the employee table. TIA, Marul.
-- Please see the official ORACLE-L FAQ: http://www.orafaq.com -- Author: Marul Mehta INET: marul_at_zycus.com Fat City Network Services -- (858) 538-5051 FAX: (858) 538-5051 San Diego, California -- Public Internet access / Mailing Lists -------------------------------------------------------------------- To REMOVE yourself from this mailing list, send an E-Mail message to: ListGuru_at_fatcity.com (note EXACT spelling of 'ListGuru') and in the message BODY, include a line containing: UNSUB ORACLE-L (or the name of mailing list you want to be removed from). You may also send the HELP command for other information (like subscribing).Received on Sat Aug 31 2002 - 08:03:20 CDT