|
Сравнение строк в Oracle
|
|||
---|---|---|---|
#18+
Я в Oracle новичек и мне хотелось бы понять, как в Oracle сравниваются строки? Точнее - можно ли выполнять сравнения нечувствительные к регистру строки? Например, чтобы условие Where MyColumn Like 'SM%' находило как SMITH, так и Smith или smith - в SQL Server'е с этим никаких проблем нет. Понятно, что можно испрользовать UPPER - например, Where UPPER(MyColumn) Like 'SM%', но совершенно не понятно как Oracle при этом индексы будет использовать - SQL Server, скорее всего, индекс в такой ситуации использовать не стал бы. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2002, 17:06 |
|
Сравнение строк в Oracle
|
|||
---|---|---|---|
#18+
Если оракл 7.х, то только заводить в таблице дополнительное поле и в нем дублировать значение нужного текстового поля в верхнем регистре (например через триггер) м уже на это поле создават индекс и отбор делать по этому полю. Если 8.1.х, то можно использовать такую примочку: индекс по функции, т.е. при создании индекса указываешбь не столбец, а какое-то функциональное выражение, например upper(column), тогда будет использовать этот индекс. Пробуй. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2002, 06:18 |
|
Сравнение строк в Oracle
|
|||
---|---|---|---|
#18+
2 mmoroz Делал я этот индекс (Function Based Index) на UPPER(столбец) У нас справочники от нескольких записей до 10 тысяч записей, так вот на любом из них оптимизатор не подхватывает этот индекс а делает полный просмотр(8i у нас) - а если насильно хинтами заставить его (индекс) использовать, то по времени медленнее раз в 5 (set timing on так говорит, а не мои ощущения) Причина думаю в том, что Оракл держит в памяти данные после первого прочтения и при несильной загрузке ( у нас параллельно несколько десятков пользователей и несколько из них делают select update 100 мб таблицы, а остальные вообще ерундой занимаються с точки зрения объема ввода/вывода) ему проще полный просмотр делать. 2 Александр можете конечно попробовать эти индексы, но не забудьте поправить 2 параметра инициализации в конфигурационном файле, не помню акие. спросите - поищу, но я бы не советовал, если конечно у Вас другие проблемы (гиговые таблицы или еще чего там чего не знаю) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2002, 07:07 |
|
Сравнение строк в Oracle
|
|||
---|---|---|---|
#18+
2 Александр можете конечно попробовать эти индексы, но не забудьте поправить 2 параметра инициализации в конфигурационном файле, не помню акие. спросите - поищу, но я бы не советовал, если конечно у Вас другие проблемы (гиговые таблицы или еще чего там чего не знаю) ------------------------------------- Так проблема-то довольно типичная - люди вводят какие-то данные, как они их вводят часто неизвестно - как же поиск осуществлять? Что-то можно налету в UPPER case преобразовать, но что-то ведь и нельзя? Честно говоря, никак не ожидал такой проблемы... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2002, 08:56 |
|
Сравнение строк в Oracle
|
|||
---|---|---|---|
#18+
Что бы этот индекс подхватывался надо -прописать параметры инициализации (по моему query_rewrite_enabled=true и еще там что то) -установить стоимостную оптимизацию -правильно написать запрос (where upper(column)= или < или >'qqq' -это подключит индекс, а where upper(column) like('%qqq%'), а это уже без индекса. В последнем случае будет всегда полное сканирование и индекс никакого выигрыша не даст) Что касается индексов на базе функции, то их завели для того, чтобы люди не городили дополнительные колонки с расчитываемыми значениями. А по времени работает столько же сколько и с дополнительными колонками. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2002, 09:07 |
|
|
start [/forum/topic.php?fid=52&fpage=2849&tid=1993392]: |
0ms |
get settings: |
12ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
33ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
44ms |
get tp. blocked users: |
2ms |
others: | 295ms |
total: | 421ms |
0 / 0 |