Как сделать предложение WHERE нечувствительным к регистру: из SQL Server запрашивает связанный сервер Oracle - PullRequest
1 голос
/ 07 сентября 2011

У нас есть MS SQL Server 2005 , который подключается к базе данных Oracle через соединение с сервером .

Много SELECTоператоры выполняются через серию OPENQUERY() команд.Предложение WHERE в большинстве этих операторов относится к столбцам VARCHAR.

Я слышал, что если предложение WHERE чувствительно к регистру, оно может сильно повлиять на производительность.

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

Ответы [ 5 ]

4 голосов
/ 09 сентября 2011

По умолчанию SQL-сервер использует сортировку без учета регистра, где Oracle по умолчанию учитывает регистр.Для поисковых запросов мы обычно реализуем сравнение Upper (), чтобы гарантировать, что пользователь имеет лучший опыт поиска.

2 голосов
/ 07 сентября 2011

На самом деле все наоборот:

Чувствительно к регистру ...

WHERE column = :criteria

... будет напрямую использовать индекс для column и работать хорошо.

Чувствительность к регистру обычно требует чего-то вроде этого ...

WHERE UPPER(column) = UPPER(:criteria)

... который не использует индекс для column и работает плохо (если вы не осторожны и не создаете функциональный индекс для UPPER(column)).

Я не уверен, что OPENQUERY() что-то меняет, но с чисто Oracle-точки зрения и чувствительные к регистру, и нечувствительные запросы могут быть выполнены с помощьюнечувствительные, требующие особого ухода (функциональный индекс).

1 голос
/ 07 сентября 2011

Я слышал, что если предложение WHERE чувствительно к регистру, оно может сильно повлиять на производительность.

Откуда ты это услышал? Для меня это звучит как миф ... скорее, это было бы иначе, то есть если бы вы использовали что-то вроде WHERE lower(field) = 'some str' для сравнения без учета регистра, это было бы плохо для производительности. Использование сортировки без учета регистра, вероятно, будет значительно быстрее ...

Еще один важный момент, который следует учитывать, - позволяют ли ваши бизнес-правила проводить сравнение без учета регистра.

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

0 голосов
/ 01 ноября 2018
WHERE LOWER(field_name) = 'field_value'
0 голосов
/ 29 мая 2017

Чтобы сделать WHERE clause регистронезависимым, вы можете использовать LOWER или UPPER для этой цели.

 select * from Table_Name
 where  lower(Column_Name) = lower('mY Any Value')

ИЛИ

select * from Table_Name
where  UPPER(Column_Name) = UPPER('mY Any Value')
...