Mat*_* SM 5 postgresql performance postgresql-9.5 query-performance performance-tuning
我有一个巨大的表(> 30 亿行,总计 3 TB),使用 Postgres 9.5 定义如下:
CREATE TABLE user_events
(
user_id VARCHAR NOT NULL,
datetime BIGINT NOT NULL,
field1 VARCHAR,
field2 VARCHAR,
field3 VARCHAR,
field4 VARCHAR,
field5 VARCHAR,
CONSTRAINT user_events_user_id_datetime_pk PRIMARY KEY (user_id, datetime)
);
alter table user_events set (autovacuum_vacuum_cost_delay=10);
Run Code Online (Sandbox Code Playgroud)
我需要大约每秒 2000 次查询这个表,但我无法进行足够的并行化(我达到了大约一半)。
使用以下准备好的语句,我得到了合理的(我想)响应时间:
PREPARE getact AS select * from user_events where user_id = $1 order by datetime limit 1000;
explain analyze EXECUTE getact('xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx');
Run Code Online (Sandbox Code Playgroud)
CREATE TABLE user_events
(
user_id VARCHAR NOT NULL,
datetime BIGINT NOT NULL,
field1 VARCHAR,
field2 VARCHAR,
field3 VARCHAR,
field4 VARCHAR,
field5 VARCHAR,
CONSTRAINT user_events_user_id_datetime_pk PRIMARY KEY (user_id, datetime)
);
alter table user_events set (autovacuum_vacuum_cost_delay=10);
Run Code Online (Sandbox Code Playgroud)
一些补充说明:
在这一点上,我正在寻找任何配置建议。我知道我有像只读副本或分片这样的扩展选项,但现在想尽可能避免这种情况。
CLUSTER在这种情况下会执行工作吗?似乎大部分成本都在索引扫描中,所以我猜它不会,但我不知道(并且测试它真的很昂贵)。
更多信息:
EXPLAIN (ANALYZE, BUFFERS) (最慢)结果
EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM user_events WHERE user_id = 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX';
Run Code Online (Sandbox Code Playgroud)
PREPARE getact AS select * from user_events where user_id = $1 order by datetime limit 1000;
explain analyze EXECUTE getact('xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx');
Run Code Online (Sandbox Code Playgroud)
EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM user_events WHERE user_id = 'yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy';
Run Code Online (Sandbox Code Playgroud)
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------------
Limit (cost=0.70..1495.10 rows=367 width=878) (actual time=0.028..0.044 rows=4 loops=1)
-> Index Scan using user_events_user_id_datetime_pk on user_events (cost=0.70..1495.10 rows=367 width=878) (actual time=0.026..0.034 rows=4 loops=1)
Index Cond: ((user_id)::text = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'::text)
Execution time: 0.073 ms
Run Code Online (Sandbox Code Playgroud)