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

Similar Messages

  • 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.

  • What is the syntax for creating global temporary table using a select query

    hii
    I'm creating a global temporary table using a select query ..how to mention 'on commit preserve rows' that?
    create global temporary table t1 as select * from trn_ordbase on commit preserve rows;
    but this is invalid syntax,so how to mention on commit preserve rows in this???if i dont mention it ,by default its considering as on commit delete rows.
    Please help me out of this problem.

    create global temporary table t1 as select * from trn_ordbase on commit preserve rows;You CANNOT use this syntax.
    http://download-east.oracle.com/docs/cd/B19188_01/doc/B15917/sqcmd.htm
    http://download-east.oracle.com/docs/cd/B19188_01/doc/B15917/glob_tab.gif
    http://download-east.oracle.com/docs/cd/B19188_01/doc/B15917/cre_tabl.gif

  • Hi. I can not use "direct selection tool".

    Hi. I can not use "direct selection tools". When i click the direct selection tool, mouse like on image.
    I use illustrator cs 6

    Thanks Monika, i am noob

  • 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

  • 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.

  • 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

  • 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. :(

  • Index not used in DELETE

    Guys,
    I have an index on a table that is being used in SELECT but not in DELETE. Both DELETE AND SELECT are using EXISTS clause to join with another table.
    Even in SELECT, if I use "* from" the index is not being used. If I use "<column name> from" the index is being used. How can I make the DELETE to use index?
    Thanks
    Murali

    Can you please post both select and delete statements with possibly explain plans?
    you can use hints if you want the Delete statement to make use of index but hint is more like a quick fix.
    Execution plan could revel more info that can help you fix the issue in proper way

  • 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.

  • 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

  • Bitmap index not used

    I exported/imported a schema. Same Oracle version (10.2.0.3), same server (HP-UX/Itanium).
    I have a select that doesn't use a bitmap index in the new database. The same bitmap index is used in the old database.
    I run analyze, tried hinting (index, index_combine) nothing helped, I could not force the optimizer to use the index in the new database. Any suggestion?
    Thanks

    Hi Andras
    I would strongly recommend taking a 10053 trace and see what the CBO is up to.
    Cheers
    Richard Foote
    http://richardfoote.wordpress.com/

  • How to use dynamic select query which queries from 3 different table.

    Hi All,
    I am new to Toplink, i would like to use a named query to select some of the columns from 3 different tables with dynamic where clause.
    I have used the following lines. Please tell me how to get code for the dynamic where clause.
    First try :
    Vector objPersons = (Vector)session.executeQuery("findPersonByGlobalID",Person.class,vQueryArguments);
    The above method is not returning the vector or collection.
    Second Try:
    ReadAllQuery query = new ReadAllQuery(Person.class);
    query.useCollectionClass(LinkedList.class);
    LinkedList person = (LinkedList) session.executeQuery(query);
    The second try is returning the collection but, this fetches all the record from the table.
    1. How to query for range of records?
    2. How to query from multiple tables for some range. How to use dynamic range values ?
    Please reply with your answers or some pointers would help.
    Thanks and Regards,
    Vijay.B

    Hi,
    Did you try using a SQLCall ? It might be able to satisfy you requirements .. :-
    Employee employee = (Employee) session.executeSelectingCall(
        new SQLCall("SELECT * FROM EMPLOYEE WHERE EMP_ID = 44")
    );You can get more information here :-
    http://www.oracle.com/technology/products/ias/toplink/doc/1013/MAIN/_html/qrybas004.htm
    Regards,
    Sandeep

  • 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

Maybe you are looking for