【发布时间】: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