java - 存储过程中的分页策略(查看或?)

标签 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 秒没问题,但下一页就不行了。我如何实现 View (或任何解决方案应用程序) 在此 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 {
                ....
        }
    });

最佳答案

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

关于java - 存储过程中的分页策略(查看或?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14497202/

相关文章:

java - Android,Java - AutocompleteTextView列表显示在编辑框下

mysql - SQL SELECT 后跟 UPDATE

python - Pandas 到 sql server

c# - 更新密码时如何插入日期?

c# - 按照 IN 的顺序对 SQL Query 进行排序

java - 无法捕获异常

java - 字符串操作 - 从字符串中删除字符

java - Eclipse - 设置为编译器 1.6 以避免 @Override 错误不起作用?

SQL 查找列表中数据库中没有记录的项目

sql - SQL Server 的良好实践 : nvarchar(max) performance