Я создал текстовый индекс 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
.
В идеале я бы предпочел найти только предметы с Group_id = 43
, так что я d Хотите такой индекс:
create index my_idx on my_table (group_id, text) indextype is ctxsys.context;
Вид как нормальный индекс, поэтому отдельный текстовый поиск может быть сделан для каждого group_id
.
Есть ли способ сделать что-то вроде этого в Oracle ( Я использую 10G, если это важно)?
Редактирование (разъяснение)
Рассмотрим таблицу с одним миллионом строк и следующие два столбца среди прочего, A
и B
, оба числовые. Позволяет сказать, что есть 500 разных Аренда ценностей A
и 2000 различных значений b
, и каждая строка уникальна.
Теперь давайте рассмотрим Выбрать ... где a = x и 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)
.