【问题标题】:Sorting based on calculation with nhibernate - best practice使用 nhibernate 基于计算进行排序 - 最佳实践
【发布时间】:2009-02-12 23:19:19
【问题描述】:

我需要使用基于计算的排序顺序进行分页。该计算类似于 reddit 的热度算法,因为它依赖于时间 - 自帖子创建以来的时间。

我想知道这方面的最佳做法是什么。是将这种排序作为 SQL 函数进行,还是每小时运行一次更新以计算整个表。

该表有数十万行。而且我使用的是 nhibernate,所以这可能会导致计划的完整计算出现问题。

有什么建议吗?

【问题讨论】:

    标签: nhibernate calculated-columns


    【解决方案1】:

    这很可能很大程度上取决于您服务器上的负载。我的答案的一些假设:

    1. 您的计算很可能并不简单,但会考虑多种因素,包括发布后经过的时间

    2. 您预计您的网站至少会有合理的增长,这意味着新数据将添加到您的表格中。

    我建议你最好的办法是计算和存储你的排名值,并且正如 Nuno G 提到的那样,使用有序子句进行检索。正如您所注意到的,可能会产生一些影响,其中两个是:

    1. 计划更新
    2. 确保对表的访问

    就日程安排而言,您或许可以研究一些智能地重新计算您的价值的方法。例如,您可能能够识别何时可能更改计算(例如,如果更新了相关记录,您可能会触发触发器,将表的 ID 添加到队列中以进行重新计算)。您也可以在范围内进行更新,而不是在整个表格中。

    您还希望在重新计算时尽量减少对表的任何锁定。有很多方法可以做到这一点,包括设置隔离级别(使用 MS SQL 术语)。如果您真的担心,您甚至可以在外部执行计算(例如在临时表中),然后只需将值更新到主表即可。

    作为最后一点,我建议您查看可用的分页选项 - 如果您正在谈论数千条记录,请确保您的机制确定您在 SQL 服务器上需要的页面,这样您就不会返回数千条记录行添加到您的应用程序,因为这会减慢您的速度。

    【讨论】:

      【解决方案2】:

      如果您可以使用 SQL 执行计算,请尝试使用 Hibernate 通过执行 SQLQuery 来加载排序集合,其中您的查询包含“ORDER BY”表达式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-01
        • 2012-03-03
        相关资源
        最近更新 更多