我需要根据计算使用排序顺序进行分页。该计算类似于 reddit 的热度算法,因为它依赖于时间 - 自发布以来的时间。
我想知道最好的做法是什么。是否将这种排序作为 SQL 函数进行,或者每小时运行一次更新以计算整个表。
该表有数十万行。而且我使用的是 nhibernate,所以这可能会导致预定的完整计算出现问题。
有什么建议吗?
我需要根据计算使用排序顺序进行分页。该计算类似于 reddit 的热度算法,因为它依赖于时间 - 自发布以来的时间。
我想知道最好的做法是什么。是否将这种排序作为 SQL 函数进行,或者每小时运行一次更新以计算整个表。
该表有数十万行。而且我使用的是 nhibernate,所以这可能会导致预定的完整计算出现问题。
有什么建议吗?
它很可能在很大程度上取决于服务器上的负载。我的回答的一些假设:
您的计算很可能并不简单,但会考虑多种因素,包括自发布以来经过的时间
您期望您的网站至少有合理的增长,这意味着新数据将添加到您的表格中。
我建议您最好的选择是计算和存储您的排名值,并且正如 Nuno G 提到的那样,使用有序子句进行检索。正如您所注意到的,可能会产生一些影响,其中两个是:
就日程安排而言,您可能能够查看一些智能地重新计算您的价值的方法。例如,您可能能够识别何时可能更改计算(例如,如果更新了相关记录,您可能会触发触发器,将表的 ID 添加到队列中以进行重新计算)。您也可以在范围内进行更新,而不是在整个表中。
您还希望在重新计算时尽量减少对表的任何锁定。有很多方法可以做到这一点,包括设置隔离级别(使用 MS SQL 术语)。如果您真的担心,您甚至可以在外部执行计算(例如在临时表中),然后只需将值更新到主表即可。
作为最后一点,我建议您查看可用的分页选项 - 如果您正在谈论数千条记录,请确保您的机制确定您在 SQL 服务器上需要的页面,这样您就不会将数千行返回到您的应用程序,因为这会减慢您的速度。
如果您可以使用 SQL 执行计算,请尝试使用 Hibernate 通过执行 SQLQuery 来加载排序集合,其中您的查询包含“ORDER BY”表达式。