Oracle查询前几条数据的方法

说实话,在处理Oracle的前几条数据时,我经历了很多麻烦。
你的总结很完整,但我想补充一些我自己的经验。

我们以第一种方法使用 rownum 为例。
记得刚入行的时候,有一个老大爷坚持用rownum来进行分页。
结果,他在一张有数百万行的表上被困了两个小时。
当时不太明白,后来了解到rownum是在扫描物理行的时候分配的,所以当你使用where rownum <= 1 0的时候,实际上是在表扫描的过程中不断地对行进行编号,到了1 0就停止。
这个东西在数据量很大的时候就很可怕了,因为每次查询都要从第一行开始重新扫描。
然后我改用子查询来获取前 1 0 个项目,然后在外层使用 rownum <= 1 0 。
至少我可以使用索引,但这个想法仍然很复杂。

第二种方法使用row_number,这确实是一个改进。
上次我为电子商务客户优化报告时,他们在使用 rownum 对查询进行编号时遇到了麻烦。
使用行号分析功能时,CPU 下降7 0%。
具体来说,他们的要求是按照订单数排序,然后检索第2 00页的数据。
使用rownum,他们需要扫描整个表,然后截断它。
最后的结果仍然是错误的——因为相同金额的订单页面被搞乱了。
使用 row_number 为每一行分配唯一的序列号后,SQL 完成后几秒钟内就会生成结果。
不过需要注意的是,row_number是全局排序的,而不是按窗口排序的,所以如果一个表有数百万行,如果使用where rn在1 00到1 5 0之间,仍然会扫描整个表。
这和rownum类似,但至少逻辑更清晰。

我非常同意的第三件事是排序非常重要。
我见过的最离谱的事情是 DBA 使用 rownum 来获得前 1 名,结果很荒谬。
然后我发现他忘记添加订单了。
有趣的是,Oracle 1 2 c 开始支持新的写入方法 FETCH FIRST 1 0 ROWS ONLY。
我在最近的一个项目中尝试过它,发现它比 rownum 更直观,尽管旧版本不得不被搞乱。
而且这种写法可以和PL/SQL混合使用,比如start select ... from ... order by ...只取前1 0行; end;,这比 temp as (select ... from ... order by ...)、end as (select from temp where rownum <= 1 0) select from end 优雅得多。

数据我记得从Oracle 1 1 g左右开始,rownum并没有被官方推荐用于分页,但是很多老项目仍然在使用它。
我个人不会在该领域的 1 2 c 下运行并行查询,但直观上,并行使用 row_number 可能比串行运行更快。
但是,这取决于表的结构。
例如,如果使用row_number来检索索引列上的数据,速度还是非常高的。

最后,让我告诉你一些奇怪的事情。
我有一个客户使用rownum来获取数据,但是发现Oracle 1 9 c突然变慢了。
经过检查,发现系统自动使用并行查询,但是并行场景下rownum数字重复,最终的数据乱了。
这件事让我很困惑当时。
后来查资料发现是Oracle并行查询的一个bug。
因此,在使用rownum时,最好加上注释/+ FIRST_ROWS(n)/。
虽然不一定管用,但至少可以提醒自己注意。

总之,这一招一定要根据实际情况来选择。
row_number 在大表中肯定是首选,并且索引列如果是可索引的就更好了。
在其他情况下,这取决于运气 - 毕竟在 Oracle 中,如果添加注释,有时可能会随机更快。

mysql workbench如何限制查询行数

需要明确的是,限制 MySQL Workbench 中的查询行实际上非常简单。
我们先来说说最重要的事情。
您应该在查询编辑器中找到“LimitRows”选项。
它通常位于工具栏或查询下拉菜单中。
例如,在我们去年运行的一个项目中,我们将视图限制为 1 00 行,每行大约 3 ,000 条记录。
还有一点就是检查验证选项非常重要。
某些版本可能需要手动验证才能启用限制。
还有另一个重要的细节。
此设置仅影响当前查询会话,并且需要在重新启动程序后重置。
起初我以为这个设置会永久应用,但后来我意识到我错了。
事实上,它只适用于当前会话。
等等,还有一件事,如果你想让它永久应用,你可以直接在 SQL 语句中添加 LIMIT 子句,例如“SELECT FROM table LIMIT 1 00;”。
很多人没有注意到这一点,但我认为值得尝试。

sql server表中 怎么查询某些连续的记录,比如:查询第100到150行,表是无序排列的。

此 SQL 查询语句从一个表中选择前 1 5 0 条记录,但不包括从另一个表中选择的前 1 00 条记录。
以下是该查询的具体步骤:
1 .从第一个表中选择前 1 5 0 条记录: SQL 选择前 1 5 0 名 FROM 表名
2 从第二个表中选择前 1 00 条记录: SQL 选择前 1 00 名 FROM 表名
3 排除第二个表中选择的前 1 00 条记录: SQL 选择前 1 5 0 名 FROM 表名 除了 选择前 1 00 名 FROM 表名
此查询假设两个表中的记录顺序相同,因此使用 EXCEPT 运算符可以有效地从第一个表中选择第二个表中不存在的 1 00 条记录。
如果两个表中的记录顺序不同,则此排除方法可能不会给出预期的结果。

需要注意的是,EXCEPT运算符在某些数据库系统中可能不可用,例如MySQL,它没有内置EXCEPT运算符。
在这种情况下,您可能需要使用其他方法来实现相同的功能。