微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

分析Postgres中插入的性能

如何解决分析Postgres中插入的性能

我有一条语句正在向Postgres DB中插入一堆行(对于这个问题,无论在什么地方或什么地方都没有关系),它的速度不如我想要的快。我可以运行一个解释查询来查看它在做什么,并且我得到这样的东西:

 Insert on dpdb.datapoints  (cost=0.00..6917.76 rows=44184 width=1786) (actual time=15558.623..15558.623 rows=0 loops=1)
   Buffers: shared hit=34670391 read=98370 dirtied=48658 written=39875
   I/O Timings: read=704.525 write=242.915
   ->  Seq Scan on public.fred  (cost=0.00..6917.76 rows=44184 width=1786) (actual time=0.018..197.853 rows=44184 loops=1)
         Output: nextval('datapoints_id_seq'::regclass),fred.company_id,fred.tag,... lots more columns ...
         Buffers: shared hit=44186 read=6253 dirtied=1
         I/O Timings: read=29.176
 Planning time: 0.110 ms
 Trigger RI_ConstraintTrigger_c_14845718 for constraint datapoints_tag_source_fkey: time=236.677 calls=44184
 Trigger RI_ConstraintTrigger_c_14845723 for constraint datapoints_sheet_type_fkey: time=536.367 calls=44184
 Trigger RI_ConstraintTrigger_c_14845728 for constraint datapoints_subcontext_fkey: time=178.200 calls=44184
 Trigger RI_ConstraintTrigger_c_14845733 for constraint datapoints_source_type_fkey: time=467.619 calls=44184
 Trigger RI_ConstraintTrigger_c_14845738 for constraint datapoints_doc_type_fkey: time=302.256 calls=44184
 Trigger RI_ConstraintTrigger_c_14845743 for constraint datapoints_comment_type_fkey: time=88.740 calls=44184
 Trigger RI_ConstraintTrigger_c_14845748 for constraint datapoints_preferred_dpid_fkey: time=33.313 calls=44184
 Execution time: 17432.381 ms
(16 rows)

这很棒,因为我看到了各种触发器和查询中选择部分的开销,但是如果我将所有这些部分加起来,则大约是2秒(不到总时间的10%)。除了花了大约24秒的时间外,它并没有告诉我太多有关实际插入的信息。我猜测成本中相当一部分是更新索引,但我不确定这一点。我如何才能了解正在更新的索引以及每个索引的相对成本?这有可能吗?

(我最初是在dba.stackexchange.com上问这个的,但没有任何答案-它介于DBA和开发人员问题之间,所以我想我会在这里问)

解决方法

那些看起来像外键约束。每个插入都执行 SELECT 以检查该行是否存在,希望使用一个假设该索引存在的索引。

时间差异是因为每个触发器上的 time 向您显示执行函数所花费的时间量,不包括 IO 等待时间。换句话说,它不是向您显示挂钟时间,而是 CPU 时间(大约)。

您可以使用 pg_stat_statements 尝试查看针对这些表的查询并找到外键,但在一天结束时,这对于使用外键来说看起来很正常。

如果您需要这些插入以更快地执行,最好的选择是删除外键约束。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。