存储过程中的分页策略(View或?)

时间:2013-01-24 08:49:32

标签: 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调用,并从那里执行分页。 然而,考虑到sp_doStuff平均执行时间已经是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 {
                ....
        }
    });

1 个答案:

答案 0 :(得分:1)

抱歉,你真的应该在页面上向用户显示所有100k行???它看起来很疯狂,真人在现实生活中从不分析100k行信息。如果你有1M的行并计算其值的AVG或者其他的,那就没关系,但是从SP显示给人是非常糟糕的做法。从我的角度来看,您应该使用具有行和索引的结果集限制的方法。 Ex.:SELECT salary, date FROM USER_SALARY t WHERE t.id = '1748' ORDER BY date DESC LIMIT 29799, 100; 此请求将在USER_SALARY表中显示100行(起始行位置 - 29800),用户ID为1748,按日期字段排序(当然索引已由ID字段创建) 我想,上述方法允许您使用应在页面上向用户显示的大数据表。