Why is my query using the wrong index?

Hi SQL Tuning experts....
I'm running Oracle 11.2.0.2 EE on Solaris 10
I've just checked my top SQL statements in OEM and drilling down on the top query of the list, I decided to run SQL Advisor on the query.
Low and behold, it came back with a profile that gives me a 99.9% improvement.
When I compared the original plan to the new plan the only difference is that the SQL Advisor is using a different index.
Now, the dumb DBA question: why? why is Oracle picking the wrong index?
original plan
SELECT STATEMENT
  COUNT STOPKEY
    VIEW
      SORT ORDER BY STOPKEY          
        TABLE ACCESS BY INDEX ROWID     ARADMIN.T2179          TABLE
          INDEX RANGE SCAN          ARADMIN.T2179_C3     INDEXnew plan...
SELECT STATEMENT
  COUNT STOPKEY
    VIEW
      SORT ORDER BY STOPKEY          
        TABLE ACCESS BY INDEX ROWID     ARADMIN.T2179               TABLE
          INDEX RANGE SCAN          ARADMIN.T2179_C536870923     INDEXThe stats:
table has approx. 3.3Mil rows
table segment is approx. 15G (5G of it is reclaimable space, but probably not related)
table has fresh stats and indexes have been recently rebuilt
indexes in this discussion are both b-tree
the C3 column is number(15) with 2836897 distinct rows
the C536870923 columns is VARCHAR2(255) with 1080533 distinct values
Here is the actual query:
     SELECT *
FROM (
SELECT T2179.C1,C536871040,C536871037,C536870944,C3,C536870918,C536870919,
C536870924,C536871048,C536871049,C536871050,C536870926,C536870925,
C536870916,C4,C536871275,C536871095,C536870913
FROM T2179
WHERE ((T2179.C536870923 = :"SYS_B_0") AND (T2179.C3 > :"SYS_B_1")) ORDER BY C1 DESC )
WHERE ROWNUM <= :"SYS_B_2"Obviously this is a good example of why we should use profiles. :-)
Edited by: ji li on Feb 14, 2013 1:32 PM
Sorry... I should have included the plan output
I'm guessing this has something to do with the cardinality of the data in the columns.

Dom.... I've already posted most everything. Here are the relevant init params and misc stuff you are asking for.
NAME                                 TYPE                             VALUE
object_cache_optimal_size            integer                          102400
optimizer_capture_sql_plan_baselines boolean                          FALSE
optimizer_dynamic_sampling           integer                          2
optimizer_features_enable            string                           11.2.0.2
optimizer_index_caching              integer                          0
optimizer_index_cost_adj             integer                          100
optimizer_mode                       string                           ALL_ROWS
optimizer_secure_view_merging        boolean                          TRUE
optimizer_use_invisible_indexes      boolean                          FALSE
optimizer_use_pending_statistics     boolean                          FALSE
optimizer_use_sql_plan_baselines     boolean                          TRUE
plsql_optimize_level                 integer                          2
db_file_multiblock_read_count        integer                          128
db_block_size                        integer                          8192
cursor_sharing                       string                           FORCE
SNAME                          PNAME                                    PVAL1 PVAL2
SYSSTATS_INFO                  STATUS                                         COMPLETED
SYSSTATS_INFO                  DSTART                                         12-04-2012 12:28
SYSSTATS_INFO                  DSTOP                                          12-04-2012 15:28
SYSSTATS_INFO                  FLAGS                                        0
SYSSTATS_MAIN                  CPUSPEEDNW                     2992.2746781116
SYSSTATS_MAIN                  IOSEEKTIM                                   10
SYSSTATS_MAIN                  IOTFRSPEED                                4096
SYSSTATS_MAIN                  SREADTIM                             48027.271
SYSSTATS_MAIN                  MREADTIM                             37217.102
SYSSTATS_MAIN                  CPUSPEED                                  2978
SYSSTATS_MAIN                  MBRC                                         0
SYSSTATS_MAIN                  MAXTHR                               400782336
SYSSTATS_MAIN                  SLAVETHR                               1403904
13 rows selected.
QL> l
  1  SELECT * FROM (
  2    SELECT
  3    T2179.C1,
  4    C536871040,
  5    C536871037,
  6    C536870944,
  7    C3,
  8    C536870918,
  9    C536870919,
10    C536870924,
11    C536871048,
12    C536871049,
13    C536871050,
14    C536870926,
15    C536870925,
16    C536870916,
17    C4,
18    C536871275,
19    C536871095,
20    C536870913
21    FROM aradmin.T2179
22    WHERE (
23     (C536870923 = '300885690')
24    AND
25     (C3 > '1360938353')
26          )
27    ORDER BY C1 DESC )
28* WHERE ROWNUM <= 1
no rows selected
Elapsed: 00:00:00.01
Execution Plan
Plan hash value: 2768254526
| Id  | Operation                      | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
|   0 | SELECT STATEMENT               |          |     1 |  2315 |     6  (17)| 00:00:01 |
|*  1 |  COUNT STOPKEY                 |          |       |       |            |          |
|   2 |   VIEW                         |          |     1 |  2315 |     6  (17)| 00:00:01 |
|*  3 |    SORT ORDER BY STOPKEY       |          |     1 |   226 |     6  (17)| 00:00:01 |
|*  4 |     TABLE ACCESS BY INDEX ROWID| T2179    |     1 |   226 |     5   (0)| 00:00:01 |
|*  5 |      INDEX RANGE SCAN          | T2179_C3 |     1 |       |     3   (0)| 00:00:01 |
Predicate Information (identified by operation id):
   1 - filter(ROWNUM<=1)
   3 - filter(ROWNUM<=1)
   4 - filter("C536870923"='300885690')
   5 - access(SYS_OP_DESCEND("C3")<HEXTORAW('3AF1C2A1ABC9FF') )
       filter(SYS_OP_UNDESCEND(SYS_OP_DESCEND("C3"))>1360938353)
Statistics
          0  recursive calls
          0  db block gets
       2615  consistent gets
          0  physical reads
          0  redo size
       1538  bytes sent via SQL*Net to client
        513  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          0  rows processed

Similar Messages

  • Select distinct is using the wrong index

    Hello,
    I have an indexes question?
    I have a table with 1M rows, the table structure is as follows:
    create table X(aTime DATE , a1 NUMBER(28,0), a2 NUMBER(28,0), a3 NUMBER(28,0), .... , a20 NUMBER(28,0) );
    I have also 2 indexes:
    - IDX1 is defined on (aTime, a1, a2, a3).
    - IDX2 is defined on (a1, a2, a3).
    I run the following query: "SELECT DISTINCT A1, A2, A3 from X;" and see that the optimizer chooses to do a FTS (full table scan) though I was expecting him to use IDX2 because it looks like a "covering" indexes giving all the answers to the query without fetching data rows.
    When I try to force him to use indexes, using the following hint "/*+INDEX(X IDX2)*/" the optimizer chooses IDX1.
    When I use same hint after I dropped IDX1 the optimizer still prefers to make FTS .
    Some general info:
    - a1, a2 and a3 have about 500 distinct values each).
    - db version 8.1.7.4.
    - all tables and indexes are analyzed.
    I have two questions:
    ===============
    1.
    Why does the optimizer prefers IDX1 (aTime, a1, a2, a3) over IDX2 (a1, a2, a3) when the query specifically requests distinct values of (aTime, a1, a2, a3), isn't there a shortcut the optimizer should use here?
    2.
    When I request the optimizer to use specific index (using hints), shouldn't it use the index I request regardless of his calculations? If not, is there any way to change this behavior?
    Tal Olier
    [email protected]

    You said you analyzed the tables and indexes. Did you also analyze the indexed columns?
    A full table scan may be a better execution plan than using an index, especially if you are selecting the full table.
    Remember that a hint is jut that, a hint. It suggests to the optimizer to do something, but the optimizer may still choose a different plan.

  • Optimizer is not using the right index

    Hi gurus,
    there's something I understand. If someone can explains, it'll be greatly appreciated.
    Env:
    10gR2 on Redhat AS
    The
    SQL> desc stock_detail
    Name Null? Type
    NO NOT NULL NUMBER(15)
    BP_CODE NOT NULL VARCHAR2(10)
    STOC_CAT_CODE NOT NULL VARCHAR2(6)
    BUIL_CODE NOT NULL VARCHAR2(8)
    LOCA_CODE NOT NULL VARCHAR2(8)
    LOCA_SUB_CODE NOT NULL VARCHAR2(6)
    ITEM_NO NOT NULL NUMBER(8)
    QTY NOT NULL NUMBER(6)
    DEFAULT_SHELF NOT NULL VARCHAR2(1)
    CREATION_DATE NOT NULL DATE
    CREATION_USER NOT NULL VARCHAR2(8)
    CM_NO NUMBER(15)
    LANDING_COST NUMBER(11,2)
    SUPPLI_COST NUMBER(11,2)
    RMA_DEADLINE DATE
    MOD_USER VARCHAR2(8)
    MOD_DATE DATE
    RECEP_DATE DATE
    NOTE VARCHAR2(2000)
    FLAG VARCHAR2(1)
    REFUS VARCHAR2(1)
    STOC_MOVE_REAS_CODE VARCHAR2(6)
    I have many indexes on this table. (like 5 or 6).
    There's one with item + business_unit (lets say INDEX_A)
    And there's one with item + category + business_unit (lets say INDEX_B)
    The following sql is always using the wrong index
    select nvl(sum(sd.qty),0)
    from stock_detail sd, location lo
    where sd.item_no = 419261 <- In INDEX_A & INDEX_B
    and sd.STOC_CAT_CODE='REG' <- In INDEX_B
    and sd.bp_code = 'TECMTL' <- In INDEX_A & INDEX_B
    and sd.buil_code <> 'TRANSIT'
    and sd.buil_code = lo.buil_code
    and sd.loca_code = lo.code
    and sd.loca_sub_code = lo.sub_code
    and nvl(lo.restricted, 'N') = 'Y';
    This SQL always use the INDEX_A. INDEX_B is far better.
    Stats of the index uactually used (INDEX_A):
    Last Analyzed 2007-10-18 22:04:38
    Blevel 1
    Distinct Keys 72124
    Clustering Factor 105368
    Leaf Blocks 339
    Average Leaf Blocks Per Key 1
    Average Data Blocks Per Key 1
    Number of Rows 110285
    Sample Size 110285
    Stats of the index I want to be used (INDEX_B)
    Last Analyzed 2007-10-18 22:04:46
    Blevel 2
    Distinct Keys 77407
    Clustering Factor 103472
    Leaf Blocks 551
    Average Leaf Blocks Per Key 1
    Average Data Blocks Per Key 1
    Number of Rows 110285
    Sample Size 110285
    Is there a way to use the right index without adding a hint?
    Thanks in advance.
    Message was edited by:
    (made a mistkae on the stats of index B)

    I assume the execution path is a nested loop driving of the table with the constant inputs.
    The key difference in the stats is that the second index has a blevel of 2. I'd guess that the cost of using the first index is 1, and the cost of using the second index is three.
    The basic cost of accessing a table through an index is:
    blevel +
    index selectivity (ix_sel) * leaf blocks +
    table selectivity (ix_sel_with_filtering) * clustering_factor.
    However, if the blevel is 1, then Oracle ignores it.
    Your index and table selectivities in both cases are 1/distinct_keys (since this is 10.2)
    The numbers involved with the leaf block and clustering factor calculations are so small (and similar) that the difference of 2 in the add-on for the blevel is the deciding factor.
    According to the statistics, though, the choice of index shouldn't make much difference to the performance, since the number of rows (and blocks) visited is likely to be the same. However, if you have an uneven distribution of values for individual columns, you may need a histogram on that column so that the optimizer can see the effect it has on the expected work.
    Regards
    Jonathan Lewis
    http://jonathanlewis.wordpress.com
    http://www.jlcomp.demon.co.uk
    P.S. I suppose it's probably fair to mention that I wrote a pretty good book about how the optimizer works: http://www.jlcomp.demon.co.uk/cbo_book/ind_book.html

  • Why isn't my query using the index?

    I have a query that inserts values for engines in a grid; it uses a static date table to determine the day in week, or
    week in year (depending on different standards, the DBA can configure this table to their business's likings). I have
    two indexes on this table:
    create table d_date (
         date_key number(5) not null,
         sql_calendar_date timestamp(3) null,
         year_id number(5) null,
         month_id number(3) null,
         day_id number(3) null,
         year_end_biz_date timestamp(3) null,
         qtr_end_biz_date timestamp(3) null,
         month_end_biz_date timestamp(3) null,
         week_end_biz_date timestamp(3) null,
         quarter_id number(3) null,
         week_id number(3) null,
         day_in_year number(5) null,
         day_in_month number(3) null,
         day_in_week number(3) null,
         month_name char(3) null,
         day_in_week_name char(3) null,
         month_type_code char(1) null,
         week_type_code char(1) null,
         date_type_code char(1) null,
         weekend_flag char(1) null,
         holiday_flag char(1) null,
         from_datetime timestamp(3) null,
         to_datetime timestamp(3) null,
         current_flag char(1) null,
         constraint d_date_pkey primary key (date_key)
         ) tablespace dim;
    create index d_date_dy on d_date(year_id, day_in_year) tablespace_dim_idx;
    create index d_date_ww on d_date(year_id, week_id) tablespace_dim_idx;Now, when I run a query to insert the week id into a table based on two values, the year_key and day_in_year_key,
    it should use the d_date_dy index correct?
    Here is what the query looks like:
    INSERT INTO F_ENGINE (YEAR_KEY,MONTH_KEY,WEEK_IN_YEAR_KEY,DAY_IN_YEAR_KEY,DAY_IN_MONTH_KEY,HOUR_IN_DAY_KEY, Q_HOUR_IN_DAY_KEY,
      GRID_KEY,ENGINE_KEY,TIME_STAMP,ENGINE_CPU_UTIL,ENGINE_CPU_GRID_UTIL,MEMORY_TOTAL_BYTE, MEMORY_FREE_BYTE,DISK_FREE_MEGABYTE,
      PROCESS_COUNT,ENGINE_ID,GRID_ID,GRID_NAME,BATCH_ID,RECORD_VIEWABLE_F)
    SELECT EXTRACT(YEAR FROM START_DATETIME),EXTRACT(MONTH FROM START_DATETIME), DD.WEEK_ID,
      TO_NUMBER(TO_CHAR(START_DATETIME, 'DDD')), EXTRACT(DAY FROM START_DATETIME),EXTRACT(HOUR FROM START_DATETIME),
      FLOOR(EXTRACT(MINUTE FROM START_DATETIME)/15)*15,DG.GRID_KEY,DE.ENGINE_KEY, START_DATETIME,CPU_UTIL,DS_CPU,MEMORY,
      FREE_MEMORY,FREE_DISK,PROCESSES,ID,PE.GRID,DG.GRID_NAME,:B1 ,1
    FROM P_ENGINE PE, D_GRID DG, D_ENGINE DE, D_DATE DD
    WHERE PE.GRID = DG.GRID_ID AND DG.CURRENT_FLAG = 'Y' AND PE.ID = DE.ENGINE_ID AND DE.GRID_KEY = DG.GRID_KEY AND
      DE.CURRENT_FLAG = 'Y' AND PE.BATCH_ID = :B1 AND DD.YEAR_ID = EXTRACT(YEAR FROM START_DATETIME) AND
    DD.DAY_IN_YEAR = TO_NUMBER(TO_CHAR(START_DATETIME,'DDD'))
    ORDER BY EXTRACT(YEAR FROM START_DATETIME),EXTRACT(MONTH FROM START_DATETIME),
      EXTRACT(DAY FROM START_DATETIME),EXTRACT(HOUR FROM START_DATETIME),FLOOR(EXTRACT(MINUTE FROM START_DATETIME)/15)*15,
      DG.GRID_KEY,DE.ENGINE_KEY
    Here is the explain plan:
    Operation Object Object Type Order Rows Size (KB) Cost Time (sec) CPU Cost I/O Cost
    INSERT STATEMENT
    SORT ORDER BY
         HASH JOIN
           HASH JOIN
             HASH JOIN
              TABLE ACCESS FULL D_GRID TABLE 1 2 0.316 3 1 36887 3
              TABLE ACCESS FULL D_ENGINE TABLE 2 10 0.410 3 1 42607 3
             PARTITION LIST SINGLE   5 1434 344.496 9 1 2176890 9
              TABLE ACCESS FULL P_ENGINE TABLE 4 1434 344.496 9 1 2176890 9
                TABLE ACCESS FULL D_DATE TABLE 7 7445 283.550 19 1 3274515 18Now it is obviously not using the index for the d_date table since it is doing a full table access.
    Does this have something to do with the fact that I am using extract(), to_number(), to_char() functions in my WHERE clause that it is not allowing the use of the index?
    Any help would be greatly appreciated. Thanks.
    -Tim

    It's difficult to tell just from this. For one thing, you didn't post your query using the forum format tags, so it's hard to read and you didn't post your Oracle version.
    In the query, you don't always prefix columns with the table alias. That makes it impossible for us (and maintainers of this code) to know at a glance which table a column is in.
    It's possible that performing functions on a column will disable the index. Do your other tables have indexes? Do you have updated statistics on all the tables?
    The main reason the optimizer will not use an index is because it thinks it cheaper not to.

  • Why does it not use the index?

    L.S.,
    We are using a table called IT_RFC_REGISTRATION. It is a relatively big table for our application.
    Its primary key is RFCNR, each new RFCNR getting the next value.
    Now for my intranet report I am interested in the last 40 records. But when I execute:
    SELECT *
    FROM IT_RFC_REGISTRATION
    ORDER BY RFCNR DESC
    the query takes ages to execute.
    When I do this:
    SELECT RFCNR
    FROM IT_RFC_REGISTRATION
    ORDER BY RFCNR DESC
    the result comes instantaneous because this query uses the index on RFCNR.
    Why does the former query not use the index to execute? It should be much faster to fetch ROWIDs from the index end to start and use those to get the records, than to load all the records and then sort them.
    Is there a trick with which I can use a join of the latter query and the former query to speed up the result?
    Greetings,
    Philbert de Zwart,
    Utrecht, The Netherlands.

    The difference you see in query run time is based on the amount data being sorted, then returned. In the first query, a full table scan is faster since if the index was used, Oracle would have to do a lookup in the index, get the rowid's and go look up the data in the table (TWO disk i/o's). It's faster to just scan the entire table.
    Indexes will generally not be used unless you have a where clause. If you only need a few fields from the table, you could include them all in an index. For instance, if you only need RFCNR & DESC create a concatenated index on those two columns and then only a scan of the index is required (very fast).

  • Query don't use the right index when using bind variables

    Hi people !
    I need some help because I have an issue with a query that don t use the right Indexes as it should
    First of all, I have mainly three tables :
    ORDER : Table that contains description for each Order (approximately 1 000 000 Records)
    ORDER_MVTS : Table that contains the tasks made (called movements) to set up each Orders
    with quantity of packages prepared for each product (approximately 10 000 000 Records)
    PRODUCT : Tables that contains the products (approximately 50 000 Records)
    When I launch the query with hard coded values, it brings back response very fast
    because it uses the right index (ORDER_DHR_VALID) which represent the date and hour of the order
    (with format 'DD/MM/YYYY HH24:MI:SS'). The selectivity for this index is good.
    NB 1: I have to use the trick " >= Trunc(date) and < trunc(date) +1 " to filter on a simple date because
    the index contains hour and minutes (I know it wasn't probably a bright idea at conception time).
    NB 2: The index on ORDER_MVTS.PRODUCT_CODE is'nt discriminating enough because there is'nt enough different products.
    It's the same for index on CUSTOMER_CODE and on MVT_TYPE so only the index on ORDER.DHR_VALID is good.
    Here is the correct explain plan when I execute the query with hard coded values :
    SELECT SUM(ORDER_MVTS.NB_PACKAGE)
    FROM ORDER_MVTS, PRODUCT, ORDER
    WHERE ORDER.DHR_VALID >= TRUNC(to_date('14/11/2008 10:04:56','DD/MM/YYYY HH24:MI:SS'))
    AND ORDER.DHR_VALID < TRUNC(to_date('14/11/2008 10:04:56','DD/MM/YYYY HH24:MI:SS')) + 1
    AND ORDER_MVTS.MVT_TYPE = 'DELIVERY'
    AND PRODUCT.CODE = ORDER_MVTS.PRODUCT_CODE
    AND ORDER_MVTS.ORDER_CODE = ORDER.CODE
    AND ORDER.CUSTOMER_CODE = 'ADIDAS'
    AND PRODUCT.CODE = 1234
    Rows Row Source Operation
    1 SORT AGGREGATE
    2 NESTED LOOPS
    4 NESTED LOOPS
    2 INDEX UNIQUE SCAN (object id 378548) --> PRODUCT_PK
    4 TABLE ACCESS BY INDEX ROWID ORDER
    777 INDEX RANGE SCAN (object id 378119) --> ORDER_DHR_VALID
    2 TABLE ACCESS BY INDEX ROWID ORDER_MVTS
    30 INDEX RANGE SCAN (object id 377784) --> ORDER_MVTS_ORDER_FK
    Now the problem is when the query is used in a Cursor with bind variables.
    It seems like Oracle don't use index on ORDER.DHR_VALID because he can't figure out that he have
    to actually filter on a short period of time (only one day).
    So Oracle uses the index on ORDER_MVTS.PRODUCT_CODE which is'nt a bright idea (it takes 10 secondes instead of just one)
    Here is the bad explain plan :
    Rows Row Source Operation
    1 SORT AGGREGATE
    2 NESTED LOOPS
    722 NESTED LOOPS
    2 INDEX UNIQUE SCAN (object id 378548) --> PRODUCT_PK
    722 TABLE ACCESS BY INDEX ROWID ORDER_MVTS
    1790 INDEX RANGE SCAN (object id 377777) --> ORDER_MVTS_PRODUCT_FK
    2 TABLE ACCESS BY INDEX ROWID ORDER
    1442 INDEX UNIQUE SCAN (object id 378439) --> ORDER_PK
    Now I have found two solutions to this problem :
    1) using a Hint to force the use of index on ORDER.DHR_VALID (with /*+ INDEX(ORDER ORDER_DHR_VALID) */ )
    2) Using Dynamic SQL and keeping the date hard coded (but not the other values except mvt_type)
    For example :
    QUERY :=
    'SELECT SUM(ORDER_MVTS.NB_PACKAGE)
    FROM ORDER_MVTS, PRODUCT, ORDER
    WHERE ORDER.DHR_VALID >= TRUNC(TO_DATE('''||To_char(P_DTE_VAL,'DD/MM/YYYY')||''',''DD/MM/YYYY'')) '||
    AND ORDER.DHR_VALID < TRUNC(TO_DATE('''||To_char(P_DTE_VAL,'DD/MM/YYYY')||''',''DD/MM/YYYY'')) + 1 '||
    AND ORDER_MVTS.MVT_TYPE = 'DELIVERY'
    AND PRODUCT.CODE = ORDER_MVTS.PRODUCT_CODE
    AND ORDER_MVTS.ORDER_CODE = ORDER.CODE
    AND ORDER.CUSTOMER_CODE = :CUSTOMER
    AND PRODUCT.CODE = :CODE ';
    These two solutions work but Number 1 is bad in theory because it uses a Hint
    and Number 2 may be difficult to code.
    So my question is : Does someone knows another solution to force the use of index ORDER_DHR_VALID that can be simple and reliable.
    Thank you very much for support
    Edited by: remaï on Apr 1, 2009 4:08 PM

    What version of oracle you have? CBO work is different in 9i and 10g.
    Usually cost based optimizer do not want to use index for >< condition with binding variables because optimizer can not use statistic to determine selectivity, and by default selectivity of <> operators is low.
    (As I remember '>' selectivity by default is 5%, you have two conditions > and <, therefore resulting selectivity will be 0.05*0.05=0.0025 as two independent events, but selectivity of other conditions
    ORDER_MVTS.MVT_TYPE = 'DELIVERY' or ORDER.CUSTOMER_CODE = 'ADIDAS' looks much better for CBO)
    The best solution I see is do not use binding variables. Actually your query looks as searching query, which executes not so often, therefore you will not have perfomance win along of skipping execution plan creation.
    Edited by: JustasVred on Apr 1, 2009 10:10 AM

  • Qeury not using the bitmap index

    Hi,
    Pls have a look at the query below:
    SELECT
    A.flnumber,
    A.fldate,
    SUBSTR(C.sec,1,3) sect,
    D.element,
    C.class,
    SUM(C.qty) qty,
    A.indicator,
    DECODE(A.indicator, 'I', B.inrt, 'O', B.outrt, 'R', B.rting, NULL) direction,
    B.rting
    FROM
    Header A,
    Paths B,
    PathData C,
    ElementData D
    WHERE
    (D.category='N') AND
    (A.rt=B.rt) AND
    (C.element=D.element) AND
    (A.fldate=C.fldate AND
    A.flnumber=C.flnumber) AND
    C.element IN (SELECT codes FROM Master_codes WHERE type='F')
    GROUP BY A.flnumber,
         A.fldate,
         SUBSTR(C.sec, 1, 3),
         D.element,
         C.class,
         A.indicator,
         DECODE(A.indicator,'I', B.inrt, 'O', B.outrt,'R', B.rting, NULL),
    B.rting
    UNION ALL
    SELECT
    A.flnumber,
    A.fldate,
    SUBSTR(C.sec,1,3) sect,
    D.element,
    C.class,
    SUM(C.qty) qty,
    A.indicator,
    DECODE(A.indicator, 'I', B.inrt, 'O', B.outrt, 'R', B.rting, NULL) ROUTE_direction,
    B.rting
    FROM
    Header A,
    Paths B,
    PathData C,
    ElementData D
    WHERE
    (D.category='N') AND
    (A.rt=B.rt) AND
    (C.element=D.element) AND
    (A.fldate=C.fldate AND
    A.flnumber=C.flnumber) AND
    C.element NOT IN (SELECT codes FROM Master_codes WHERE type='F')
    GROUP BY A.flnumber,
         A.fldate,
         SUBSTR(C.sec, 1, 3),
         D.element,
         C.class,
         A.indicator,
         DECODE(A.indicator,'I', B.inrt, 'O', B.outrt,'R', B.rting, NULL),
    B.rting
    The cost in the explain plan is very high. The table PathData* has 42710366 records and there is a bitmap index on the flnumber_ and fldate* columns. But the query above does not use the indexes. The other tables in the list are fine as their respective PK and indexes are used but the table PathData* is going for a "Table Access by Local Index Rowid". dont know what it means but the cost for this is 7126 which is high. I cant figure out why is the query not using the bitmap indexes for this table.
    Pls let me know what should be done.???

    Thread: HOW TO: Post a SQL statement tuning request - template posting
    HOW TO: Post a SQL statement tuning request - template posting
    SELECT a.flnumber,
           a.fldate,
           Substr(c.sec, 1, 3)       sect,
           d.element,
           c.class,
           SUM(c.qty)                qty,
           a.INDICATOR,
           Decode(a.INDICATOR, 'I', b.inrt,
                               'O', b.outrt,
                               'R', b.rting,
                               NULL) direction,
           b.rting
    FROM   header a,
           paths b,
           pathdata c,
           elementdata d
    WHERE  ( d.category = 'N' )
           AND ( a.rt = b.rt )
           AND ( c.element = d.element )
           AND ( a.fldate = c.fldate
                 AND a.flnumber = c.flnumber )
           AND c.element IN (SELECT codes
                             FROM   master_codes
                             WHERE  TYPE = 'F')
    GROUP  BY a.flnumber,
              a.fldate,
              Substr(c.sec, 1, 3),
              d.element,
              c.class,
              a.INDICATOR,
              Decode(a.INDICATOR, 'I', b.inrt,
                                  'O', b.outrt,
                                  'R', b.rting,
                                  NULL),
              b.rting
    UNION ALL
    SELECT a.flnumber,
           a.fldate,
           Substr(c.sec, 1, 3)       sect,
           d.element,
           c.class,
           SUM(c.qty)                qty,
           a.INDICATOR,
           Decode(a.INDICATOR, 'I', b.inrt,
                               'O', b.outrt,
                               'R', b.rting,
                               NULL) route_direction,
           b.rting
    FROM   header a,
           paths b,
           pathdata c,
           elementdata d
    WHERE  ( d.category = 'N' )
           AND ( a.rt = b.rt )
           AND ( c.element = d.element )
           AND ( a.fldate = c.fldate
                 AND a.flnumber = c.flnumber )
           AND c.element NOT IN (SELECT codes
                                 FROM   master_codes
                                 WHERE  TYPE = 'F')
    GROUP  BY a.flnumber,
              a.fldate,
              Substr(c.sec, 1, 3),
              d.element,
              c.class,
              a.INDICATOR,
              Decode(a.INDICATOR, 'I', b.inrt,
                                  'O', b.outrt,
                                  'R', b.rting,
                                  NULL),
              b.rting  Edited by: sb92075 on Mar 13, 2011 7:58 AM

  • Can Oracle be forced to use the spatial index for sdo_filter in combination with an or clause? Difference between Enterprise and SE?

    We’re seeing the following issue: sql - Can Oracle be forced to use the spatial index for sdo_filter in combination with an or clause? - Stack Overflow (posted by a colleague of mine) and are curious to know if this behaviour is due to a difference between standard and enterprise, or could we doing something else wrong in our DB config.?
    We have also reproduced the issue on the following stacks:
    Oracle SE One 11.2.0.3 (with Spatial enabled)
    Redhat Linux 2.6.32-358.6.2.el6.x86_64 #1 SMP Thu May 16 20:59:36 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
    11.2.0.3.0 Standard Edition and 11.2.0.4.0 Standard Edition (both with Spatial enabled)
    Microsoft Windows Server 2003R2 Standard x64 Edition
    However, the SQL works fine if we try it on Oracle 11.2.0.3.0 *Enterprise* Edition.
    Any help or advice would be much appreciated.
    Kindest Regards,
    Kevin

    In my experience sdo_filter ALWAYS uses the spatial index, so that's not the problem. Since you did not provide the explain plans, we can't say for sure but I think yhu is right: Standard Edition can't use the bitmap operations, and thus it'll take longer to combine the results of the two queries (because the optimizer will surely split this OR up in two parts, then combine them).
    BTW: when asking questions about queries here, it would be nice if you posted the queries here as well, so that we do not have to check another website in order to see what you are doing. Plus it will probably get you more answers, because not everyone can be bothered to click on that link. It would also have been nice if you had posted your own answer on the other post here as well, because my recommendation would have been to use union all - but since you already found that out for yourself my recommendation would have been a little late.

  • Why can I not use the channel name, which is obtained from the function of DAQmx Task, as the input of the channel name for the function of Get Channel Information of DAQ?

    Why can I not use the channel name, which is obtained from the function of DAQmx Task, as the input of the channel name for the function of Get Channel Information of DAQ?

    Not a lot of details here, but my guess is this isn't working for you because you are wiring in the task to the Active Channels Property and not the actual Channel Name. I have attatched a screenshot of what I believe you are trying to do. The Task has 2 channels in it, so I need to index off one of the channels and wire it into the active channels input of the Channel Property node. Then I can read information about that channel
    Attachments:
    channel_name.JPG ‏69 KB

  • I used the wrong password for my belkin wifi. Now that I know the correct password I can not get pass the unable to connect or join message. I have turned off all the options such as wifi and join and also put my touch to sleep.. but nothing seems to work

    I used the wrong password to join my new belkin wifi. Now that I have the correct password, I can not get the to the join screen with the space to type in the password. I continue to get the unable to join message.  I have put the touch to sleep and I have turned on and off the wifi and join options on the Network screen page.  Does anyone know how to get pass this block of the wrong password to a new page that will allow me to type in the correct password.  I see there is a option that asks if I want to reset the network settings.. is that what I should do? and what does it erase when I do that?  Thanks for any input anyone has.

    Yes.  Reset network settings. Head to Settings -> General -> Reset and tap Reset Network Settings.
    B-rock

  • I am using the wrong language to access a secure website. How can I change it to English?

    I am trying to access my university account from a computer in Germany and while I can access some features, such as e-mail, it is not allowing me access to my secure faculty account. The message I am getting is that I am using the wrong language, i.e. German, to access my account. How can I change the language to English, since the computer automatically uses German.

    Put the link of the website into Google translate at [http://translate.google.com/#de|en|], then click the translate button. You will then get a link on the right hand side of the page which will take you to a translated version of the page.

  • I used the wrong email account when setting up ios8 iCloud drive, how can I change it on my iphone5?

    I used the wrong email account while setting up iCloud drive during the upgrade to ios8, how can I change it on my iphone5?

    See the iCloud account FAQ:Creating an iCloud account: Frequently Asked Questions for info on managing the account towards the bottom of the FAQ.

  • I accidentally created an iCloud account using the wrong email address for my username - I already have an iCloud account with a different email address username. Is there any way I can merge these accounts?

    I just upgraded my MacBook from OS X 10.6.8 to Mountain Lion so that I could stream from my other devices (iPhone and iPad) to my MacBook.  After making it through the upgrade process, I realized that I used the wrong email address for my iCloud username when starting up on the MacBook.  My iPhone, iPad, and iTunes are under my Hotmail email address and I accidently used my Gmail email address for the MacBook.  Is there any way I can merge these two icloud accounts together? I tried changing my account information to add the other email address, but wasn't allowed because another account was using the name (duh).  If I can't merge them, how could I change the MacBook from the Gmail address to the Hotmail address so that all my devices are on the same icloud account?  It'd be nice if I could keep the free 5GB of storage that comes with my purchase of the software, but I'd rather lose the storage than not be able to stream.

    To change accounts on your Mac, go to System Preferences, sign out of the current account, then sign into the new account.  When you sign out of the current account it will delete synced data from your Mac.  Assuming your data (such as contacts, calendars, etc.) is in the other iCloud account, it will be synced to your Mac when you sign into this account.

  • Hi, why can't I use the iMessage on my iPhone? I've already had my apple id email on it but it keeps saying "waiting for activation" always like that. No progress. Could anybody help me on this? Cheers

    Hi, why can't I use the iMessage on my iPhone? I've already had my apple id email on it but it keeps saying "waiting for activation" always like that. No progress. Could anybody help me on this? Cheers

    I have an old iPod Touch with old software that can no longer be updated:
    iOS version 6.1.6
    I've been searching for a solution to my iMessage login problem for months and tried everything from those frustrating links and all the tips from other users.
    Here is what finally worked:
    1) Settings > Privacy > Location Services > On
    2) Settings > General > Date & Time > Set Automatically > On
    3) Reboot device until Apple logo appears
    4) Settings > Messages > Sign In

  • Why can't i use the radio on my nano 7g with bluetooth

    why can't i use the radio on my nano 7g with bluetooth. i wanted to use wireless feature at work but i only use the radio at work , so i bought bluetooth stereo headphones by plantronics, got the backbeat 903, at wal-mart  . got home got it all set up and works fine but not for radio , i'm so dissaponted and am thinking i might take them back and continue using the wire ware , but then again i like listening to my podcast while doing dishes and chores at home so the bluetooth would be better for that .

    i have sent a feedback form to apple about this problem . i hope that they work on a sulotion for it .

Maybe you are looking for