Oracle数据库 - count(0)运行速度比rownum< 500

时间:2015-11-04 08:18:31

标签: mysql database oracle count rownum

我想在我的数据库上优化某个查询,如果结果是> 500然后不运行查询。

这两种方法的最快方式是什么:

1)

list = createNativeQuery("select count(0) from (select * from table where rownum <= 501)")
if(list.size() > 500) throw error;
else runQuery();

或2)

list = createNativeQuery("select * from table where rownum <= 501")
if(list.size() > 500) throw error;

计数查询一般是否更快并且优化为运行得比实际带来所有行并计算结果大小更快?

修改 在第一种情况下,如果count(0)返回大小&lt; 500,然后我必须重新运行查询,在我的情况下,我有一个复杂的where子句。如果我的子查询需要大约10秒,则在场景1中需要大约20秒。我的问题是如果子查询需要~10s,那么来自子查询的选择计数(0)是否需要例如由于oracle的索引和优化,大约是1?

2 个答案:

答案 0 :(得分:2)

第一种方法更好bcz你不能从表到客户端选择行 在SQL Plus中看到这个:

第一

SQL> SET AUTOTRACE ON STATISTICS
SQL> select count(0) from (select * from all_tables where rownum <= 501);

  COUNT(0)
----------
       501


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

第二: 选择了418行。

select * from table where rownum <= 501;
Statistics
----------------------------------------------------------
      9  recursive calls
      0  db block gets
    855  consistent gets
      0  physical reads
      0  redo size
  25012  bytes sent via SQL*Net to client
    716  bytes received via SQL*Net from client
     29  SQL*Net roundtrips to/from client
      1  sorts (memory)
      0  sorts (disk)
    418  rows processed

SQL&GT;

引起对字节数的关注

423 in 1st approach vs 25012 in 2nd

第三 我不确定你的项目的逻辑,但也许

select count(*) from all_tables

是获取行数最简单的行,如果它&gt; 501不能在所有行中运行

SQL> select count(*) from all_tables;

  COUNT(*)
----------
      1711


Statistics
----------------------------------------------------------
          8  recursive calls
          0  db block gets
       2557  consistent gets
          0  physical reads
        124  redo size
        423  bytes sent via SQL*Net to client
        419  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL>

答案 1 :(得分:1)

比较以下两个查询:

select * from table where rownum <= 501
select count(*) from table where rownum <= 501

通常,这两种情况都要求数据库触摸表中的501条记录(或更少)。从这个角度来看,两个查询的性能应该大致相似。我不希望select count(*)的表现比select *差。 但是,通过调用第一个查询,您可能会将大量数据发送回Java代码。这本身就存在性能问题的风险。数据库非常适合计算记录,但Java代码要少得多。第二个查询似乎更适合您的用例。

请查看this great SO post了解详情。