Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JDBC滚动策略分页表格数据是否会导致性能下降?_Java_Sql Server_Spring_Jdbc_Paging - Fatal编程技术网

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

Java 使用JDBC滚动策略分页表格数据是否会导致性能下降?,java,sql-server,spring,jdbc,paging,Java,Sql Server,Spring,Jdbc,Paging,我们目前有一个系统,在屏幕上显示页面表格数据,用户界面中没有任何分页支持。它运行在Java1.5/SpringJDBC/T-SQL存储过程/SQLServer2000堆栈上 无法跳过结果集中的行(限制SQLServer2K而不使用动态SQL);我正在探索让数据层选择所有行,让DAO层滚动跳过的行页面,然后只读取一页的行 我的问题是: 与返回所有行的当前状态相比,此更改将获得多少性能增益(以DB CPU和I/O为单位) 我知道在数据库和应用程序之间只有一页的数据通过网络传输,但我想知道DBMS内部

我们目前有一个系统,在屏幕上显示页面表格数据,用户界面中没有任何分页支持。它运行在Java1.5/SpringJDBC/T-SQL存储过程/SQLServer2000堆栈上

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

我的问题是:

与返回所有行的当前状态相比,此更改将获得多少性能增益(以DB CPU和I/O为单位)

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


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

为什么不使用单元测试来获得一些数字呢

因此,从当前设置开始,有5个测试,跳过0、2、4、6、8页,看看跳过8页和2页之间是否有区别

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

编写另一个测试,看看会发生什么

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

对于上一个存储过程将带来的性能影响,很难给出任何真正的想法,因为有许多因素我们没有,但我希望存储过程做的工作越多,总体来说,运行的速度就越快


我倾向于通过单元测试来了解什么是最好的选择,因为你可以在负载下比较它,看看CPU和内存会发生什么。您可以衡量任何重要的因素,以确定哪个选项最适合您的设计。

如果您有一个BTree(索引、聚集或非聚集),那么进入第X页的唯一方法就是知道页面上的一个键并直接查找它。“跳过”前X-1页的每一个其他方法都必须遍历从1到X的所有页面,并分别跳过每条记录。“paged”字段上的窄索引有助于计数,因为高密度插槽(因此窄索引)减少了必须扫描的页数,以找到启动页面X的行。

谢谢James,这是一种有效的方法。我想我在寻找一个更具理论性而非实证性的答案。我想知道,即使光标滚动过去,DBMS是否真的会从行中读取数据。@bart-我想这是因为我的工程背景,但在我做出决定之前,我喜欢数字,但你可能想修改你的答案,在这里添加你的注释,因为这听起来像是真正的问题,其余的只是填充,感谢Remus,我认识到驱动数据访问的光标必须跳到与第x页第一行对应的行。当我们使用JDBC滚动到行(x*pagesize)时,这是否意味着SQLServer将从磁盘读取从第0页到第x-1页的所有行块?如果您想跳过1000行,SQL必须在“磁盘”上计算1000行,以便它能够找到您感兴趣的行。我之所以说“磁盘”,是因为它不一定是磁盘访问,它可以缓存在缓冲池中。谢谢雷姆斯-我现在已经找到了。