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
Similar Messages
-
Index not usable in my simple query
Hi,
I have created index for INC_ID coloumn but when I use it in queries, it is not working. Verified the index it is on valid stat only, eventhough its not using in queries.
can you please suggest why it is not using. what I have to do for this. I am going to use this query in procedures. My DBA will not allow to use hints in queries.
Thanks in advance
select * from TAB_FLNDAT t where t.INC_ID = 2055Explain plan
SELECT STATEMENT, GOAL = ALL_ROWS 339682 19174 7631252
TABLE ACCESS FULL AIMS_OWNR ONT_T_FLNDATASTATUS_AGNT 339682 19174 7631252Total no of records in TAB_FLNDAT table -- 21427155
Table DDL
-- Create table
create table TAB_FLNDAT
INC_ID VARCHAR2(25),
INC_PERIOD NUMBER,
AREA_DEF_ID NUMBER,
DEAL_CODE VARCHAR2(50),
FLNMTH DATE,
DOCNUM NUMBER(10),
CPNNUM NUMBER(3),
CTRY_ISO_CODE VARCHAR2(2),
FLNLOCCOD VARCHAR2(7),
FLNCTYCOD VARCHAR2(3),
FLNDATAKEY NUMBER,
MAIN_CLASS VARCHAR2(17),
BOKCLSCOD VARCHAR2(1),
ORIGIN VARCHAR2(6),
DESTINATION VARCHAR2(3),
FINAL_ST NUMBER(1),
SALE_ST NUMBER(1),
AGENT_ST NUMBER(1),
EKOAL_ST NUMBER(1),
FARE_ST NUMBER(1),
PAPERTKT_ST NUMBER(1),
OND_ST NUMBER(1),
RBD_ST NUMBER(1),
FLIGHT_ST NUMBER(1),
FBC_ST NUMBER(1),
DEAL_ST NUMBER(1),
DEAL_ST_CODE VARCHAR2(50),
ONDRBD_ST NUMBER(1),
DATE_ST NUMBER(1),
CODESHARE_ST NUMBER(1),
HPMCO_ST NUMBER(1),
CTRY_ST NUMBER(1),
LC_REVENUE NUMBER(18,3),
CURCOD VARCHAR2(3),
LC_NET_NET NUMBER(21,3),
REPORTING_CURRENCY VARCHAR2(3),
CARDSGCOD VARCHAR2(2),
CARNUMCOD VARCHAR2(3),
DOCTYP VARCHAR2(3),
FLNDAT DATE,
FLTNUM VARCHAR2(4),
FLNSEC VARCHAR2(6),
FLNITN VARCHAR2(200),
SALMTH DATE,
SALCTYCOD VARCHAR2(3),
SALLOCCOD VARCHAR2(10),
FABCOD VARCHAR2(50),
IATA_FABCOD VARCHAR2(50),
TOTPAX NUMBER(9),
CPNCNT NUMBER(6),
PAXCNT NUMBER(6),
CBKGRSAMT NUMBER(15,3),
CBKNETAMT NUMBER(15,3),
CBKCOMAMT NUMBER(15,3),
CBKORCAMT NUMBER(15,3),
COSGRSAMT NUMBER(15,3),
COSNETAMT NUMBER(15,3),
COSCOMAMT NUMBER(15,3),
COSORCAMT NUMBER(15,3),
COUCOD VARCHAR2(7),
TOUCOD VARCHAR2(20),
OLD_DOCNUM NUMBER(10),
ON_OFFLINE CHAR(1),
ENTFABCOD VARCHAR2(50),
EKOALIND CHAR(1),
ONL_INTL_INDICATOR VARCHAR2(1),
FULL_ITINERARY VARCHAR2(500),
RPD_COSGRSAMT NUMBER(15,3),
RPD_COSNETAMT NUMBER(15,3),
RPD_COSCOMAMT NUMBER(15,3),
RPD_COSORCAMT NUMBER(15,3),
SALDAT DATE,
REPENDDAT DATE,
ETKIND VARCHAR2(1),
MKTFLTNUM VARCHAR2(8),
CODSHRIND VARCHAR2(1),
FARE_TYPE VARCHAR2(50),
CMM_CUSTOMER_ID VARCHAR2(25),
OPERATING_COST NUMBER(18,3),
ACM_AMOUNT NUMBER(18,3),
GDS_COST NUMBER(18,3),
OCCURRENCE NUMBER(3),
PROCESS_MONTH DATE,
ONTRACK_FBC VARCHAR2(100),
EKHMCOIND CHAR(1),
RPT_FLNITN VARCHAR2(200),
CORPORATE_ID VARCHAR2(25),
CORP_DEAL_CODE VARCHAR2(50),
OSI_DATA VARCHAR2(100),
PAX_NAME VARCHAR2(1000),
PAX_TYPE VARCHAR2(1),
BOOKING_DATE DATE,
SKYWARDS_NO VARCHAR2(11),
PROCESSED CHAR(1),
FLTFULROU VARCHAR2(30),
FLTROUFLNLEG VARCHAR2(30),
FLNACFTYP VARCHAR2(10),
SEQNO NUMBER(3),
FORM_OF_PAYMENT VARCHAR2(9),
TRPTYP VARCHAR2(1),
FOPDTL VARCHAR2(300),
PNR_ID NUMBER(15),
VALUE_ADDED_COST NUMBER(18,3),
LINK_OD VARCHAR2(45),
TEMP VARCHAR2(50),
ONT_FBC_TEMP VARCHAR2(100),
ONT_FBC_TYPE_TEMP VARCHAR2(20),
ONT_FBC_ST_TEMP NUMBER(1),
INC_FINAL_ST_TEMP NUMBER(1),
TEMP_FLAG VARCHAR2(1),
MODIFIED CHAR(1),
MATCH_FLAG CHAR(2)
tablespace A_DAT
pctfree 10
initrans 1
maxtrans 255
storage
initial 64K
next 1M
minextents 1
maxextents unlimited
-- Create/Recreate indexes
create index IND_FLNST_AGNT_DOC on TAB_FLNDAT (DOCNUM)
tablespace A_IDX
pctfree 10
initrans 2
maxtrans 255
storage
initial 64K
next 1M
minextents 1
maxextents unlimited
create index IND_FLNST_AGNT_FLNMTH on TAB_FLNDAT (FLNMTH)
tablespace A_IDX
pctfree 10
initrans 2
maxtrans 255
storage
initial 64K
next 1M
minextents 1
maxextents unlimited
create bitmap index IND_FLNST_AREDEF on TAB_FLNDAT (AREA_DEF_ID)
tablespace A_IDX
pctfree 10
initrans 2
maxtrans 255
storage
initial 64K
next 1M
minextents 1
maxextents unlimited
create index IND_FLNST_FLNDATAKEY on TAB_FLNDAT (FLNDATAKEY)
tablespace A_IDX
pctfree 10
initrans 2
maxtrans 255
storage
initial 64K
next 1M
minextents 1
maxextents unlimited
create bitmap index IND_FLNST_INCPERIOD on TAB_FLNDAT (INC_PERIOD)
tablespace A_IDX
pctfree 10
initrans 2
maxtrans 255
storage
initial 64K
next 1M
minextents 1
maxextents unlimited
create index IND_FLNST_INC_ID on TAB_FLNDAT (INC_ID)
tablespace A_IDX
pctfree 10
initrans 2
maxtrans 255
storage
initial 64K
next 1M
minextents 1
maxextents unlimited
);Edited by: venkatraman.L on Mar 18, 2012 12:51 PM
Edited by: venkatraman.L on Mar 18, 2012 12:52 PMvenkatraman.L wrote:
yes if I use Quotes it is using index. It should be a numeric field.
Thanks Etbin. I was a little surprised by that. i thought oracle will always implicitly convert to the type of the column. But that happens only for insert/updates.
From the docs (http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements002.htm):
The following rules govern the direction in which Oracle Database makes implicit datatype conversions:
<li>During INSERT and UPDATE operations, Oracle converts the value to the datatype of the affected column.
<li>During SELECT FROM operations, Oracle converts the data from the column to the type of the target variable.
<li>When manipulating numeric values, Oracle usually adjusts precision and scale to allow for maximum capacity. In such cases, the numeric datatype resulting from such operations can differ from the numeric datatype found in the underlying tables.
<li>When comparing a character value with a numeric value, Oracle converts the character data to a numeric value.
<li>Conversions between character values or NUMBER values and floating-point number values can be inexact, because the character types and NUMBER use decimal precision to represent the numeric value, and the floating-point numbers use binary precision.
Rule 4 is what happened in your case. -
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 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 AMHello 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 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 picked up by the query
I am doing complex joining with multiple tables ..
table A has got 104M records other tables are having circa 100K records ...
Now I have created index on table A on a field which is being used in filter condition ... but when I analysing the explain plan of the query - I can see table A has been fully accessed - index is not being used.
Can anyone put some llight why it is happening ... Is it somthing to do with what I am selecting in the query ...You can search the forum for the same question and get other threads on this topic.
The short answer is that the index isn't being used because the optimizer decides that doing the full table scan (FTS) is more efficient - it may or may not be right. There are lots of factors that could make the cost-based optimizer (CBO) not use an index, but the more common ones are
* modifying a WHERE clause column value with ||, arithmetic, or a function (index supression)
* You're going to read all or most of the rows in the table anyway, so the index would not help (at least, the CBO might think so) -
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 DEVAs 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. -
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,
FrankThanks 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 -
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,
Jeffsince 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 -
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. -
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?
ThanksHi Andras
I would strongly recommend taking a 10053 trace and see what the CBO is up to.
Cheers
Richard Foote
http://richardfoote.wordpress.com/ -
Index not used for order by/subsequence
Hello,
I can't seem to get DBXML to efficiently return an ordered subsequence (so that a web page can do pagination in order). I have 100,000 entries in my test container and the following indexes:
Index: unique-node-metadata-equality-string for node {http://www.sleepycat.com/2002/dbxml}:name
Index: edge-element-equality-dateTime for node {}:when
Index: edge-element-equality-double for node {}:whenNumber
queryPlan "
for $x in (collection('test.dbxml')/root)
order by $x/whenNumber
return subsequence($x, 1, 10)
"Gives me a plan with a sequential scan in it:
<XQuery>
<Return>
<OrderByTuple direction="ascending" empty="least" stable="false" collation="http://www.w3.org/2005/xpath-functions/collation/codepoint">
<ForTuple uri="" name="x">
<ContextTuple/>
<QueryPlanToAST>
<StepQP axis="child" name="root" nodeType="element">
<SequentialScanQP container="test.dbxml" nodeType="document"/>
</StepQP>
</QueryPlanToAST>
</ForTuple>
<TreatAs>
<PromoteUntyped uri="http://www.w3.org/2001/XMLSchema" name="string">
<Atomize>
<QueryPlanToAST>
<StepQP axis="child" name="whenNumber" nodeType="element">
<VariableQP name="x"/>
</StepQP>
</QueryPlanToAST>
</Atomize>
</PromoteUntyped>
<SequenceType type="item()?"/>
</TreatAs>
</OrderByTuple>
<Function name="{http://www.w3.org/2005/xpath-functions}:subsequence">
<QueryPlanToAST>
<VariableQP name="x"/>
</QueryPlanToAST>
<NumericLiteral value="1.0E0" typeuri="http://www.w3.org/2001/XMLSchema" typename="double"/>
<NumericLiteral value="1.0E1" typeuri="http://www.w3.org/2001/XMLSchema" typename="double"/>
</Function>
</Return>
</XQuery>The index is used correctly if I do a conditional query as I woudl expectHi,
These look like queryplan generator issues. I'm looking into it. Thanks.
Best regards,
Rucong Zhao
Oracle Berkeley DB XML -
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,
Bobhttp://www.oracle-base.com/articles/10g/IndexMonitoring.php
Maybe you are looking for
-
Mailboxes STILL empty after importing from 10.3.9 to 10.4.11
Hi... I've been spending the last couple of days trawling the web (incl. this site) for solutions and have found similar postings, but they were either unresolved, or didn't really match my situation. So please excuse me if this is partially repetiti
-
Hi, I'm using JNDI (Java Native Directory Interface) accessing OID, and I received a javax.naming.OperationalNotSupportedException: [LDAP: error code 53 - Server currently in read only mode. Update operations not allowed]; I am not sure what's wrong
-
ACE 4710 and load balancing with sticky cookie
Configuring load balancing with SSL termination and stickiness for a couple of citrix xenapp servers. I'm doing a source-NAT as the ACE resides in the DMZ and these particular servers reside on the inside arm of the firewall. The ACE is in bridged
-
CL_RSR_RRK0_HIERARCHY error while using RRI
Hello all, I am trying to do RRi from one report to another. I have a tried the RRI thing with the infoobject and it works fine. But the object actually has Hierarchy which eventually the users will be usin. When I do the whole procedure same but now
-
Hi, this might very well be a silly beginner question. Can I do cross fades in Soundbooth with two audio files in the same track? It's possible to do so in Premiere Pro, I'm wondering why I can't find something like this in Soundbooth. Thanks!