PostgreSQL子查询大小写顺序扫描

PostgreSQL子查询大小写顺序扫描,postgresql,query-performance,postgresql-11,Postgresql,Query Performance,Postgresql 11,我有两张桌子: 请求:内容6000万条记录用作网站日志 requests\u hours:内容数百行每分钟从requests表中不断更新 我有以下简单的查询,但当我执行它时,需要大约5分钟才能完成,因为Postgres不使用列request\u time\u utc的索引,只进行顺序扫描 SELECT COUNT(request_id) FROM requests WHERE request_time_utc >= (SELECT MAX(request_hour_utc) FROM re

我有两张桌子:

请求:内容6000万条记录用作网站日志

requests\u hours:内容数百行每分钟从requests表中不断更新

我有以下简单的查询,但当我执行它时,需要大约5分钟才能完成,因为Postgres不使用列request\u time\u utc的索引,只进行顺序扫描

SELECT COUNT(request_id)
FROM requests
WHERE request_time_utc >= (SELECT MAX(request_hour_utc) FROM requests_hours)
但是如果我只是删除子查询,它本身是在0.003s中执行的,并用如下所示的静态值替换它,那么我只会在0.008s中执行以下查询:

SELECT COUNT(request_id)
FROM requests
WHERE request_time_utc >= '2019-09-30 17:00:00'
查询每分钟应该只计算几行,从1000到7000,因此当然,对列request\u time\u utc进行索引扫描应该比顺序扫描好得多

SELECT COUNT(request_id)
FROM requests
WHERE request_time_utc >= (SELECT MAX(request_hour_utc) FROM requests_hours)
我不明白如何强制PostgreSQL对第一个查询进行索引扫描

上述询问是为了简化问题;这是原稿:

SELECT 
            customer_id,
            DATE_TRUNC('hour', request_time_utc) AS request_hour_utc,
            COUNT(request_id) AS total_requests,
            SUM(data_in_size) AS total_data_in_size,
            SUM(data_out_size) AS total_data_out_size,
            SUM(process_long) AS total_process_long
            FROM requests
            WHERE request_time_utc >= (SELECT MAX(request_hour_utc) FROM requests_hours)
                        AND customer_id IS NOT NULL
            GROUP BY request_hour_utc , customer_id
            ORDER BY request_hour_utc DESC;

将子查询移动到CTE,就像这样,我在火车上用手机写下这个,所以您需要在正确的查询处着陆:-:

将您的\u max作为从请求中选择MAXrequest\u hour\u utc作为foo\u hours 选择COUNTrequest\u id 从请求交叉加入您的\u max 其中request\u time\u utc>=您的\u max.foo
如果你指望请求时间utc怎么办?也可以考虑将你的子查询移动到CTE。实际上,查询内容很多其他列,我只是用这种方式简化了它,并且这个问题的主要用户是子查询,在你公开了你的实际查询之后,我仍然会给CTE A去。