Я создал индекс 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)
.