Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.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 存储过程中的分页策略(视图还是?)_Java_Sql_Sql Server_Jdbc_Pagination - Fatal编程技术网

Java 存储过程中的分页策略(视图还是?)

Java 存储过程中的分页策略(视图还是?),java,sql,sql-server,jdbc,pagination,Java,Sql,Sql Server,Jdbc,Pagination,我有一个存储过程,根据参数返回大约100K到1M行: CREATE PROCEDURE dbo.sp_doStuff @userId bigint = 0, @date datetime = null AS BEGIN SET NOCOUNT ON; SELECT ... from ... order by theDate DESC; END 这个存储过程由Java方法通过jdbcTemplate调用,并从

我有一个存储过程,根据参数返回大约100K到1M行:

CREATE PROCEDURE dbo.sp_doStuff
    @userId bigint = 0,
    @date datetime = null
AS
BEGIN
    SET NOCOUNT ON;

    SELECT 
        ...
    from 
        ...
    order by theDate DESC;

END
这个存储过程由Java方法通过jdbcTemplate调用,并从那里进行分页。 然而,考虑到平均执行时间已经是60秒,这是非常慢的

也就是说,用户每单击一个下一页按钮(非常慢),就会调用
sp_doStuff
。 一次60秒就可以了,但下一页就不应该了。如何实现视图(或任何解决方案应用程序) 在这个SQL代码中,
jdbcTemplate
调用不必每次都处理这十万行

每次单击“下一步”按钮时调用:

String sql = "MyDB..sp_doStuff '12345', '2013-01-24'"
return jdbcTemplate.query(sql, new ResultSetExtractor<MyModel<Map<String, String>>>() {
        @Override
        public MyModel<Map<String, String>> extractData(ResultSet rs)
                throws SQLException, DataAccessException {
                ....
        }
    });
String sql=“MyDB..sp_doStuff”12345”,“2013-01-24”
返回jdbcTemplate.query(sql,newresultsetextractor(){
@凌驾
公共MyModel提取数据(结果集rs)
抛出SQLException、DataAccessException{
....
}
});

对不起,但您真的应该在页面上向用户显示所有100k行吗???这看起来很疯狂,现实生活中,真人从不分析10万行信息。如果您有1M行并计算其值的平均值或smth其他值,这是可以的,但从SP显示给人是非常糟糕的做法。在我看来,您应该使用具有行和索引结果集限制的方法。 例如:
从用户处选择薪资、日期,其中t.id='1748'按日期说明订单限制29799100
此请求将显示id为1748的用户的USER_SALARY表中的100行(起始行位置-29800),该表按日期字段排序(当然,id字段已创建索引)

我想,上述方法允许您处理应在页面上显示给用户的大数据表。

视图没有帮助-它只是一个视图,将被“重新执行”。SP不能作为索引视图的基础,所以这也是错误的。可能是查询-它是否需要是SP?记住,这会对RA流造成严重破坏可以通过分析和适当的索引/提示加快速度吗?我有大量复杂的查询,只需几秒钟即可运行。如果不是全部,也许可以在一个范围内加速(例如,每批分页)。也许查询可以保存在应用程序缓存中?也许查询可以保存在临时表中(缓存的一种形式)?好的,如果我使用临时表,那么对于来自浏览器(来自多个用户)的每个查询,将为每个查询创建临时表?乘以查询的每个日期?管理起来很麻烦,是的,但这是一种方法。我建议首先在SP上运行性能分析,看看该查询是否可以“大大加快”。也就是说,对于一般的“实时视图”结果集来说,60秒似乎太长了。一个简单的不正确的哈希连接循环连接选择(这可能是由于缺少变量嗅探造成的)是一个很容易混淆查询计划器的方法。在我的问题中,我明确地说,如果你有糟糕的架构代码,分页是用Java完成的-你应该更改这部分代码,否则你的代码将运行缓慢