【问题标题】:Oracle Domain index and sortingOracle 域索引和排序
【发布时间】:2015-01-25 21:28:46
【问题描述】:

由于“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 个)时,它会为“整个”结果集中的每条记录执行索引查找。有没有办法避免这种情况?

谢谢。

【问题讨论】:

  • 抱歉,上面文本中执行计划部分的格式似乎有问题。
  • 是检索所有数据快 100 倍,还是仅检索第一批/页的结果?当然不能帮助您调整它的顺序,但可能有助于理解差异。
  • 只是结果的第一页。但是,当我使用排序时,它会遍历所有结果,即使我只请求第一页,这也是让它变慢的原因。因此,我试图找到一种创建索引的方法,以便在要求排序时不必遍历整个结果集即可返回第一页。
  • 限制为 1000 行的查询在哪里?您是否将 rownum 检查应用于作为子查询显示的查询?请将该代码及其解释计划添加到问题中。它应该在计划中加入一个“计数停止键”步骤。
  • 我实际上是从 SAS 内部执行“sql pass-through”的。我使用“outobs”参数。但是,我认为这类似于 ROWNUM。

标签: oracle performance sorting text indexing


【解决方案1】:

要在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 应该对此进行优化以尽可能少地完成工作。您应该在计划中看到“按停止键排序”和“计数停止键”步骤,这是 Oracle 很聪明,知道它只需要从索引中获取 1000 个值。

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

【讨论】:

  • 谢谢亚历克斯。是的,我注意到计划中的“COUNT STOPKEY”,并且我看到了一些改进(~20%),但与没有排序的性能相比,这仍然慢了很多。我不确定 Oracle 能够优化多少搜索,因为它似乎再次遍历整个结果集。
  • @nec - 仍然比仅获取第一页结果或前 1000 个结果慢很多?只是为了检查你是否在比较类似的东西。不过,我对 Oracle 文本做的不多,所以我不确定索引的工作方式是否完全相同。如果这是一个新索引,您还可以检查您的统计信息是否是最新的。
  • Alex,实际上经过几次运行后,性能似乎“好多了”,即数量级......我认为这可能是因为缓存,并尝试使用不同的文本进行搜索,而且看起来仍然令人印象深刻。我会做更多的测试,并发布更新。谢谢!!!
  • @AlexPoole 您可以从here 中取消删除您的答案。现在 OP 想要保护数据,而您的解决方案是最适合它的 :)。你会得到我的投票。
  • @AlexPoole 是的,但他的回答完全不同:)
猜你喜欢
  • 1970-01-01
  • 2018-03-18
  • 1970-01-01
  • 2021-06-19
  • 2020-02-07
  • 2016-06-02
  • 2016-06-03
  • 2021-11-24
  • 1970-01-01
相关资源
最近更新 更多