Ricerche case insensitive su 10.2.0.3
Venerdì 25 Maggio 2007 at 25:58 | In Diario, Installation and Configuration, Performance Tuning | 1 CommentA quanto pare l’altro giorno facendo dei test sulle possibilità di ricerche “case insensitive” su un installazione Oracle 10.2.0.2 sul Linux Suse EL 64 bit sono incappato in un baco. A causa della confusione mentale del momento non c’ho badato, ma oggi andando a vedere quante patch fossero uscite per la versione 10.2.0.3 in testa ho trovato la patch 5252496 “WRONG RESULT WHEN USING OPTIMIZER_MODE=FIRST_ROWS, LIKE OPERATOR AND CI SORT”.
Pare che in queste condizioni:
- optimizer_mode=first_rows
- LIKE operator is used
- case-insensitive sort by setting NLS_COMP=LINGUISTIC and NLS_SORT=BINARY_CI
Le query diano risultati sbagliati.
Ho provato a fare un mio testcase diverso da quello riportato da oracle ed in verità nel mio caso non ho riscontrato l’anomalia. Nella nota riportano che il problema è che nel piano di esecuzione c’è una access path sbagliato:
2 – access(“C2″ LIKE ‘a%’)
Un’altro testcase che funziona è:
drop table t1;
CREATE TABLE t1 (c1 NUMBER, c2 VARCHAR2(10),CONSTRAINT pk_t1 PRIMARY KEY (c1));
CREATE UNIQUE INDEX t1_idx1 ON t1 (c2);
insert into t1 values (1,’A');
alter session set NLS_COMP=LINGUISTIC;
alter session set NLS_SORT=BINARY_CI;
alter session set “_index_join_enabled”=true;
alter session set optimizer_mode=first_rows;
select c1 from t1 where c2 like ‘a%’;
alter session set “_index_join_enabled”=false;
select c1 from t1 where c2 like ‘a%’;
In questo caso il comportamento viene riprodotto un piano di esecuzione per me particolare:
Nessuna riga selezionata
Piano di esecuzione
----------------------------------------------------------
Plan hash value: 3027291352
-------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 20 | 35 (0)| 00:00:01 |
|* 1 | VIEW | index$_join$_001 | 1 | 20 | 35 (0)| 00:00:01 |
|* 2 | HASH JOIN | | | | | |
|* 3 | INDEX RANGE SCAN | T1_IDX1 | 1 | 20 | 3 (34)| 00:00:01 |
| 4 | INDEX FAST FULL SCAN| PK_T1 | 1 | 20 | 33 (0)| 00:00:01 |
-------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("C2" LIKE 'a%')
2 - access(ROWID=ROWID)
3 - access("C2" LIKE 'a%')
1 Commento »
RSS feed dei commenti a questo articolo. TrackBack URI
Lascia un commento
Blog su WordPress.com. | Theme: Pool by Borja Fernandez.
Entries and comments feeds.


Read Translated version of this blog
[...] fa ho affrontato il tema delle ricerche “case insensitive” in oracle (qui e qui) , ovvero le ricerche su stringhe senza distinzione tra maiuscole e minuscole. Come ebbi modo di [...]
Pingback di Oracle Globalization Support - Parte II « Oracle and other — Martedì 15 Luglio 2008 #