Index not used on view when table stats exist

Hello,
I would be grateful if someone comes with ideas on the following problem I'm currently facing.
I have a table with XMLTYPE data type column:
sql-->desc ACFBNK_STMT008
RECID     NOT NULL     VARCHAR2(200)
XMLRECORD XMLTYPE
I have a view V_ACFBNK_STMT008 on that table, in which the view columns are defined as extracted tags values from the XMLTYPE field, e.g. for the view field N_BOOKING_DATE:
numcast(extractValue(xmlrecord,'/row/c25')) "N_BOOKING_DATE"
(note: numcast is just a simple function that returns TO_NUMBER of its input argument)
I have also a function-based index on this field of the table:
CREATE INDEX train4.NIX_ACFBNK_STMT008_C25
ON train4.ACFBNK_STMT008("TRAIN4"."NUMCAST"(extractValue(xmlrecord,'/row/c25')))
And so, I'm executing on the view the following SQL statement:
SELECT RECID FROM V_ACFBNK_STMT008 WHERE (N_BOOKING_DATE > TO_NUMBER('20070725'));
Now, the problem comes: when statistics exist on the view base table (that is ACFBNK_STMT008) then the above statement is not using the index and is making a "table access full". When I delete the statistics for the table then the SQL runs fast with an "index range scan".
Which is further strange - when I change the ">" operand with a "=" the SQL statement correctly captures the index regardless of whether or not statistics exist.
I've tried to manually rewrite the SQL and include the "numcast" function in it:
SELECT RECID FROM TRAIN4.V_ACFBNK_STMT008 WHERE ( N_BOOKING_DATE>train4.numcast(TO_NUMBER( '20010725' ) ));
And in this way the index is used OK even with statistics existing!
But regretfully I don't have a way to change the application and the SQL, so the only things I can change is the view and/or the index.
Thank you in advance,
Evgeni
P.S.
I've tried gathering statistics in both the following ways but still the problem persists:
sql-->analyze table train4.ACFBNK_STMT008 compute statistics;
sql-->exec dbms_stats.gather_table_stats(ownname=>'TRAIN4', tabname=>'ACFBNK_STMT008', CASCADE=>TRUE, partname=>NULL);

Oh, and I forgot to mention: I cannot change the view definition as well (for example, to remove the "numcast"), since every now and then the application would recreate it automatically with the same code. :(

Similar Messages

  • After i bought mac os x lion from web then download , after that to install but when they ask me to choose disk to install i can not choose, it say this disk does not use the GUID partiton table scheme. use disk utility to change the partition scheme. but

    after i bought mac os x lion from web then download , after that to install but when they ask me to choose disk to install i can not choose, it say this disk does not use the GUID partiton table scheme. use disk utility to change the partition scheme. but

    after i bought mac os x lion from web then download , after that to install but when they ask me to choose disk to install i can not choose, it say this disk does not use the GUID partiton table scheme. use disk utility to change the partition scheme. but

  • HT5225 "This disc does not use the GUID Partition Table Scheme...". I keep getting this message when I try to install OSXLion. It has something to do with a repair Apple performed last year. I use a 17" MacBookPro. Any suggestions?

    "This disc does not use the GUID Partition Table Scheme. Use Disc Utility to change the partition scheme". I keep getting this message when I try to install OSX Lion so that I can upgrade my 17" MacBookPro to move to iCloud. My harddrive was replaced last year by Apple because of a fault by the manufacturer and I think this is the cause of the problem. What can I do so that I don't lose my content.

    When you click the partion tab. There is option on the bottom of the window. Click on that there there are these options.

  • Indexes not used in Oracle 8i

    Hi Everybody,
    Does anybody know how can i know which indexes are not used in our Oracle 8iR3 Database.
    We need to purge as soon as possible all indexes not used
    in our Datawarehousing system because they're growing and growing.
    I know there's some mechanism in Oracle 9i to query which are unused is it possible to simulate something similar?
    Kind regards and thank you in advance.
    José Luis Pérez
    [email protected]

    Are you asking about index monitoring in 8i? One way (and there aren't very many at all) of doing this is to collect (query them out of the DD) execution plans and scan those for index usage.

  • Index not used in a simple query

    Hi all,
    I have a query which is using only 2 tables linked with an indexed column, i'm surprised that the 2 tables are not using index and they are full scanned. here is some details:
    Table a: T1 (col11 number, col12 varchar2) indexed on col11 (primary key): rows number=4 millions indexe: idx1 on col11
    Table b: T2 (col21 number, col22 varchar2) indexed on col21 (primary key): rows number=3 millions indexe: idx2 on col21
    select a.col12, b.col22 from T1 a, T2 b where a.col11=b.col21
    The execution plan is:
    Operation     Object Name     Rows     Bytes     Cost     Object Node     In/Out     PStart     PStop
    SELECT STATEMENT Optimizer Mode=ALL_ROWS          3 M           32356                                          
      PX COORDINATOR                                                                
        PX SEND QC (RANDOM)     SYS.:TQ10002     3 M     67 M     32356       :Q1002      P->S       QC (RANDOM)      
          HASH JOIN          3 M     67 M     32356       :Q1002      PCWP                        
            PX RECEIVE          3 M     20 M     7376       :Q1002      PCWP                        
              PX SEND HASH     SYS.:TQ10001     3 M     20 M     7376       :Q1001      P->P       HASH             
                PX BLOCK ITERATOR          3 M     20 M     7376       :Q1001      PCWC                        
                  TABLE ACCESS FULL     T2     3 M     20 M     7376       :Q1001      PCWP                        
            BUFFER SORT                             :Q1002      PCWC                        
              PX RECEIVE          3 M     44 M     24708       :Q1002      PCWP                        
                PX SEND HASH     SYS.:TQ10000     3 M     44 M     24708              S->P       HASH             
                  TABLE ACCESS FULL     T1     3 M     44 M     24708                                           Thanks

    Hi Herald,
    Thanks for your reply
    when selecting only the columns which are indexed, it is using the index
    select a.account_link_code_n, b.account_link_code_n from gsm_sims_master a, gsm_service_mast b
    where a.account_link_code_n=b.account_link_code_n
    See the execution below:
    Operation     Object Name     Rows     Bytes     Cost     Object Node     In/Out     PStart     PStop
    SELECT STATEMENT Optimizer Mode=ALL_ROWS          3 M           11051                                          
      PX COORDINATOR                                                                
        PX SEND QC (RANDOM)     SYS.:TQ10002     3 M     44 M     11051       :Q1002      P->S       QC (RANDOM)      
          HASH JOIN          3 M     44 M     11051       :Q1002      PCWP                        
            PX RECEIVE          3 M     20 M     7376       :Q1002      PCWP                        
              PX SEND HASH     SYS.:TQ10001     3 M     20 M     7376       :Q1001      P->P       HASH             
                PX BLOCK ITERATOR          3 M     20 M     7376       :Q1001      PCWC                        
                  TABLE ACCESS FULL     GSM_SERVICE_MAST     3 M     20 M     7376       :Q1001      PCWP                        
            BUFFER SORT                             :Q1002      PCWC                        
              PX RECEIVE          3 M     22 M     3403       :Q1002      PCWP                        
                PX SEND HASH     SYS.:TQ10000     3 M     22 M     3403              S->P       HASH             
                  INDEX FAST FULL SCAN     ABILLITY.SIM_ACC_LNK_CD_IDX     3 M     22 M     3403                                                     But using hints has a very bad execution plan and a very high cost:
    select /*+ index(a) index(b) */ a.account_link_code_n, b.account_link_code_n from gsm_sims_master a, gsm_service_mast b
    where a.account_link_code_n=b.account_link_code_n
    Operation     Object Name     Rows     Bytes     Cost     Object Node     In/Out     PStart     PStop
    SELECT STATEMENT Optimizer Mode=ALL_ROWS          3 M           31899                                          
      HASH JOIN          3 M     44 M     31899                                          
        INDEX FULL SCAN     ABILLITY.GSM_SERV_MAST#ACLINK_CODE$PK     3 M     20 M     8158                                          
        INDEX FULL SCAN     ABILLITY.SIM_ACC_LNK_CD_IDX     3 M     22 M     15709                                           Thank you
    Luc

  • Indexes not used

    Hi All,
    I have a table and an index on a column. When I query this table based on the where condition of the index column, full table is scanned. I tried giving optimizer hint, but still it is performing full table scan. Please help what could be the reason. Optimizer mode in my db is ALL_ROWS.
    <pre>
    SELECT /*+ INDEX(table_name idx_doc_no) */
    * from table_name where doc_num = 125125
    </pre>
    I had also analyzed table as follows:
    ANALYZE TABLE table_name ESTIMATE STATISTICS;
    Thanks.

    - Get columns information of IDX_DOC_NO index.
    select index_name, COLUMN_NAME, COLUMN_POSITION from user_ind_columns where index_name='IDX_DOC_NO'
    Example:
    select index_name, COLUMN_NAME, COLUMN_POSITION from user_ind_columns where index_name='IND_T1'
    INDEX_NAME COLUMN_NAME COLUMN_POSITION
    IND_T1 OBJECT_NAME 2
    IND_T1 OBJECT_ID 1
    - Make sure about your sql statement, Check about Alias...
    Example:
    SQL> select /*+ index (T1 IND_T1) */ * from T1 where object_name='TMP01';
    Execution Plan
    Plan hash value: 3418867520
    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
    | 0 | SELECT STATEMENT | | 1 | 190 | 2 (0)| 00:00:01 |
    | 1 | TABLE ACCESS BY INDEX ROWID| T1 | 1 | 190 | 2 (0)| 00:00:01 |
    |* 2 | INDEX FULL SCAN | IND_T1 | 1 | | 1 (0)| 00:00:01 |
    Predicate Information (identified by operation id):
    2 - access("OBJECT_NAME"='TMP01')
    filter("OBJECT_NAME"='TMP01')
    Note
    - dynamic sampling used for this statement
    SQL> l
    1* select /*+ index (T1 IND_T1) */ * from T1 where object_name='TMP01'
    SQL> select /*+ index (T1 IND_T1) */ * from T1 a where object_name='TMP01';
    Execution Plan
    Plan hash value: 3617692013
    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
    | 0 | SELECT STATEMENT | | 1 | 190 | 3 (0)| 00:00:01 |
    |* 1 | TABLE ACCESS FULL| T1 | 1 | 190 | 3 (0)| 00:00:01 |
    Predicate Information (identified by operation id):
    1 - filter("OBJECT_NAME"='TMP01')
    Note
    - dynamic sampling used for this statement
    So,
    SQL> select /*+ index (a IND_T1) */ * from T1 a where object_name='TMP01'
    Execution Plan
    Plan hash value: 3418867520
    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
    | 0 | SELECT STATEMENT | | 1 | 190 | 2 (0)| 00:00:01 |
    | 1 | TABLE ACCESS BY INDEX ROWID| T1 | 1 | 190 | 2 (0)| 00:00:01 |
    |* 2 | INDEX FULL SCAN | IND_T1 | 1 | | 1 (0)| 00:00:01 |
    Predicate Information (identified by operation id):
    2 - access("OBJECT_NAME"='TMP01')
    filter("OBJECT_NAME"='TMP01')
    Note
    - dynamic sampling used for this statement

  • Index not using in select query

    Hello All,
    I have table CITY with 2 composite primary key CITYCODE, COUNTRYCODE of course they are NOT NULL.
    i created an index.
    CREATE UNIQUE INDEX CITYKEY ON CITY     (CITYCODE, COUNTRYCODE);
    then i run explain plan as follows
    explain plan for
    select CityCode, CityName, CountryCode, LexiconId, UserId, Status
    from City
    where CountryCode = 'IR';
    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
    | 0 | SELECT STATEMENT | | 803 | 57013 | 112 (2)| 00:00:02 |
    |* 1 | TABLE ACCESS FULL| CITY | 803 | 57013 | 112 (2)| 00:00:02 |
    later i analyze table rebuild indexes but again explain plan gives me the same result.
    Could any 1 please guide me to solve this issue.
    Thanks
    Edited by: mohsin javed on Feb 17, 2011 10:10 AM

    Hello All,
    Again with one more query which having join:
    table SDNMASTER with sdnid pk and SDNMASTER_PK index on SDNID, table SDNALIAS sdnid pk and SDNALIAS_PK index on SDNID.
    explain plan for
    SELECT a.SourceId,
              a.SourceName,
              b.LastName,
              a.Status
    FROM SdnMaster a,
              SdnAlias b
    WHERE a.SdnId = b.SdnId
    AND a.Status in ('1', '3')
    AND b.LastName is not null
    ORDER BY b.LastName;
    PLAN_TABLE_OUTPUT
    Plan hash value: 1153036645
    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
    | 0 | SELECT STATEMENT | | 2399 | 64773 | 69 (5)| 00:00:01 |
    | 1 | SORT ORDER BY | | 2399 | 64773 | 69 (5)| 00:00:01 |
    |* 2 | HASH JOIN | | 2399 | 64773 | 68 (3)| 00:00:01 |
    |* 3 | TABLE ACCESS FULL| SDNALIAS | 2399 | 21591 | 11 (0)| 00:00:01 |
    |* 4 | TABLE ACCESS FULL| SDNMASTER | 4562 | 82116 | 56 (2)| 00:00:01 |
    Even after analyzing table and rebuilding index its not using the index..
    Thanks

  • Index not used

    Hello all,
    I have a large table (20 million rows) partitioned by date (2 million rows/part) that includes an hour column. The hour data is stored in the '99' format as we only have 24 values/day. However the client wants the data displayed as '9999' so we created a set of views that display the data as hour||'00'. Our base table unique index includes the hour column, but now all the queries are seen by the database as where hour ='1100' as oposed to where hour='11' and the index is not used any more. How can we tell the optimizer that the '1100' that the client is selecting through the web views is actually our '11' that is stored in the already existing index?
    Please note that I would like to avoid having to create a function index. The existing index already takes 1.3Gb, don't wnt to spend another 1.3 Gb.
    Thank you very much,

    Your description doesn't quite compute.
    Access to rows in the WHERE clause has no relationship to what is displayed from the SELECT clause of a view. You may want to post the DDL and DML to explain how this is happening.

  • Index not used - why?

    Hi,
    I build a SQL-Report with this Statement:
    SELECT wb_mitarbeiter, wb_datum, wb_zeit, wb_kennzeichen, wb_ziel,
    sb_mitarbeiter, sb_datum, sb_zeit, sb_kennzeichen, sb_ziel,
    DECODE (wb_kennzeichen - sb_kennzeichen, 0, '', 'Diff') flag
    FROM lgs_items_org
    WHERE (sb_datum >= :p14_von OR -1 = :p14_von)
    AND (sb_datum <= :p14_bis OR -1 = :p14_bis)
    AND sb_mitarbeiter > 0
    AND (wb_mitarbeiter = :p14_wb_ma OR -1 = :p14_wb_ma)
    ORDER BY wb_datum ASC, wb_zeit ASC
    The result is correct, but a full table scan is performed, no index is used and needs very much time.
    In SQL*Plus I run this statement (:P14_von + :P14_bis replaced):
    SELECT wb_mitarbeiter, wb_datum, wb_zeit, wb_kennzeichen, wb_ziel,
    sb_mitarbeiter, sb_datum, sb_zeit, sb_kennzeichen, sb_ziel,
    DECODE (wb_kennzeichen - sb_kennzeichen, 0, '', 'Diff') flag
    FROM lgs_items_org
    WHERE sb_mitarbeiter > 0
    AND (sb_datum >= '20051122' OR -1 = '20051122')
    AND (sb_datum <= '20051122' OR -1 = '20051122')
    AND (wb_mitarbeiter = :p14_wb_ma OR -1 = :p14_wb_ma)
    ORDER BY wb_datum ASC, wb_zeit ASC
    Here an index is used. The result is correct and very fast.
    1) Why is the index?
    and
    2) How can I change the statement, to use the index?
    Thanks for any idea!
    Regards,
    Frank

    Thanks for your help! Thanks for the book-tip!
    I got it. The problem is the where-part.
    and (wb_mitarbeiter = :Pxy OR -1 = :Pxy) does NOT use an index, because the 2.part of the OR does not use an indexed column.
    But and wb_mitarbeiter = :Pxy (without the OR part) uses the index.
    My solution: I changed the sql-structured Query into a PL/SQL-Function-Body Report (a little bit longer :-( )
    declare
    q varchar2(5000);
    begin
    q := 'select NAME||'' - '' ||WB_MITARBEITER WB_MITARBEITER';
    q := q||', to_char(to_date(WB_DATUM,''YYYYMMDD''),''DD.MM.YYYY'') "DATUM WB"';
    q := q||', WB_ZEIT, WB_KENNZEICHEN WB_KZ, WB_ZIEL';
    q := q||', SB_MITARBEITER';
    q := q||', to_char(to_date(SB_DATUM,''YYYYMMDD''),''DD.MM.YYYY'') "DATUM SB"';
    q := q||', SB_ZEIT, SB_KENNZEICHEN SB_KZ, SB_ZIEL';
    q := q||', DECODE(WB_KENNZEICHEN - SB_KENNZEICHEN,0,'''',''Diff'') Flag';
    q := q||' from wwcontrol.LGS_ITEMS_ORG, wwcontrol.LGS_PERSONAL_ORG';
    q := q||' where SB_MITARBEITER > 0 AND WB_MITARBEITER = PINNR';
    if :P14_VON <> -1 THEN
    q := q||' and SB_DATUM >= :P14_VON ';
    end if;
    if :P14_BIS <> -1 THEN
    q := q||' and SB_DATUM <= :P14_BIS ';
    end if;
    if :P14_WB_MA <> -1 THEN
    q := q||' and WB_MITARBEITER = :P14_WB_MA ';
    end if;
    if :P14_DIFF = 1 THEN
    q := q||' and WB_KENNZEICHEN - SB_KENNZEICHEN <> 0';
    end if;
    q := q||' order by WB_DATUM asc, WB_ZEIT asc';
    return q;
    end;
    Is there a way to do this smarter?
    Regards,
    Frank

  • Find Indexes not used

    Hi ,
    Is there any script that i can run to see all the indexes that are not used in the Entire batch Jobs (these batch job has many DML's on large number of tables) but present(in valid state) during the Run.
    The main idea is to have these indexes and see if we can drop these indexes(if there is not impact on other operations).
    Thanks for the time,
    Bob

    http://www.oracle-base.com/articles/10g/IndexMonitoring.php

  • How to find BW Indexes not used in a long time

    Hello all,
    I am attempting to find out which indexes have not been used in the last 2 years in a effort to eliminate indexes from our BWA environment.  Is there a way I can query our BW environment to figure this out?  Is there a table, or group of tables in combination, that might be able to help me out here?
    Thanks to you all.

    Thanks for such a quick response.
    I am assuming the following about the table :
    -     Column u201CCALDAYu201D contains a date value for each day the Index is active.
    -     Column u201CBIA_USEDu201D contains a value that is iterated for the given day each time the Index is used.
    -     Column u201CBIA_NOTPOSSIBLEu201D contains a value representing how many times a query could not access this Index.
    -     Column u201CNO_BIAu201D tells if a BWA Index exists at all on any of my BWA Blades
    -     Column u201CBIA_TECHINAu201D ????????
    -     Column u201CBIA_INAu201D ???????
    -     Column u201CDB_FALLBACKu201D ???????
    I am not sure if my understanding of the column is correct.  Can you tell me they are?  The columns with u201C???????u201D mean I have no solid understanding of how to use these columns at all.
    Thanks

  • Bitmap Index Not Used in PROD and used in DEV

    I am in a situation where in in DEV Bitmap Index is used and in PROD bitmap Index is not used. I checked the count, in PROD I have 10 mil rows and in DEV I have 16 mil rows. Optimizer is CHOOSE and also when I tried to force to use index in PROD, I got higher cost.
    Any suggestions why Index is not used in PROD as opposed to DEV

    As other says, no guarantee that the same query with same setting OS, ORACLE to produce the same execution plan. Also, as Justin said, dont every take cost as your tuning parameter, pay attention to response time, also, number of logical reads and physical reads. What are the wait events during?
    For an index, most important factors are, blevel, clustering_factor, number of distinct values. Clustering actor make a lot of difference. You said, when you force index to use, your performance has gained. If so, why not, why the HINTS there in place? Go ahed and use it, but, after all the R&D. Are the Optimizer* paraemters same on the both databases?
    If possible, post the execution plan of the query, with HINT and without HINT as well.
    Jaffar

  • URGENT: index not used from jdbc

    Hi,
    This is for java app and sybase database.
    I have a 'select' query for which index is properly created. If I use plain jdbc connection, index is used and result comes pretty fast. but if I use connection from my app, it does not use index and takes long time.
    I am using PreparedStatement in both cases. I have compared all connection properties for both cases and they are exactly same. also, if I run that query using any sql tool like isql, result comes out pretty fast.
    Am I missing any other parameter related to connection?

    akshay_crest wrote:
    I have a 'select' query for which index is properly created. If I use plain jdbc connection, index is used and result comes pretty fast. but if I use connection from my app, it does not use index and takes long time."Plain" meaning like a little test application that runs the same query?
    Most likely reasons.
    1. If the answer to the above is yes, then you probably are not running the same query.
    2. You are not timing them in the same way and something else is slowing it down.
    3. Network problem.
    4. Not connecting to the same database/table.

  • Some indexes not used in JDBC call

    Hello everyone,
    I'm having a problem where a JDBC PreparedStatement without bind parameters can take more than a minute to execute a query that takes less than a second to execute in SQL*Plus. The query is identical, the database instance is the same, neither query is cached, and the query returns only 18 records with 11 columns all of which are either VARCHAR2 or NUMBER. I'm using Oracle's JDBC 2.0 drivers (classes12.jar) and Oracle 8i (Release 8.1.7.4.0) database. Oracle DB is set to use the cost-based optimizer.
    I did an explain plan in SQL*Plus and via JDBC. It turns out that some of the unique indexes that are used when executing the query in SQL*Plus are not used when executing via JDBC.
    Does anyone know why this would happen?
    Thanks,
    Jeff

    since you use a bind variable,oracle's cost based
    optimizer can not decide correctly whether to use
    this index is a good idea.The OP said he was NOT using bind variables in the testing within the SQL String of the PreparedStatement so this comment doesn't address his current problem.
    To the OP:
    Sounds like you have an Oracle permissions issue not related to JDBC specifically. Shouldn't be to hard to determine what the permission differences are between the two userids.
    Regarding proper use of PreparedStatement
    ALWAYS use PreparedStatement and host variables. There are 100's if not 1000's of posts documentation why this is a good idea here on the forums. Here are a couple of reasons why PreparedStatement with Host variables is a good idea.
    1) PreparedStatement using host variables will provide you best overall system performance.
    2) PreparedStatement using host variables eliminates the very real security risk of SQL injection.
    3) PreparedStatement using host variables aids the programmer in handling escape sequence and the frequent errors associated with special characters within SQL strings.
    4) PreparedStatement using host variables allows JDBC to take care of the majority of data conversions between Java and your database simplifying and standardizing data conversion coding
    There are isolated cases where using Host variables impedes performance when compared against dynamic SQL (SQL with literals) but they are few and far between (1: 1000?) and the standard should be to always use PreparedStatement with host variables.
    Good luck on resolving your current problem and remember to always use PreparedStatements WITH host variables when coding in Java!
    WFF

  • Not able to View generated SQL statement

    Hi,
    In order to view the generated SQL statement in Receiver JDBC Adapter,
    i have done logSQLStatement as true in  CC still not able to view in RWB,
    also mesg protocol i m using in CC is "xml sql format", is it bcos of this i am not able to ?
    If yes, then how can i see that sql string?
    Regards,
    Pratibha

    Pratibha,
    In our JDBC scenario the message protocol is also set to XML SQL Format
    The Integration Process has a mapping step of type XSL that uses an Imported Archive to create the SQL select statement.  Then there is a synchronous Send step for the JDBC component
    Both this SQL statement and the returned SQL result are available in the XML message monitor SXMB_MONI
    Regards,
    Mike

Maybe you are looking for