关于paginate分页时数据加载量的疑惑

近期因在SQL语句中大量使用了数据库自定义函数,在翻页中发现了一个现象:起初的几页没有问题,速度正常,但如果是直接点最后一页,数据加载速度非常缓慢。后经查看后台jFinal执行的SQL语句后,发现如下:

Sql: SELECT * FROM ( SELECT row_number() over (order by tempcolumn) temprownumber, * FROM  ( SELECT TOP 192360 tempcolumn=0, IDX, HSCode, dbo.F_getBuildingInfo('BLNo', BLID) AS BLNo, UnitNo, RoomNo, Price, dbo.F_getProjectInfo('Name', dbo.F_getPreSaleCertInfo('PJID', PSCID)) AS PJName, (CASE AreaStatus WHEN 0 THEN Area1 WHEN 1 THEN RealArea1 END) AS HSArea1, dbo.F_getDicInfo('HOUSE_USAGE', Usage) AS UsageName, dbo.F_getDicInfo('HOUSE_AREASTATUS', AreaStatus) AS AreaStatusName, dbo.F_getDicInfo('HOUSE_STATUS', dbo.F_getHouseStatus(HSCode)) AS FinalStatusName FROM T_House WHERE AppStatus=2 ORDER BY ID DESC)vip)mvp where temprownumber>192340

核心问题在于这里

SELECT TOP xxxx

第一页时xxxx=pagesize,第二页时xxxx=pagesize*pageno,此时其实已经多加载了第一页的内容,所以当点击最后页时,实际的SQL执行加载了数据库中所有的数据。如果只是单纯的直接加载数据表,可能问题不是很大,但就是因为使用了大量的自定义函数,在函数中可能会有额外的计算或其它数据的加载,于是导致了SQL性能下降。

根据jFinal后台的SQL语句,应该是检索出pagesize*pageno条数据,然后根据temprownumber再来截取最后的pagesize条数据。不过这样一来,是否就多加载了pagesize*(pageno-1)条数据?

本案例数据库为MSSQL2008,jFinal3.9。

jFinal小白,望经验者指教。

评论区

JFinal

2020-08-14 21:03

先使用你自己的分页 sql 用一下:
Db.find(sql, paras);

确保性能是好的,再用于分页:
Db.paginate(...);

因为性能取决于你的 sql 而不是分页

热门反馈

扫码入社