Oracle 域索引和排序

Oracle Domain index and sorting

由于 "order by",以下查询执行得非常差。我的目标是仅获取结果集的一小部分(例如,使用 ROWNUM)。但是,当我添加 "order by" 时,它会遍历整个结果集,为每条记录执行索引查找,这使得它非常慢。如果不排序,当我将结果集限制为例如 1000 条记录时,查询速度大约快 100 倍。

查询:

SELECT text_field 
 from mytable where 
 contains(text_field,'ABC', 1)>0 
 order by another_field;

这就是我创建索引的方式:

CREATE INDEX myindex ON mytable (text_field) INDEXTYPE IS ctxsys.context FILTER BY another_field

执行计划:

---------------------------------------------------------------
| Id  | Operation                    | Name                   |
---------------------------------------------------------------
|   0 | SELECT STATEMENT             |                        |
|   1 |  SORT ORDER BY               |                        |
|   2 |   TABLE ACCESS BY INDEX ROWID| MYTABLE                |
|*  3 |    DOMAIN INDEX              | MYINDEX                |
---------------------------------------------------------------

我也用 CTXCAT 代替 CONTEXT,但没有任何改进。我认为问题是,当我想要对结果进行排序(仅前 1000 个)时,它会对 "entire" 结果集中的每条记录执行索引查找。有没有办法避免这种情况?

谢谢。

要在 rownum 过滤器之前应用排序,您需要使用内联视图:

SELECT text_file
from (
 SELECT text_field 
  from mytable where 
  contains(text_field,'ABC', 1)>0 
  order by another_field
)
where rownum <= 1000;

有了索引,Oracle 应该对其进行优化以尽可能减少工作量。你应该看到计划中的 'sort order by stopkey' 和 'count stopkey' 步骤,这是 Oracle 很聪明,知道它只需要从索引中获取 1000 个值。

如果您不使用内联视图,而只是将 rownum 添加到您的原始查询中,它仍会对其进行优化,但正如您所说,它将随机排序前 1000 个(或不确定,无论如何) ) 它找到的行,因为它执行的操作顺序。