使用 JDBC 滚动策略对表格数据进行分页是否会导致性能下降?

问题描述 投票:0回答:2

我们目前有一个系统,可以在屏幕上显示页面表格数据,而用户界面中没有任何分页支持。 它在 Java 1.5 / Spring JDBC / T-SQL 存储过程 / SQLServer 2000 堆栈上运行。

无法跳过结果集中的行(不使用动态 SQL 时 SQLServer 2K 的限制);我正在探索让数据层选择所有行并让 DAO 层滚动跳过的行页面,然后只读取一页的行的选项。

我的问题是:

与返回所有行的当前状态相比,此更改会带来多少性能增益(就数据库 CPU 和 I/O 而言)?

我知道数据库和应用程序之间只有一页数据通过线路传输,但我很想知道 DBMS 内部会发生什么。 假设查询计划已经缓存,如果我只想要第 41 页,DBMS 是否会跳过前 40 页结果的处理?

我想我想知道即使光标将跳过结果集的前 x 页,我们是否会产生大量成本。

java sql-server spring jdbc pagination
2个回答
1
投票

如果您有 BTree(索引,集群或非集群),那么转到页面 X 的唯一方法是知道页面上的键并直接查找它。 “跳过”前 X-1 页的其他方法必须遍历从 1 到 X 的所有页面,并单独跳过每条记录。 “分页”字段上的窄索引可以帮助计数,因为高密度槽(因此窄索引)减少了必须扫描以查找第 X 页开始的行的页数。


1
投票
为什么不使用单元测试来获取一些数字。

因此,您从当前的设置开始,进行 5 次测试,跳过 0、2、4、6、8 页,看看跳过 8 页和 2 页之间是否存在差异。

那么,一旦有了基线,为什么不使用动态 SQL 并仅返回感兴趣的行。

再写一个测试,看看会发生什么。

然后,使用一个存储过程来选择所有内容,但只返回感兴趣的行,并对此进行另一个测试。 为了你的 然后,尝试用 DAO 进行过滤的想法进行测试。

很难对最后一个过程的性能影响给出任何真实的想法,因为有很多因素我们没有,但我希望存储过程做的工作越多,速度就会越快总的来说,去吧。

我倾向于发现单元测试对于了解最佳选择很有用,因为您可以在负载下对其进行比较,看看 CPU 和内存会发生什么情况。 您可以衡量任何重要的因素,以确定哪个选项最适合您的设计。

© www.soinside.com 2019 - 2024. All rights reserved.