Java 存储过程中的分页策略(视图还是?)
我有一个存储过程,根据参数返回大约100K到1M行: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调用,并从
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完成的-你应该更改这部分代码,否则你的代码将运行缓慢