Я создал текстовый индекс Oracle, как показано ниже:
create index my_idx on my_table (text) indextype is ctxsys.context;
И тогда я могу сделать следующее:
select * from my_table where contains(text, '%blah%') > 0;
Но допустим, у нас есть еще один столбец в этой таблице, скажем, group_id
, и я хотел вместо этого сделать следующий запрос:
select * from my_table where contains(text, '%blah%') > 0 and group_id = 43;
С указанным выше индексом Oracle придется искать все элементы, содержащие 'blah'
, а затем проверять все их group_id
s.
В идеале, я бы предпочел искать только элементы с group_id = 43
, поэтому я хотел бы иметь такой индекс:
create index my_idx on my_table (group_id, text) indextype is ctxsys.context;
Вроде как обычный индекс, поэтому для каждого group_id
.
может быть выполнен отдельный текстовый поиск.
Есть ли способ сделать что-то подобное в Oracle (я использую 10g, если это важно)?
Редактировать (уточнение)
Рассмотрим таблицу с одним миллионом строк и следующими двумя столбцами, A
и B
, оба числовые. Допустим, существует 500 различных значений A
и 2000 различных значений B
, и каждая строка уникальна.
Теперь давайте рассмотрим select ... where A = x and B = y
Индекс по A
и B
отдельно, насколько я могу судить, выполнить поиск по индексу по B
, который вернет 500 различных строк, а затем выполнить объединение / сканирование этих строк. В любом случае необходимо просмотреть не менее 500 строк (за исключением случая, когда база данных везет и рано находит нужную строку.
Хотя индекс на (A,B)
гораздо эффективнее, он находит одну строку в одном поиске по индексу.
Помещение отдельных индексов в group_id
, и текст, который я чувствую, оставляет генератор запросов только с двумя вариантами.
(1) Используйте индекс group_id
и отсканируйте все полученные строки для текста.
(2) Используйте текстовый индекс и отсканируйте все полученные строки на предмет group_id
.
(3) Используйте оба индекса и сделайте соединение.
Тогда как я хочу:
(4) Используйте индекс (group_id, "text")
, чтобы найти текстовый индекс под конкретным group_id
и отсканируйте этот текстовый индекс для конкретной строки / строк, которые мне нужны. Сканирование, проверка или присоединение не требуются, как при использовании индекса для (A,B)
.