我创建了一个 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)?
编辑(澄清)
考虑一个有 100 万行和以下两列的表,A
以及B
,都是数字。假设有 500 个不同的值A
和 2000 个不同的值B
,并且每一行都是唯一的。
现在让我们考虑select ... where A = x and B = y
据我所知,一个单独的索引在 上A
进行索引搜索,这将返回 500 个不同的行,然后对这些行进行连接/扫描。在任何情况下,至少要查看 500 行(除了数据库很幸运并尽早找到所需的行。B
B
虽然索引(A,B)
更有效,但它会在一次索引搜索中找到一行。
放置单独的索引group_id
和我认为的文本只会给查询生成器留下两个选项。
(1) 使用group_id
索引,并扫描所有结果行中的文本。
(2) 使用文本索引,并扫描所有结果行以查找group_id
.
(3) 使用两个索引,并进行连接。
而我想要:
(4) 使用(group_id, "text")
索引查找特定下的文本索引,group_id
并扫描该文本索引以查找我需要的特定行/行。不需要扫描和检查或加入,就像在(A,B)
.