- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想优化数据库中的某个查询,如果结果 > 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) 返回 size < 500,那么我必须重新运行查询,在我的例子中,我有一个复杂的 where 子句。如果我的子查询需要大约 10 秒,那么在场景 1 中它将需要大约 20 秒)。我的问题是,如果子查询需要 ~10s,子查询中的 select count(0) 是否需要,例如~1s 因为 oracle 的索引和优化?
最佳答案
第一种方法更好,因为您不选择从表到客户端的行在 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>
注意字节数
423 in 1st approach vs 25012 in 2nd
第三我不确定你项目的逻辑,但也许
select count(*) from all_tables
是获取行数最简单的方法,如果它是 >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>
关于mysql - Oracle 数据库 - count(0) 是否比 rownum < 500 运行得更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33516853/
我在 MySQL 中有这个查询 SELECT @rownum:=@rownum+1 AS rownum, notifications_posts.from_user AS source, notifi
SET @rownum := -1; SELECT round(AVG(t.LAT_N),4) FROM ( SELECT @rownum := @rownum + 1 AS
我想知道 rowID 之间的区别和 rowNUM 以及如何在我们的表格中看到这两者。 当我执行此操作时: SELECT * FROM emp WHERE rownum=1 它返回一个查询,但是当我对
我正在查看一个 SQL 查询,它使用 Oracle 的 rownum 伪列来选择行号作为总行数的一部分: ROWNUM/(MAX(ROWNUM) OVER()) 我正在尝试使用通过 jOOQ 编写的查
这个问题在这里已经有了答案: 关闭 10 年前。 社区在 4 个月前 审查了是否重新打开此问题,然后将其关闭: 原始关闭原因未解决 Possible Duplicate: Rownum not wo
为什么以下查询返回“零”记录: SELECT * FROM 记录 WHERE rownum >= 5 AND rownum = 5 而以下查询返回正确的记录: SELECT * FROM 记录 WHE
最近我修复了一些错误:连接条件中有rownum。 像这样:在 t1.id=t2.id 和 rownum 10 总是返回 false。我不知道 ROWNUM<-666 在你的 JOIN 子句中是如何工作
select * from MYTABLE t where EQUIPMENT = 'KEYBOARD' and ROWNUM <= 2 or EQUIPMENT = 'MOUSE' and ROWN
所以我想在 Oracle DB 中选择一系列行。我需要这样做,因为我在表中有数百万行,我想将结果分页给用户(如果您知道在客户端执行此操作的另一种方法,如果重要,我正在使用 JavaFX,但我不认为通过
select * from Schem.Customer where cust='20' and cust_id >= '890127' and rownum between 1 and 2
我的表中有 6442670 条记录,我正在使用以下命令获取它们jdbctemplate 使用行号一次 1000000 个。以下是查询 select * from (select rowNum rn
select * from Schem.Customer where cust='20' and cust_id >= '890127' and rownum between 1 and 2
我有一个带有 group by 和 order by 子句的复杂查询,我需要一个排序的行号 (1...2...(n-1)...n) 与每一行一起返回。使用 ROWNUM(在通过查询的谓词阶段后但在查询
基本上,我想通过使用@rownum 显示表中的行数以及数据,它在第一页上工作得很好,但是当我们转到下一页时,我们又从第一行开始。 查询代码: $sql = "SELECT @rownum:=@rown
我有一个包含 10 000 个元素的表。 IQuerable query = dataRep.Get() .Query(); 我
如何返回特定范围的 ROWNUM值(value)观? 我正在尝试以下操作: select * from maps006 where rownum >49 and rownum 49 and r <
最近看oracle资料的时候,了解rownum的概念,以前只知道对数据库表进行简单的增删改查; 看到了rownum的概念后,突然想到了好多业务场景应该都可以适用的,比如在进行随机发奖的时候, 我
我正在尝试查看客户请求重新激活其 Internet 帐户的频率。 问题是,我们捕获一组有限的数据来分组。所以我的数据集如下。 我正在尝试从第一次创建重新激活请求到它第一次完成计算,一旦完成,完成请求完
我正在尝试查询以仅返回表中的最新行。 最初我在查询中使用了 max(id) 但是当我使用序列并且我的环境是聚集的时,我不能依赖序列作为它的顺序。 所以我决定根据创建时间排序并使用 rownum 选择顶
这是我当前代码的示例: DataSet = [1,2,3,4,5,6,7,8,9]. Sequence = [3,4,5,6]. ReducedDataSet = lists:foldl( fun(S
我是一名优秀的程序员,十分优秀!