【问题标题】:Speed up Oracle 12c text query for a big table加快大表的 Oracle 12c 文本查询
【发布时间】:2017-02-08 08:52:00
【问题描述】:

我有一个包含 400 万条记录的表。这个查询运行速度很快

SELECT Id
  FROM Table1
  WHERE contains(Text,'great OR good') >0 
  OFFSET 10 ROWS   FETCH NEXT 3 ROWS ONLY


----------------------------------------------------------------------------------------------
| Id  | Operation                     | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |              |     3 |   225 |  6035   (0)| 00:00:01 |
|*  1 |  VIEW                         |              |     3 |   225 |  6035   (0)| 00:00:01 |
|*  2 |   WINDOW NOSORT STOPKEY       |              | 35926 |    64M|  6035   (0)| 00:00:01 |
|   3 |    TABLE ACCESS BY INDEX ROWID| Table1       | 35926 |    64M|  6035   (0)| 00:00:01 |
|*  4 |     DOMAIN INDEX              | IDX_ADS_TEXT |       |       |  6035   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------

但是这个查询

SELECT Id
FROM Table1
WHERE contains(Text,'great OR good') >0 
ORDER BY SomeDateColumn
OFFSET 10 ROWS   FETCH NEXT 3 ROWS ONLY


------------------------------------------------------------------------------------------------------
| Id  | Operation                     | Name         | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |              | 35926 |  2947K|       | 20265   (1)| 00:00:01 |
|*  1 |  VIEW                         |              | 35926 |  2947K|       | 20265   (1)| 00:00:01 |
|*  2 |   WINDOW SORT PUSHED RANK     |              | 35926 |    64M|    70M| 20265   (1)| 00:00:01 |
|   3 |    TABLE ACCESS BY INDEX ROWID| Table1       | 35926 |    64M|       |  6035   (0)| 00:00:01 |
|*  4 |     DOMAIN INDEX              | IDX_ADS_TEXT |       |       |       |  6035   (0)| 00:00:01 |
------------------------------------------------------------------------------------------------------

运行速度超级慢。我该怎么办?原因是什么?我在SomeDateColumn上有索引

【问题讨论】:

  • 您的查询返回多少行? SomeDateColumn 上的索引在这种情况下不会有帮助。你能把这两个查询的执行计划贴出来,你就会明白为什么了。
  • 添加执行计划,谢谢
  • @BobC Ascending and Descending Indexes docs.oracle.com/cd/B19306_01/server.102/b14200/… 呢?
  • 他们呢?您没有通过给出输出顺序的索引访问表。
  • 那么有比预先排序的物化视图更好的解决方案吗?如果craiglist 将在Oracle 上运行,那么允许通过过滤器快速搜索和按日期/价格排序的解决方案是什么。因为这基本上就是我需要的newyork.craigslist.org/search/…

标签: oracle12c


【解决方案1】:

您能否大大提高性能是值得怀疑的。

为什么不一样?想象一下:我有一个装有 400 万个网球的篮子。它们有不同的颜色,每个上面都写有日期。

问题1:从篮筐中挑球;忽略前 10 个蓝色或绿色,然后保留(返回)接下来的三个。

问题 2:找到篮子里的所有蓝色和绿色球。按照写在上面的日期的顺序排列它们。然后忽略前 10 个(按日期顺序)并返回接下来的三个。

在问题 1 中,有可能只有 50,000 个球(甚至更少)被观察,直到其中 13 个是蓝色或绿色。

在问题 2 中,您必须查看所有 400 万个球,只保留蓝色和绿色的球。那么你必须花费额外的时间来订购它们。

我希望你能明白为什么问题 1 可以很快解决,但问题 2 可能需要很长时间。

【讨论】:

  • 很好解释。这一切都在执行计划中:)
  • 我该怎么办?我用排序子句做了一个物化视图,它工作得很快。但这将意味着 mat.view 用于每次排序
  • @Toolkit 很抱歉您对 Oracle 有这种感觉。除了您的物化视图选项之外,还有没有办法过滤查询,这样您就不必对如此大的结果集进行排序,只需获取第 10-13 行?
  • @BobC,没有用户需要能够在400万条记录中搜索并按不同字段对结果进行排序和分页。我猜几个物化视图是唯一的选择
  • @Toolkit。如果你有足够的资源、CPU 和 IO 带宽,那么你可以用大锤子来解决这个问题。
猜你喜欢
  • 2018-09-12
  • 2021-04-24
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 2020-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多