【发布时间】:2017-08-19 19:07:34
【问题描述】:
我使用 sort 和 rownum 查询以获得大表中的前 N 条记录(超过 21M 条记录)。我使用 order 和 rownum 选择 n 最近的记录,如下所示。我在可为空的 create_date 列上定义了索引,但执行时间超过 30 秒。这次我该如何改进?
select * from(
select *
from my_table t
order by t.create_date
)
where rownum<N
解释计划:
----------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost | Time |
----------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 9 | 31446 | 1153573 | 03:50:43 |
| * 1 | COUNT STOPKEY | | | | | |
| 2 | VIEW | | 21335585 | 74546533990 | 1153573 | 03:50:43 |
| * 3 | SORT ORDER BY STOPKEY | | 21335585 | 4544479605 | 1153573 | 03:50:43 |
| 4 | TABLE ACCESS FULL | MY_TABLE | 21335585 | 4544479605 | 165097 | 00:33:02 |
----------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
------------------------------------------
* 1 - filter(ROWNUM<10)
* 3 - filter(ROWNUM<10)
【问题讨论】:
-
Oracle 的哪个版本?
-
可以发布查询计划吗?
-
请附加解释计划 - 运行
EXPLAIN PLAN FOR your-query然后运行 SELECT * FROM table(DBMS_XPLAN.Display),并复制最后一个查询的结果(作为纯文本 - 不要打印屏幕)并将其附加到问题中。 -
请注意,11g 不是版本标识符,它只是 Oracle 使用的营销名称。版本是 11.1 或 11.2(通常 full 版本号,如 11.2.0.2.0,也是相关的)。想知道完整版本号,不知道的可以跑
select * from v$version。 -
@trincot 11.2.0.4.0