2010-01-04 14 views
6

Ho trovato in this article, che da ORACLE 10g, esiste un modo per rendere una connessione-sessione particolare confronta le stringhe senza distinzione tra maiuscole e minuscole, senza richiedere alcuna funzione SQL pazzesca, utilizzando un ALTER SESSION.ORACLE 11g senza distinzione tra maiuscole e minuscole per default

Qualcuno sa se, in 11g, potrebbe esserci un modo per far funzionare sempre il database in questa modalità per impostazione predefinita per tutte le nuove sessioni di connessione, eliminando così la necessità di eseguire ALTER SESSION s ogni volta che ci si connette?

O forse un parametro aggiuntivo che potresti specificare sulla stringa di connessione su cui girerà lo stesso?

risposta

6

È possibile impostare solo i parametri NLS_SORT, NLS_COMP menzionati nell'articolo come valori nel file di inizializzazione Oracle utilizzando la clausola alter system set <parameter> = <value>;.

Le informazioni sull'utilizzo dei comandi di alter sistema sono disponibili here.

Ecco un buon link sull'uso corretto dei parametri NLS_*. Si noti che alcune impostazioni del parametro NLS_SORT possono/potrebbero causare problemi di prestazioni, ovvero quando non è impostato su BINARY. The Oracle docs Stato:

Impostazione NLS_SORT a qualcosa di diverso rispetto BINARIO provoca una sorta di utilizzare una scansione tavolo pieno, indipendentemente dal percorso scelto dal ottimizzatore. BINARY è l'eccezione perché gli indici sono costruiti in base a un ordine binario di chiavi . Pertanto, l'ottimizzatore può utilizzare un indice per soddisfare la clausola ORDER BY quando NLS_SORT è impostato su BINARY. Se NLS_SORT è impostato su qualsiasi ordinamento linguistico , l'ottimizzatore deve includere una scansione completa della tabella e un ordinamento completo nel piano di esecuzione .

+0

Mentre quella citazione è dalla documentazione di Oracle, inoltre non ha senso "indipendentemente dal percorso scelto dall'ottimizzatore". Un riferimento più utile per questo è http://download.oracle.com/docs/cd/B19306_01/server.102/b14225/ch5lingsort.htm#sthref650 –

+1

Il "link valido sull'uso corretto dei parametri NLS_ *" Ho fornito nella mia risposta lo stesso link e le informazioni fornite, tranne che il link nella mia risposta proviene dalla documentazione 11g. –

+0

Attualmente sto lavorando con questo problema e ho scoperto che per evitare problemi di prestazioni, è possibile creare un indice CI per la colonna: create index_name su table_name (NLSSORT (column_name, 'NLS_SORT = BINARY_CI')); [riferimento] (http://geekzspot.blogspot.com.es/2010/01/case-insensitive-oracle-database.html) – Marc

3

Certo che puoi!

Get Ur DBA amichevole per impostare questi paramaters:

ALTER SYSTEM SET NLS_COMP = AMBITO LINGUISTICO SPFILE;

SET DI SISTEMA ALTER NLS_SORT = BINARY_AI SCOPE SPFILE;

Questo è preso dal mio breve articolo su How to make Oracle Case Insensitive

+0

E riguardo la citazione nella risposta di RC. Far questo distruggerà completamente le prestazioni del sistema, come sembrerebbe indicarlo? – eidylon

3

Ho provato ad utilizzare un logon trigger di emettere questi comandi per ottenere le query case-insensitive:

execute immediate 'alter session set NLS_SORT=BINARY_CI'; 
execute immediate 'alter session set NLS_COMP=LINGUISTIC'; 

E mentre che mi ha dato CI, mi ha anche dato problemi di prestazioni incredibilmente cattivi. In particolare abbiamo una tabella che, senza quelle impostazioni, gli inserti richiedono 2 millisecondi. Con queste impostazioni in atto, gli inserti sono voluti 3 secondi. Ho confermato questo creando e rilasciando il trigger più volte.

Non so se farlo a livello di sistema, in contrapposizione al livello di sessione con un trigger, fa la differenza o no.

+1

Eeks! Questo è piuttosto l'orribile successo in termini di prestazioni! Non posso credere che ORACLE non abbia ancora aggiunto un supporto migliore per questo. Voglio dire, se stai cercando fatture o commenti o note o praticamente qualsiasi campo di testo comune a te non importa se qualcuno scrive "ha portato il gatto dal veterinario" o "ha portato il gatto dal veterinario". – eidylon

+1

Dopo essersi incontrati ieri con un consulente Oracle, abbiamo scoperto che il trucco per usare queste due impostazioni è che DEVI mettere gli indici funzionali in molti posti. Nel nostro caso, utilizziamo gli UUID varchar2 (32) per le chiavi primarie. A causa delle due impostazioni NSL, nessuno dei normali indici PK veniva utilizzato. Abbiamo dovuto aggiungere indici come creare l'indice foo_ok su Person (nlssort (Id, 'NLS_SORT = BINARY_CI')); a tutti i nostri PK. –

+1

Egads! È molto lavoro solo per trattare "The Twilight Zone" come la stessa cosa di "the twilight zone". – eidylon

0

Ho trovato lo stesso problema di prestazioni con inserts e nls in 11g r2! Fortunatamente per me il successo in termini di prestazioni non è stato abbastanza significativo da richiedere un cambio di app.

Se si può fare a meno binary_ci per l'inserto, quindi vorrei fare una sessione di alter poco prima l'inserto e in seguito, in modo da non dover abbandonare il grilletto

Problemi correlati