Мой фон базы данных находится на стороне MS SQL Server, где при сравнении текста в индексах и ограничениях регистр не учитывается (по крайней мере, по умолчанию).Поэтому, если у вас есть значение «abc», присвоенное уникальному столбцу, вы не можете сохранить второе значение «ABC», и если вы ищете «ABC», SQL Server найдет «abc».
С вещами Oracleотличаются, поэтому даже с уникальным индексом в текстовом столбце вы можете хранить там и «abc», и «ABC», и если вы будете искать «AbC», вы не получите никакого результата.
AFAIK доOracle 10gR2 не было никакого способа обойти это, теперь можно установить нечувствительное сравнение для каждой сессии, что, IMHO, не очень хорошее решение, потому что все зависит от дисциплины программистов.
Но что хуже всего при поиске с учетом регистра, так этокоторый переписывает все поиски как UPPER(some_column)=UPPER(some_text)
(и это то, что рекомендуют многие дискуссионные потоки), заканчивает сканирование таблицы, даже если для some_column есть индекс.Снижение производительности является катастрофическим: я только что проверил простой поиск в таблице с полмиллиона строк, и поиск с вызовом функции UPPER занял в 20 раз больше времени, чем поиск с использованием только идентификатора столбца, что подтверждает, что индекс не используется при выполнении функциипоиск на основе.
Действительно ли так, что наиболее стандартным методом для поиска без учета регистра в базе данных Oracle является применение функций UPPER / LOWER к элементам поиска, несмотря на плохую производительность?Или есть более элегантные способы решения этой проблемы?