2010-01-04 30 views
6

He encontrado en this article, que desde ORACLE 10g, hay una manera de hacer una sesión de conexión en particular comparar cadenas insensibles a mayúsculas y minúsculas, sin necesidad de funciones SQL locas, usando un ALTER SESSION.ORACLE 11g caso insensible por defecto

¿Alguien sabe si, en 11g, podría haber una manera de hacer que la base de datos funcione siempre en este modo por defecto para todas las sesiones de conexión nuevas, eliminando así la necesidad de ejecutar ALTER SESSION s cada vez que se conecta?

O tal vez, ¿un parámetro adicional que podría especificar en su cadena de conexión que activaría lo mismo?

Respuesta

6

Puede establecer simplemente los parámetros NLS_SORT, NLS_COMP mencionados en el artículo como los valores en el archivo de inicio de Oracle utilizando la cláusula alter system set <parameter> = <value>;.

Se puede encontrar información sobre el uso de los comandos del sistema alternativo here.

Aquí hay una buena link sobre el uso correcto de los parámetros NLS_*. Tenga en cuenta que algunas configuraciones del parámetro NLS_SORT pueden/podrían causar problemas de rendimiento, especialmente cuando no está configurado como BINARIO. El Oracle docs Estado:

Configuración NLS_SORT a otra que BINARIO nada provoca una especie de usar una exploración tabla completa, independientemente de la trayectoria elegido por el optimizador. BINARY es la excepción porque los índices son construidos según un orden binario de las claves . Por lo tanto, el optimizador puede usar un índice para satisfacer la cláusula ORDER BY cuando NLS_SORT se establece en BINARIO. Si NLS_SORT se establece en cualquier tipo de lenguaje , el optimizador debe incluir una exploración de tabla completa y una ordenación completa en el plan de ejecución .

+0

Mientras que la cita es de la documentación de Oracle, tampoco tiene sentido "independientemente de la ruta elegida por el optimizador". Una referencia más útil para esto es http://download.oracle.com/docs/cd/B19306_01/server.102/b14225/ch5lingsort.htm#sthref650 –

+1

El "buen enlace sobre el uso correcto de los parámetros NLS_ *" Le proporcioné en mi respuesta el mismo enlace e información que usted proporcionó, excepto que el enlace en mi respuesta proviene de la documentación 11g. –

+0

Estoy trabajando ahora con este problema y descubrí que para evitar problemas de rendimiento, se puede crear un índice de IC para la columna: crear índice index_name en table_name (NLSSORT (column_name, 'NLS_SORT = BINARY_CI')); [referencia] (http://geekzspot.blogspot.com.es/2010/01/case-insensitive-oracle-database.html) – Marc

3

¡Claro que sí!

Get Ur DBA amigable para establecer estos parametros:

alteraciones en el sistema SET = NLS_COMP ámbito lingüístico SPFILE;

ALTER SYSTEM SET NLS_SORT = BINARY_AI SCOPE SPFILE;

Esto está tomado de mi breve artículo sobre How to make Oracle Case Insensitive

+0

¿Qué pasa con la cita en la respuesta de RC? ¿Hará esto destruir por completo el rendimiento del sistema, como parece indicarlo? – eidylon

3

He intentado utilizar un logon trigger a emitir estos comandos para obtener mayúsculas y minúsculas consultas:

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

Y mientras que eso me dio CI, también me dio problemas de rendimiento increíblemente malos. Tenemos una tabla en particular que, sin esas configuraciones, las inserciones tardan 2 milisegundos. Con esas configuraciones en su lugar, las inserciones tomaron 3 segundos. Lo he confirmado creando y soltando el disparador varias veces.

No sé si hacerlo a nivel del sistema, a diferencia del nivel de sesión con un disparador, hace la diferencia o no.

+1

Eeks! ¡Ese es el horrible golpe de rendimiento! No puedo creer que ORACLE aún no haya agregado un mejor soporte para esto. Quiero decir, si buscas facturas, comentarios o notas o casi cualquier campo de texto común, realmente no te importa si alguien escribe "llevó al gato al veterinario" o "se llevó al gato al veterinario". – eidylon

+1

Después de reunirme con un consultor de Oracle ayer, descubrimos que el truco para usar estas dos configuraciones es que DEBE colocar índices funcionales en muchos lugares. En nuestro caso, usamos varchar2 (32) UUID para claves primarias. Debido a las dos configuraciones NSL, ninguno de los índices PK normales se usaba. Tuvimos que agregar índices como crear índice foo_ok en Person (nlssort (Id, 'NLS_SORT = BINARY_CI')); a todos nuestros PK. –

+1

¡Egads! Eso es mucho trabajo solo para tratar "The Twilight Zone" como lo mismo que "the twilight zone". – eidylon

0

¡Encontré el mismo problema de rendimiento con inserciones y nls en 11g r2! Afortunadamente para mí, el golpe de rendimiento no fue lo suficientemente significativo como para requerir un cambio de aplicación.

Si se puede hacer sin binary_ci para el inserto, a continuación, me gustaría hacer una sesión de alter justo antes de la inserción y después, por lo que no tiene que soltar el gatillo