我有这个存储过程,返回大约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 {
....
}
});
答案 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字段创建)
我想,上述方法允许您使用应在页面上向用户显示的大数据表。