Oracle - Как я создаю индексы, которые будут использоваться когда NLS_COMP=Linguistic и NLS_Sort=Binary_CI

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

Примечание, что это должно быть сделано с некоторой осторожностью. Один пример, который я имел, был то, что разработчик написал некоторый регистрирующийся код в цикле. После нескольких месяцев ошибка в системе инициировала этот код. К сожалению, приложение находилось в том цикле, регистрируя ту же ошибку много раз. Мы прибыли в офис тем утром, чтобы быть информированными, что наш почтовый сервер отказал после того, как наша платформа журналирования послала 40 000 электронных писем между часами 4:00 и 8:00!

5
задан OMG Ponies 4 September 2009 в 15:51
поделиться

1 ответ

Я воспроизвел ваше открытие в своей тестовой БД (10.2.0.3). После расследования выяснилось, что оператор LIKE не может использовать лингвистический индекс - из документации 10gR2 :

SQL-функции MAX () и MIN (), а также оператор LIKE, не может использовать лингвистические индексы, когда NLS_COMP установлен на LINGUISTIC.

Кажется, основная цель лингвистических индексов - улучшить операцию SORT.

Если ваша цель - поиск в этом столбце без учета регистра, я предлагаю вам создать индекс на ] UPPER (имя) и вместо этого создайте запрос, используя UPPER (имя) LIKE UPPER ('x%') .

Если вы хотите использовать другой (более сложный) лингвистический параметр, вы может захотеть взглянуть на индексы Oracle Text .

Изменить: Есть другой обходной путь: вы можете заменить LIKE 'ABC%' на:

SQL> select * from x where name >= 'ABC' and name < 'ABD';

Execution Plan
----------------------------------------------------------
Plan hash value: 708878862

--------------------------------------------------------------------------------
| Id  | Operation                   | Name | Rows  | Bytes | Cost (%CPU)| Time  
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |      |     1 |    24 |     4   (0)| 00:00:
|   1 |  TABLE ACCESS BY INDEX ROWID| X    |     1 |    24 |     4   (0)| 00:00:
|*  2 |   INDEX RANGE SCAN          | X_IC |     1 |       |     3   (0)| 00:00:
--------------------------------------------------------------------------------

As вы можете увидеть, сможете ли вы преобразовать выражение LIKE в выражение с помощью операторов сравнения (> и <), можно ли использовать лингвистический индекс.

1
ответ дан 15 December 2019 в 06:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: