Postgresql 由于readahead的魔力,y能够将其全部容量交付给单个阅读器。有时,平行阅读者甚至会互相踩对方的脚,使整体表现更糟。您可以使用将每个聚集的最大并行工人数设置为0来禁用并行化这可能会使事情变得更快,如果不这样做,至少会使解释计划更容易理解

Postgresql 由于readahead的魔力,y能够将其全部容量交付给单个阅读器。有时,平行阅读者甚至会互相踩对方的脚,使整体表现更糟。您可以使用将每个聚集的最大并行工人数设置为0来禁用并行化这可能会使事情变得更快,如果不这样做,至少会使解释计划更容易理解,postgresql,query-performance,Postgresql,Query Performance,您获取的数据超过了表的3%:193963/(193963+6041677)。当您获取这么多的索引时,索引可能没有多大帮助。如果它们是,你会想要一个组合索引,而不是单个索引。因此,您需要(客户端、事件名称、日期(datetime))上的索引。然后,您还需要将查询更改为使用date(datetime),而不是为\u char(datetime,'YYYY-MM-DD')。您需要进行此更改,因为to_char不是不可变的,因此无法编制索引 增加工作量似乎使排序速度提高了8倍:(172639.670-1

您获取的数据超过了表的3%:
193963/(193963+6041677)
。当您获取这么多的索引时,索引可能没有多大帮助。如果它们是,你会想要一个组合索引,而不是单个索引。因此,您需要
(客户端、事件名称、日期(datetime))
上的索引。然后,您还需要将查询更改为使用
date(datetime)
,而不是
为\u char(datetime,'YYYY-MM-DD')
。您需要进行此更改,因为to_char不是不可变的,因此无法编制索引

增加工作量似乎使排序速度提高了8倍:
(172639.670-169311.063)/(167975.549-167570.669)
。但是,由于排序只占用了总执行时间的一小部分,因此将排序速度提高1000倍并不能使总体情况变得更好。这是占用时间的顺序扫描

seq扫描的大部分时间可能都花在IO上。打开跟踪io定时后,可以通过运行
EXPLAIN(ANALYZE,BUFFERS)
查看

此外,由于readahead的魔力,将seq扫描并行化通常不是很有帮助,因为IO系统通常能够将其全部容量交付给单个读卡器。有时,平行阅读者甚至会互相踩对方的脚,使整体表现更糟。您可以使用
将每个聚集的最大并行工人数设置为0来禁用并行化这可能会使事情变得更快,如果不这样做,至少会使解释计划更容易理解


您获取的数据超过了表的3%:
193963/(193963+6041677)
。当您获取这么多的索引时,索引可能没有多大帮助。如果它们是,你会想要一个组合索引,而不是单个索引。因此,您需要
(客户端、事件名称、日期(datetime))
上的索引。然后,您还需要将查询更改为使用
date(datetime)
,而不是
为\u char(datetime,'YYYY-MM-DD')
。您需要进行此更改,因为to_char不是不可变的,因此无法编制索引

通过修改查询,问题得到了解决。这里是关于to_char方法的问题。它将表中每个记录的日期对象转换为字符串日期,以与给定的字符串日期匹配。所以我更新查询,就像提取给定日期和第二天日期之间的记录一样。现在,我将在500毫秒内得到响应。

通过修改查询,问题得到了解决。这里是关于to_char方法的问题。它将表中每个记录的日期对象转换为字符串日期,以与给定的字符串日期匹配。所以我更新查询,就像提取给定日期和第二天日期之间的记录一样。现在,我将在500毫秒内收到响应。

工作量的增加使您不再进行磁盘排序,但seqscan仍然占用了大部分时间。您是否在
事件
表中为列
(客户端,事件名称,to_char(datetime,'YYYY-MM-DD'::text))
创建了索引?是的,我为查询中的所有列名编制了索引。
工作记忆
的增加使您无法在磁盘上进行排序,但seqscan仍然占用了大部分时间。您是否已在
事件
表中为列
(客户端,事件名称,to_char(datetime,'YYYY-MM-DD'::text))
创建了索引?是的,我已为属于查询一部分的所有列名编制了索引。将尝试并发回响应。谢谢将尝试发回回复。谢谢
event_logs=> select count(*) from events;
  count   
----------
 18706734
(1 row)
select raw->'request_payload'->'source'->0 as file, 
       count(raw->'request_payload'->>'status') as count, 
       raw->'request_payload'->>'status' as status 
from events 
where client = 'NTT' 
  and to_char(datetime, 'YYYY-MM-DD') = '2019-10-31' 
  and event_name = 'wbs_indexing' 
group by raw->'request_payload'->'source'->0, 
         raw->'request_payload'->>'status';
 file                   | count  | status  
-----------------------------+--------+--
 "xyz.csv"              |  91878 | failure
 "abc.csv"              |  91816 | failure
 "efg.csv"              | 398196 | failure
(3 rows)