2010-01-04 10 views
6

J'ai trouvé dans this article, que depuis ORACLE 10g, il y a un moyen de faire une chaîne de connexion-session de comparaison particulière insensible à la casse, sans avoir besoin de fonctions SQL folles, en utilisant ALTER SESSION. Est-ce que quelqu'un sait si, en 11g, il est possible de faire en sorte que la base de données fonctionne toujours dans ce mode par défaut pour toutes les nouvelles sessions de connexion, éliminant ainsi la nécessité d'exécuter ALTER SESSION chaque fois que vous vous connectez?ORACLE 11g case insensible par défaut

Ou peut-être, un paramètre supplémentaire que vous pourriez spécifier sur votre chaîne de connexion qui tournerait le même?

Répondre

6

Vous pouvez simplement définir les paramètres NLS_SORT, NLS_COMP mentionnés dans l'article en tant que valeurs dans le fichier init Oracle à l'aide de la clause alter system set <parameter> = <value>;.

Vous trouverez des informations sur l'utilisation des commandes alter system here.

Voici une bonne link sur l'utilisation correcte des paramètres NLS_*. Notez que certains paramètres du paramètre NLS_SORT peuvent/peuvent entraîner des problèmes de performances, notamment lorsqu'il n'est pas défini sur BINARY. L'état Oracle docs:

Réglage NLS_SORT à tout autre que BINARY une sorte d'utiliser un scan de table , quelle que soit la voie choisie par l'optimiseur. BINARY est l'exception car les index sont construit selon un ordre binaire de touches. Ainsi, l'optimiseur peut utiliser un index pour satisfaire la clause ORDER BY lorsque NLS_SORT est défini sur BINARY. Si NLS_SORT est défini sur un tri linguistique , l'optimiseur doit inclure une analyse de table complète et un tri complet dans le plan d'exécution .

+0

Bien que cette citation est de la documentation oracle, cela n'a également aucun sens "quel que soit le chemin choisi par l'optimiseur". Une référence plus utile pour cela est http://download.oracle.com/docs/cd/B19306_01/server.102/b14225/ch5lingsort.htm#sthref650 –

+1

Le "bon lien sur l'utilisation correcte des paramètres NLS_ *" J'ai fourni dans ma réponse le même lien et l'information que vous avez fournie sauf que le lien dans ma réponse provient de la documentation 11g. –

+0

Je travaille maintenant avec ce problème et j'ai trouvé que pour éviter les problèmes de performances, un index CI peut être créé pour la colonne: create index index_name sur table_name (NLSSORT (nom_colonne, 'NLS_SORT = BINARY_CI')); [référence] (http://geekzspot.blogspot.com.es/2010/01/case-insensitive-oracle-database.html) – Marc

3

Bien sûr, vous pouvez!

get ur convivial DBA pour définir ces paramaters:

SYSTEM SET ALTER NLS_COMP = LINGUISTIQUE CHAMP D'APPLICATION SPFILE;

ALTER SYSTÈME ENTRÉ NLS_SORT = BINARY_AI SCOPE SPFILE;

Ceci est tiré de mon article sur How to make Oracle Case Insensitive

+0

Qu'en est-il du devis dans la réponse de RC? Est-ce que cela va complètement détruire la performance du système, comme cela semble indiquer? – eidylon

3

J'ai essayé d'utiliser un logon trigger d'émettre ces commandes pour obtenir des requêtes sensibles à la casse:

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

Et alors que m'a donné CI, cela m'a aussi donné des problèmes de performance incroyablement mauvais. Nous avons une table en particulier qui, sans ces paramètres, les insertions prennent 2 millisecondes. Avec ces paramètres en place, les insertions ont pris 3 secondes. J'ai confirmé ceci en créant et en laissant tomber le déclencheur plusieurs fois. Je ne sais pas si le faire au niveau du système, par opposition au niveau de la session avec un déclencheur, fait une différence ou non.

+1

Eeks! C'est tout à fait le coup de performance horrible! Je ne peux pas croire que ORACLE n'a pas encore ajouté un meilleur support pour cela. Je veux dire, si vous recherchez des factures ou des commentaires ou des notes ou à peu près n'importe quel champ de texte commun, vous ne vous souciez vraiment pas si quelqu'un écrit «a pris le chat chez le vétérinaire» ou «a pris le chat chez le vétérinaire». – eidylon

+1

Après avoir rencontré un consultant Oracle hier, nous avons découvert que l'astuce à l'utilisation de ces deux paramètres est que vous devez mettre des index fonctionnels dans beaucoup d'endroits. Dans notre cas, nous utilisons des UUID varchar2 (32) pour les clés primaires. En raison des deux paramètres NSL, aucun des index PK normaux n'étaient utilisés. Nous devions ajouter des index comme create index foo_ok sur Person (nlssort (Id, 'NLS_SORT = BINARY_CI')); à tous nos PKs. –

+1

Egads! C'est beaucoup de travail juste pour traiter "The Twilight Zone" comme la même chose que "the twilight zone". – eidylon

0

J'ai trouvé le même problème de performance avec les insertions et nls dans 11g r2! Heureusement pour moi, le coup de performance n'était pas assez important et nécessitait un changement d'application.

Si vous pouvez faire sans binary_ci pour l'INSERT, alors je ferais une session alter juste avant l'insertion et par la suite, de sorte que vous ne devez pas laisser tomber le déclencheur