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.
-TimIt'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 PMWhat 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 -
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,
KevinIn 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?
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 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 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 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 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
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
-
What is the difference between function and method
Hey I need help I dont know which is the difference between function and method ? Does anybody can ask me this question. Thanks
-
Creating individual clips of a scene for post work
I need to take an edit which has been done by someone else using several video tracks in FCP, and "collapse" it into discreet individual shot clips that I want to be able to "save out" as individual movie files for some outside of FCP post work. I wa
-
I've installed the packaged app "Issue tracker" in a workspace, but now have a problem with German's law (and maybe others), which does not allow people to make reports that explicitely mention names of employees, except if you are their manager. So
-
Database Session hangs around for 20 minutes after logout
We used HTML DB 1.6.0.00.87 to create a custom data warehouse reporting application. For some reason once you log out of HMTL_DB, the database session does not go away until 20 minutes later. I have tested it several times and it is consistent at 20
-
Four Users, One Mac - Want all to have permissions for all files
Our family shares an imac on 10.6. I want to set the machine up so all for users have access to all files. Is this as simple as going to Get Info for the Macintosh HD and changing permissions for everybody to read and write and then choosing the "for