【问题标题】:PostgreSQL: Efficient way to get Average of recordsPostgreSQL:获取平均记录的有效方法
【发布时间】:2019-10-09 06:23:21
【问题描述】:

我有一个名为"ITEM_REVIEW" 的表,其中有一列名为"score"

我知道我可以通过以下方式获得score 的平均值:

SELECT AVG(score) FROM "ITEM_REVIEW" WHERE "item_id"=1

即使记录堆积,这是计算平均值的正确(有效)方法吗?还是在我的 NodeJS 服务器上获取数据并计算平均值更好?

【问题讨论】:

    标签: postgresql average


    【解决方案1】:

    我将其简化为

     SELECT AVG(ir.score) FROM "ITEM_REVIEW" ir 
    

    是的,将一百万行保存在快速硬盘上的数据库中并计算通过网络连接传递的单个浮点数比通过网络连接将一百万个浮点数传输到共享的浮点数要高效得多具有更多不同职责的服务器并使用一些慢速 JavaScript 来计算平均值

    数据库非常擅长存储、整理、连接和处理数据;这是他们存在的唯一目的/全部理由。聪明人团队将所有时间都花在实施和改进数据处理功能的性能上,以确保他们的数据库处于领先地位。尽可能将数据保留在数据库中,并在慢速网络链接上拖动尽可能少的字节数(始终在数据库中进行汇总和过滤)

    【讨论】:

    • 如何简化?它回答了一个不同的问题。
    • 查看问题的编辑历史 -> 我回答的问题(他写了SELECT AVG(bbb.score) FROM (SELECT * FROM "ITEM_REVIEW") as bbb)和现在出现的问题(他编辑了SELECT AVG(score) FROM "ITEM_REVIEW" WHERE "item_id"=1)非常不同。我没有经常引用问题的习惯,但也许我应该这样做。如果您确实发现有人回答了一个似乎没有被问到的问题;检查时间(在这种情况下,单击问题下的“9 小时前编辑”)以查看问题在发布答案时可能出现的情况
    • (还请记住,即使在编辑后发布了答案,它也可能是之前起草的。移动网站在通知更改方面特别差,因此一个人发布的答案可能是基于关于在答案提交时间前几分钟如何提出问题,并且问题可能已在回答者阅读它和提交答案之间进行了编辑)。总而言之,我没有计划更改此答案的大部分内容,因为基本信息保持不变;当数据库完全有能力时,不要从数据库中拖出一百万行,然后在 javascript 中添加它们
    【解决方案2】:

    如果你真的在乎,你应该试试看。这样您就可以获得版本、硬件、配置等的正确答案。请特别注意内存使用情况,因为 NodeJS 可能会在平均数据之前将所有数据存储在内存中。

    但一般来说,尝试在数据库之外重新实现数据库将会失败。并非总是如此,但一般而言。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多