ORACLE 11g по умолчанию нечувствителен к регистру

В этой статье я обнаружил, что начиная с ORACLE 10g, есть способ сделать конкретную сессию соединения, сравнивая строки без учета регистра, без каких-либо сумасшедших функций SQL, используя ALTER SESSION.

Кто-нибудь знает, может ли в 11g быть способ заставить базу данных всегда работать в этом режиме по умолчанию для всех новых сеансов подключения, тем самым устраняя необходимость запуска ALTER SESSION при каждом подключении?

Или, возможно, дополнительный параметр, который вы могли бы указать в строке подключения, чтобы включить то же самое?


person eidylon    schedule 04.01.2010    source источник


Ответы (4)


Вы можете просто установить параметры NLS_SORT, NLS_COMP, упомянутые в статье, в качестве значений в файле инициализации Oracle, используя предложение alter system set <parameter> = <value>;.

Информацию об использовании команд alter system можно найти здесь. .

Вот хорошая ссылка на правильное использование из NLS_* параметров. Обратите внимание, что некоторые настройки параметра NLS_SORT могут вызвать проблемы с производительностью, а именно, если для него не задано значение BINARY. В документах Oracle указано:

Установка для NLS_SORT любого значения, кроме BINARY, приводит к тому, что сортировка использует полное сканирование таблицы, независимо от пути, выбранного оптимизатором. BINARY является исключением, поскольку индексы строятся в соответствии с двоичным порядком ключей. Таким образом, оптимизатор может использовать индекс для выполнения условия ORDER BY, когда для NLS_SORT установлено значение BINARY. Если для NLS_SORT задана любая лингвистическая сортировка, оптимизатор должен включить в план выполнения полное сканирование таблицы и полную сортировку.

person RC.    schedule 04.01.2010
comment
Хотя эта цитата взята из документации оракула, она также не имеет смысла независимо от пути, выбранного оптимизатором. Более полезным справочником для этого является download.oracle .com/docs/cd/B19306_01/server.102/b14225/ - person Gary Myers; 05.01.2010
comment
Хорошая ссылка на правильное использование параметров NLS_ *, которую я предоставил в своем ответе, — это та же ссылка и информация, которые вы предоставили, за исключением того, что ссылка в моем ответе взята из документации 11g. - person RC.; 05.01.2010
comment
Сейчас я работаю над этой проблемой и обнаружил, что во избежание проблем с производительностью для столбца можно создать индекс CI: создать индекс index_name для table_name (NLSSORT (column_name, 'NLS_SORT=BINARY_CI') ); ссылка - person Marc; 10.04.2013

Что вы можете!

Попросите вашего дружественного администратора баз данных установить эти параметры:

ALTER SYSTEM SET NLS_COMP=LINGUISTIC SCOPE=SPFILE; 

ALTER SYSTEM SET NLS_SORT=BINARY_AI SCOPE=SPFILE; 

Это взято из моей короткой статьи о Как сделать Oracle нечувствительным к регистру

person geekzspot    schedule 03.02.2010
comment
Как насчет цитаты в ответе RC. Не приведет ли это к полному разрушению производительности системы, как это может показаться? - person eidylon; 02.03.2010

Я попытался использовать logon trigger для выполнения этих команд, чтобы получить запросы без учета регистра:

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

И хотя это дало мне CI, это также дало мне невероятно плохие проблемы с производительностью. В частности, у нас есть одна таблица, в которой без этих настроек вставка занимает 2 миллисекунды. С этими настройками вставка заняла 3 секунды. Я подтвердил это, создав и сбросив триггер несколько раз.

Я не знаю, имеет ли значение выполнение этого на системном уровне, в отличие от уровня сеанса с триггером, или нет.

person Joey Gibson    schedule 11.07.2011
comment
Экс! Это просто ужасный хит производительности! Я не могу поверить, что ORACLE еще не добавил лучшую поддержку для этого. Я имею в виду, что если вы ищете счета-фактуры, комментарии, заметки или почти любое обычное текстовое поле, вам действительно все равно, пишет ли кто-то «отвез кошку к ветеринару» или «отвез кошку к ветеринару». - person eidylon; 11.07.2011
comment
После вчерашней встречи с консультантом Oracle мы обнаружили, что хитрость использования этих двух настроек заключается в том, что вы ДОЛЖНЫ размещать функциональные индексы во многих местах. В нашем случае мы используем UUID varchar2(32) для первичных ключей. Из-за двух настроек NSL ни один из обычных индексов PK не использовался. Нам пришлось добавить индексы, такие как создание индекса foo_ok on Person(nlssort(Id, 'NLS_SORT=BINARY_CI')); всем нашим ПК. - person Joey Gibson; 12.07.2011
comment
Ебать! Слишком много работы, чтобы относиться к «Сумеречной зоне» так же, как и к сумеречной зоне. - person eidylon; 13.07.2011
comment
думаю, ORACLE все еще практически застрял в мире хранения всего в верхнем регистре. - person eidylon; 13.07.2011

Я обнаружил ту же проблему с производительностью со вставками и nls в 11g r2! К счастью для меня, падение производительности было недостаточно значительным, требующим изменения приложения.

Если вы можете обойтись без binary_ci для INSERT, то я бы выполнил сеанс alter непосредственно перед вставкой и после нее, чтобы вам не пришлось сбрасывать триггер.

person ojock    schedule 09.08.2013