sql - 加速查询,其中包含 count(*) = 0 的结果
问题描述
我有一张桌子squitters
,其中包括一列parsed_time
。我想知道过去两天每小时的记录数并使用了这个查询:
SELECT date_trunc('hour', parsed_time) AS hour , count(*)
FROM squitters
WHERE parsed_time > date_trunc('hour', now()) - interval '2 day'
GROUP BY hour
ORDER BY hour DESC;
这可行,但零记录的小时数不会出现在结果中。我想在结果中也有零记录的小时数为零,所以我使用generate_series
函数编写了这个查询:
SELECT bins.hour, count(squitters.parsed_time)
FROM generate_series(date_trunc('hour', now() - interval '2 day'), now(), '1 hour') bins(hour)
LEFT OUTER JOIN squitters ON bins.hour = date_trunc('hours', squitters.parsed_time)
GROUP BY bins.hour
ORDER BY bins.hour DESC;
这有效,结果是计数为零的小时箱,但速度要慢得多。
如何使用第二个查询的 count=zero 结果获得第一个查询的速度?
(顺便说一句。有一个索引parsed_time
)
解决方案
您可以尝试更改连接条件,以便在列上不应用日期函数parsed_time
:
SELECT b.hour, COUNT(s.parsed_time) cnt
FROM generate_series(date_trunc('hour', now() - interval '2 day'), now(), '1 hour') b(hour)
LEFT OUTER JOIN squitters s
ON s.parsed_time >= b.hour
AND s.parsed_time < b.hours + interval '1 hour'
GROUP BY b.hour
ORDER BY b.hour DESC;
或者,您也可以尝试使用相关子查询(或横向连接)而不是left join
- 这避免了对外部聚合的需要:
SELECT
b.hour,
(
SELECT COUNT(*)
FROM squitters s
WHERE s.parsed_time >= b.hour AND s.parsed_time < b.hours + interval '1 hour'
) cnt
FROM generate_series(date_trunc('hour', now() - interval '2 day'), now(), '1 hour') b(hour)
ORDER BY b.hour desc
推荐阅读
- python - 使用python自定义函数的“乘法表”
- html - How to remove border and change background-color in top left cell of table?
- ksqldb - 用于提取逗号分隔消息的ksql语句是自己的字段
- c# - c# - 单元测试 HTTPWebRequest
- android - Android 模拟器 - 模拟特定设备
- python - 无法从网页中抓取某些 xml 内容的链接
- css - 基于项目数的 CSS 动态行布局
- git - 如何使用 git cherry pick 为新创建的文件处理不同分支之间的文件夹更改
- angular - 无法将推送的属性读取为未定义的 Angular 7
- vue.js - VueSocket - 向所有打开的应用程序实例发送消息