gpt4 book ai didi

sql - 选择表中最后插入的 `n` 记录 - oracle

转载 作者:行者123 更新时间:2023-12-04 13:02:34 25 4
gpt4 key购买 nike

表具有从序列生成的代理主键。不幸的是,这个序列用于为其他一些表生成键(我没有设计它,我不能改变它)。

选择最后一个的最快方法是什么n在 Oracle 中插入的记录,按 id 降序排列(最后插入在顶部)?
n是一些相对较小的数字 - 要在页面上显示的记录数 - 可能不大于 50。

表现在有 30.000.000 条记录,每天有 10-15 万条新记录。

数据库是Oracle 10g。

编辑:
对一条评论的回答:这个问题的动机是查询的执行计划:

  select * from MyTable order by primarykeyfield desc

执行计划是:
--------------------------------------------- 
| Id | Operation | Name |
---------------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | SORT ORDER BY | |
| 2 | TABLE ACCESS FULL| MyTable |
---------------------------------------------

我很惊讶 Oracle 在排序字段上有索引时想要执行全表扫描和排序。

从接受的答案查询使用索引并避免排序。

编辑 2:
关于。 APC 的评论:排序是让我感到惊讶的部分。我预计 Oracle 会使用索引以预期的顺序检索行。查询的执行计划:
select * from (select * from arh_promjene order by promjena_id desc) x 
where rownum < 50000000

使用索引而不是全表访问和排序(注意条件 rownum < 50.000.000 - 这比表中的记录数多得多,Oracle 知道它应该从表中检索所有记录)。此查询将所有行作为第一个查询返回,但具有以下执行计划:
| Id  | Operation                     | Name         | 
-------------------------------------------------------
| 0 | SELECT STATEMENT | |
|* 1 | COUNT STOPKEY | |
| 2 | VIEW | |
| 3 | TABLE ACCESS BY INDEX ROWID| MyTable |
| 4 | INDEX FULL SCAN DESCENDING| SYS_C008809 |

Predicate Information (identified by operation id):
---------------------------------------------------

1 - filter(ROWNUM<50000000)

Oracle 为这两个基本上返回相同结果集的查询创建不同的执行计划对我来说很不寻常。

编辑 3:
Re Amoq 的评论:

Oracle doesn't know that 50M is greater than the number of rows. Sure, it has statistics, but they could be old and wrong - and Oracle would never allow itself to deliver an incorrect result only because the statistics are wrong.



你确定吗?在 Oracle 版本高达 9 中,建议不时手动刷新统计信息。从版本 10 Oracle 自动更新统计信息。如果 Oracle 不将其用于查询优化,那么统计数据有什么用?

最佳答案

使用 ROWNUM :

select
*
from
(
select
*
from
foo
order by
bork
) x
where
ROWNUM <= n

请注意 rownum在子查询排序之前应用,这就是为什么你需要两个嵌套查询,否则你只会得到 n随机行。

关于sql - 选择表中最后插入的 `n` 记录 - oracle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1827948/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com