2

我有这个存储过程,它返回大约 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 {
                ....
        }
    });
4

1 回答 1

1

抱歉,但您真的应该在页面上向用户显示所有 100k 行???看起来很疯狂,真实的人从不分析现实生活中的 10 万行信息。如果您有 1M 行并计算它们的值的 AVG 或其他东西,那没关系,但是从 SP 向人显示是非常糟糕的做法。从我的角度来看,您应该使用限制行和索引的结果集的方法。例如: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 字段创建)我想,上述方法允许您使用应该在页面上显示给用户的大数据表。

于 2013-01-24T09:30:54.030 回答