Я создал индекс Oracle Text следующим образом:
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).