其中rownum = 1查询在Oracle中占用时间

Har*_*ish 2 oracle optimization where rownum

我正在尝试执行类似的查询

select * from tableName where rownum=1
Run Code Online (Sandbox Code Playgroud)

这个查询基本上是为了获取表的列名.表中有超过百万条记录.当我把上面的条件花了这么多时间来获取第一行时.是否有任何替代来获取第一行.

Vin*_*rat 12

这个问题已经得到解答,我只是解释为什么有时滤波器ROWNUM = 1或ROWNUM <= 1可能导致响应时间长.

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

考虑以下:

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
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,一致获取的数量非常高(对于单行).在某些情况下可能会遇到这种情况,例如,您插入带有/*+APPEND*/提示的行(因此高于高水位线),并且您还会定期删除最旧的行,从而在段的开头处产生大量空白空间.