gpt4 book ai didi

oracle - where rownum=1 查询在 Oracle 中花费时间

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

我正在尝试执行类似

的查询
select * from tableName where rownum=1

这个查询基本上是获取表的列名。表中有超过百万条记录。当我提出上述条件时,它需要花费很多时间来获取第一行。是否有任何替代方法来获取第一行。

最佳答案

这个问题已经有人回答了,我只是解释为什么有时过滤器 ROWNUM=1 或 ROWNUM <= 1 可能会导致响应时间过长。

当遇到 ROWNUM 过滤器(在单个表上)时,优化器将生成带有 COUNT STOPKEY 的 FULL SCAN。这意味着 Oracle 将开始读取行,直到遇到前 N 行(此处 N=1)。全扫描从第一个范围读取 block 到高水位线。 Oracle 无法预先确定哪些 block 包含行,哪些 block 不包含行,因此将读取所有 block ,直到找到 N 行。如果第一个 block 是空的,可能会导致多次读取。

考虑以下几点:

SQL> /* rows will take a lot of space because of the CHAR column */
SQL> create table example (id number, fill char(2000));

Table created

SQL> insert into example
2 select rownum, 'x' from all_objects where rownum <= 100000;

100000 rows inserted

SQL> commit;

Commit complete

SQL> delete from example where id <= 99000;

99000 rows deleted

SQL> set timing on
SQL> set autotrace traceonly
SQL> select * from example where rownum = 1;

Elapsed: 00:00:05.01

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=7 Card=1 Bytes=2015)
1 0 COUNT (STOPKEY)
2 1 TABLE ACCESS (FULL) OF 'EXAMPLE' (TABLE) (Cost=7 Card=1588 [..])

Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
33211 consistent gets
25901 physical reads
0 redo size
2237 bytes sent via SQL*Net to client
278 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed

如您所见,一致获取的数量非常多(对于单行)。在某些情况下可能会遇到这种情况,例如,您使用 /*+APPEND*/ 提示插入行(因此高于高水位线),并且您还定期删除最旧的行,从而导致段开头有很多空白区域。

关于oracle - where rownum=1 查询在 Oracle 中花费时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5307152/

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