Ricerche case insensitive su 10.2.0.3

venerdì 25 maggio 2007 alle 25:58 | Pubblicato su Diario, Installation and Configuration, Performance Tuning | 2 commenti

A 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%')


		

2 commenti »

RSS feed for comments on this post. TrackBack URI

  1. […] 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 […]

  2. […] post è un aggiornamento del post “Database case sensitive su 10.2.0.3“,  aggiornamento necessario, essendo il post risalente ad oltre sette anni fa. In realtà ho […]


Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

Crea un sito o un blog gratuitamente presso WordPress.com.
Entries e commenti feeds.

%d blogger cliccano Mi Piace per questo: