我想在我的数据库上优化某个查询,如果结果是> 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?
答案 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了解详情。