2010-01-04 19 views
6

Znalazłem w this article, że od ORACLE 10g istnieje sposób, aby uczynić określoną sesję połączenia porównywać ciągi znaków bez rozróżniania wielkości liter, bez potrzeby korzystania z żadnych szalonych funkcji SQL, używając ALTER SESSION.ORACLE 11g niewrażliwe na wielkość domyślnie

Czy ktoś wie, czy w 11g może istnieć sposób na to, aby baza danych zawsze działała w tym trybie domyślnie dla wszystkich nowych sesji połączeń, eliminując w ten sposób konieczność uruchamiania ALTER SESSION s przy każdym połączeniu?

A może, dodatkowy parametr, który można określić na ciąg połączenia, który by włączyć to samo?

Odpowiedz

6

Można ustawić parametry wymienione w artykule jako wartości w pliku init Oracle za pomocą klauzuli alter system set <parameter> = <value>;.

Informacje na temat korzystania z komend systemu alter można znaleźć here.

Oto dobry link na poprawne użycie parametrów NLS_*. Zauważ, że niektóre ustawienia parametru NLS_SORT mogą/mogą powodować problemy z wydajnością, a mianowicie, gdy nie jest ustawiona wartość BINARY. Wyrocznia docs stan:

Ustawianie NLS_SORT do niczego innego niż BINARY powoduje pewnego rodzaju korzystania skanowanie pełnym stole, niezależnie od wybranej ścieżki przez optymalizator. BINARY jest wyjątkiem, ponieważ indeksy to zbudowane zgodnie z kolejnością binarną klawiszy . Dlatego optymalizator może użyć indeksu , aby spełnić klauzulę ORDER BY , gdy NLS_SORT ma wartość BINARY. Jeśli NLS_SORT jest ustawiony na dowolny sortowanie językowe , optymalizator musi obejmować pełny przegląd tabeli i pełne sortowanie w planie wykonania .

+0

Mimo, że cytat z dokumentacji Oracle, nie ma sensu "niezależnie od ścieżki wybranej przez optymalizator". Bardziej użytecznym odnośnikiem do tego jest http://download.oracle.com/docs/cd/B19306_01/server.102/b14225/ch5lingsort.htm#sthref650 –

+1

"Dobry link do prawidłowego użycia parametrów NLS_ *" W mojej odpowiedzi podałem ten sam link i informacje, które podałeś, z wyjątkiem tego, że link w mojej odpowiedzi pochodzi z dokumentacji 11g. –

+0

Pracuję teraz z tym problemem i stwierdziłem, że aby uniknąć problemów z wydajnością, można utworzyć indeks CI dla kolumny: create index nazwa_indeksu na table_name (NLSSORT (column_name, 'NLS_SORT = BINARY_CI')); [odniesienie] (http://geekzspot.blogspot.com.es/2010/01/case-insensitive-oracle-database.html) – Marc

3

Na pewno możesz!

Get ur przyjazną DBA, aby ustawić te paramaters:

ALTER SYSTEM SET NLS_COMP = JĘZYKOWE ZAKRES SPFILE;

ZMIANA USTAWIENIA SYSTEMU NLS_SORT = BINARY_AI ZAKRES SPFIL;

To jest wzięte z mojego krótkiego artykułu na How to make Oracle Case Insensitive

+0

A co z cytatem z odpowiedzi RC. Czy to całkowicie zniszczy działanie systemu, jak mogłoby się wydawać? – eidylon

3

Próbowałem przy użyciu logon trigger do wydawania tych poleceń, aby uzyskać case-niewrażliwy zapytania:

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

I chociaż, że nie da mi CI, Dało mi to również niewiarygodne problemy z wydajnością. Mamy jedną tabelę w szczególności, że bez tych ustawień wstawki zajmują 2 milisekundy. Po wprowadzeniu tych ustawień wstawki zajęły 3 sekund. Potwierdziłem to, tworząc i upuszczając spust wielokrotnie.

Nie wiem, czy robi to na poziomie systemu, w przeciwieństwie do poziomu sesji z wyzwalaczem, robi różnicę, czy nie.

+1

Eeks! To jest straszne uderzenie wydajności! Nie mogę uwierzyć, że ORACLE nie dodał jeszcze lepszego wsparcia. Chodzi mi o to, że jeśli szukasz faktur, komentarzy lub notatek lub prawie każdego zwykłego pola tekstowego, naprawdę nie obchodzi cię, czy ktoś pisze "zabrał kota do weterynarza" lub "Wziął kota do weterynarza". – eidylon

+1

Po spotkaniu z konsultantem Oracle wczoraj odkryliśmy, że sztuczka polegająca na używaniu tych dwóch ustawień jest taka, że ​​MUSISZ umieścić funkcjonalne indeksy w wielu miejscach. W naszym przypadku dla kluczy podstawowych używamy vUrch2 (32) UUID. Ze względu na dwa ustawienia NSL żaden z normalnych indeksów PK nie był używany. Musieliśmy dodać indeksy takie jak utworzyć indeks foo_ok na Person (nlssort (Id, 'NLS_SORT = BINARY_CI')); do wszystkich naszych PK. –

+1

Egady! To dużo pracy, aby potraktować "Strefę mroku" jako to samo, co "strefa zmierzchu". – eidylon

0

Znalazłem ten sam problem z wydajnością z insertami i nls w 11g r2! Na szczęście dla mnie wydajność nie była wystarczająco znacząca, co wymagało zmiany aplikacji.

Jeśli można zrobić bez binary_ci dla INSERT, to chciałbym zrobić sesję alter tuż przed wkładki i później, więc nie trzeba spadać spust

Powiązane problemy