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

标签 oracle optimization where rownum

我正在尝试执行类似

的查询
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/

相关文章:

c++ - 在 C++ 和 Oracle 数据库之间传递数据时的浮点精度问题

sql - PLSQL 异常回滚

java - 如何将 "variables"WHERE 子句注入(inject)查询?

sql - 如何有条件地为 SQL CREATE TABLE 语句构造表名?

java - java中用空数据填充的oracle数组

algorithm - 如果该行或列包含 0,则将矩阵中的每个单元格设置为 0

sql - WHERE 列不是 '$value' 吗?

ruby-on-rails - .where(nil) 和 .all 有什么区别?

optimization - CPLEX 中 GAP 的解释

algorithm - 有优化表达式的算法吗?