在oracle中优化选择前N个查询

时间:2017-08-19 19:07:35

标签: oracle oracle11g

我使用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)

1 个答案:

答案 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;