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