ORACLE 中带有 OFFSET 的 SELECT 查询

发布于 2024-12-03 15:38:24 字数 222 浏览 1 评论 0原文

我需要从包含 1kkk 行的表上的 java 代码执行 SELECT 查询,因此结果集将接近 1kk 行。这就是为什么我需要限制它,并多次运行 select 查询,每次只检索 10k 行。在获得 10k 行后,我会更新它,这样在下一个 SELECT 中就不会检索它们。 问题是 - 在每个选择预言机中从表中的第一行查找,因此它降低了性能。 如何使用 OFFSET 来避免 Oracle 从第一行查找并跳过已经更新的行?

I need to do SELECT query from java code on table that contains 1kkk rows , so the result set will be near 1kk rows. thats why I need to limit it, and run select query many times and each time to retrieve 10k rows only. After I get 10k rows I update it so in the next SELECT they wont be retrieved.
The problem is - in each select oracle looking from first row in the table so it reduces the performance.
How can I use OFFSET for avoiding oracle looking from first row and pass over already updated rows?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

潦草背影 2024-12-10 15:38:24

这些解决方案都没有真正提高性能。

您有一个包含 250,000 行的数据集,并以 10,000 行为批次获取它们。
除非您与数据库有状态连接并保持 SELECT 语句正在进行(用 Oracle 术语来说,这是“保持游标打开”),否则每个选择都独立于上一个选择。

因此,要获取从 180,001 到 190,000 的批次,它仍然需要进行排序,以便它可以计算出前 190,000 行。 OFFSET 等语法糖不会改变数学和逻辑的基本规则。

为了获得最佳性能,您需要保持结果集打开并继续从中获取行。不要关闭它,也不要重新发出选择。

None of these solutions actually improve performance.

You've got a dataset of 250,000 rows and fetch them in batches of 10,000.
Unless you have a stateful connection to the database and keep that SELECT statement in progress (in oracle terms this is 'keeping the cursor open') then each select is independent of the last.

As such to fetch the batch from 180,001 to 190,000 it will still have to sort so it can work out the first 190,000 rows. Syntactic sugar such as OFFSET doesn't alter the fundamental rules of maths and logic.

To get the best performance you need to keep the resultset open and just keep fetching rows from it. Don't close it and don't re-issue the select.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文