【问题标题】:How to optimize simple Postgres query?如何优化简单的 Postgres 查询?
【发布时间】:2021-02-21 05:10:11
【问题描述】:

我一直在使用 pg_stat_statements 分析我们的 Postgres 查询。前 3 名中有一个查询,我不知道如何做得更好。我的目标是让它定期执行低于 1 毫秒(或尽可能接近)。

这是架构

create table simple_table
(
    a varchar(5) not null,
    b varchar(120) not null,
    c text
);

create index simple_table_a_index on simple_table (a);
    
create index simple_table_b_index on simple_table (b);

在多次查询之后,pg_stat_statements 会报告这个

userid dbid queryid query calls total_time min_time max_time mean_time stddev_time rows shared_blks_hit shared_blks_read shared_blks_dirtied shared_blks_written local_blks_hit local_blks_read local_blks_dirtied local_blks_written temp_blks_read temp_blks_written blk_read_time blk_write_time
16401 16402 1627049242 SELECT * from simple_table WHERE a = $1 2330 12577.242999999968 2.908 101.494 5.397958369098713 4.503097042744964 8157330 1106750 0 0 0 0 0 0 0 0 0 0 0

表的pg_relation_size是3760128

该表大约有 42000 行。通常,此查询将返回约 3500 行,其中 c 列是最长的。看了一下,最大长度是330,平均长度是28。

关于如何改进这个非常简单的查询的任何提示?除了添加索引之外,我不确定如何使它变得更好。

【问题讨论】:

  • 您可以将所有信息发布到pg_stat_statements 以进行查询吗?桌子的尺寸是多少? (选择 pg_relation_size('yourtable'))
  • @bobflux 当然,我用整个 pg_stat_statements 行更新了帖子。表的 pg_relation_size 为 3760128
  • 好的,它表明它没有做任何好的 IO。我刚刚在试验它,看起来 pg_stat_statements 中的时间包括通过网络向客户端发送结果的时间,所以你的问题实际上可能是网络速度慢或饱和,或者客户端等待太久之前检索整个结果集。
  • 你在应用端使用php吗?
  • 包括运输时间?我没想到!好的,很酷,我会调查的。谢谢你的提示。编辑:应用程序是用 Java 编写的,我们使用的是 JDBC 42.2.18。

标签: postgresql


【解决方案1】:

已经很不错了。

如果你想从查询中榨取最后一点性能,

  1. 使用足够的 RAM 在内存中缓存 a 上的表和索引。

  2. 按索引顺序重写表:

    CLUSTER simple_table USING simple_table_a_index;
    

【讨论】:

  • 酷,我会仔细检查内存。另外,CLUSTER 对我来说是新的,我会开始使用它,谢谢你的提示!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 2011-02-13
  • 1970-01-01
  • 1970-01-01
  • 2014-07-06
  • 1970-01-01
相关资源
最近更新 更多