postgresql - 最小化查询结果大小算法
问题描述
一些上下文
现在,客户端发送一个请求,试图获取从所选日期到现在的所有数据以将其显示在图表上,它在 90% 的时间里运行良好,但有时结果查询大小可以达到 2000 万行,这绝对是可预测的工作真的很慢,所以现在我正在研究如何以某种方式显示数据以减少结果数据的大小
问题
- 计算结果行数以决定我是否应该使用某种最小化算法的最快方法是什么?我假设在谈论数据时,任何最小化都可能会有所帮助
- 有什么算法可以足够快地在图表上呈现数据?现在我只想出了将请求分成 N 部分,计算每个部分的平均值并在图表上显示平均值,这将有助于表示日期,但计算百万行的平均值仍然需要很多时间
任何帮助表示赞赏
解决方案
您需要获取从所选日期到现在的所有数据。这不允许您最小化结果,这样做会向用户显示错误信息(恕我直言)比慢速要差得多。也许更好的方法是设置一个阈值,在该阈值上询问用户是否希望继续,然后允许继续或不继续。现在每次计数都太慢了,但是有一个替代方法:创建一个物化视图,每天刷新,带有日期和该日期的计数。现在不是直接选择,而是先从 MV 中选择。如果结果超过设定阈值,请用户确认。这将对所有请求产生减慢影响,但对于相对较少的行,它应该不会太糟糕。然后,这允许您收集有关行与响应时间的统计信息,并为用户提供结果的估计时间。我发现用户通常不介意等待,如果你可以提前告诉他们。看此处演示:您没有提供表定义,所以我只是编造了一些东西。
create materialized view all_data_summary as
select the_date, count(*) num_items
from all_data
group by the_date;
select sum(num_items)
from all_data_summary
where the_date between :user_date and current_date;
推荐阅读
- google-drive-api - 查询'名称包含
' 当参数太长时,不能作为前缀匹配 - css - 如何处理自定义字体附带的额外空白?
- python - 使用 pymssql 进行 n 次迭代后输入确认的 For 循环
- javascript - 十进制数字验证不适用于长度
- c - 使用 LSF/bsub 基础设施运行 Tcl_DoOneEvent 时 CPU 使用率高(~100%)
- bash - 如何在 bash 命令之前添加自动前缀([prefix] docker exec)
- c++ - 如何使此函数输出最大数组值?
- sql-server - 无法使用相应的 SQL Mgmt Studio 连接到 SSIS 实例
- jenkins - 从 Jenkins 中的多个存储库进行轮询
- python - 有人可以解释这个 Python 程序中 * 的使用吗?