我使用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)
答案 0 :(得分:0)
您可以尝试first_rows提示。
FIRST_ROWS(n)的
提示FIRST_ROWS(n)(其中n是任何正整数)或FIRST_ROWS指示Oracle优化单个SQL语句以实现快速响应。 FIRST_ROWS(n)提供更高的精度,因为它指示Oracle选择最有效返回前n行的计划。 FIRST_ROWS提示优化了返回第一行的最佳计划,保留了向后兼容性和计划稳定性。
例如,优化程序使用基于成本的方法来优化此语句以获得最佳响应时间:
SELECT / * + FIRST_ROWS(10)* / employee_id,last_name,salary,job_id 来自员工 在哪里department_id = 20;