Database Case Insensitive: aggiornamenti

In seguito ad dei test scaturiti da un thread di discussione sul newsgroup comp.databases.oracle.server sono costretto a scrivere un post di aggiornamento di un vecchio post di dicembre.

Stamane ho verificato che in 10gR2 (10.2.0.2) la ricerca case insensitive funziona, ma non è in grado di usare gli indici, se li usa fa dei “INDEX FULL SCAN”, cioè non li usa come indici veri e propri. A dire il vero quello che non ho capito è perchè non funzioni neanche se uso un indice funzionale (create index idx on tablex (upper(field));).

Questo quindi mi porta ad essere più diffidente riguardo a questa implementazione delle ricerche “case insensitive” sul database.

P.S. Durante i miei test ho incontrato uno strano errore:
SQL> alter Session set nls_comp=linguistic;

Modificata sessione.

SQL> alter Session set nls_sort=binary_ci;

Modificata sessione.

SQL> exec dbms_stats.gather_table_stats(OWNNAME=>’GEOCALL’, –
tabname=>’AUTENTI’,CASCADE=>TRUE);
BEGIN dbms_stats.gather_table_stats(OWNNAME=>’GEOCALL’,
tabname=>’AUTENTI’,CASCADE=>TRUE); END;

*
ERRORE alla riga 1:
ORA-00979: non +¿ un’espressione GROUP BY
ORA-06512: a “SYS.DBMS_STATS”, line 13159
ORA-06512: a “SYS.DBMS_STATS”, line 13179
ORA-06512: a line 1

P.P.S.

La conclusione del discorso è che su una applicazione già esistente si riesce ad ottenere che le ricerche sulle stringhe siano “case insensitive” senza dover modificare l’applicazione, modificando le impostazioni del database (se 10gR2). Si tratta di un compromesso, perchè come visto le ricerche con il like non sono in grado di sfruttare gli indici e ciò potrebbe dare problemi di prestazioni. Se non si vogliono problemi allora l’unica soluzione seria è quella di usare Oracle Text, che è una delle caratteristiche delle Standard Edition, quindi è gratis.

P.P.P.S. (18-05-2007)

Alla fine della sezione “Using Linguistic Indexes” del manuale Oracle® Database Globalization Support Guide
10g Release 2 (10.2)
Part Number B14225-02

Si trova la nota:

Note:

The SQL functions MAX( ) and MIN( ), and also the LIKE operator, cannot use linguistic indexes when NLS_COMP is set to LINGUISTIC.

Un pensiero su “Database Case Insensitive: aggiornamenti

  1. Pingback: Oracle Globalization Support - Parte II « Oracle and other

Lascia un commento