有没有办法索引以下查询?
SELECT run_id, MAX ( frame ) , MAX ( time ) FROM run.frames_stat GROUP BY run_id;
Run Code Online (Sandbox Code Playgroud)
我尝试在frame
and上创建排序(非复合)索引time
,并在 上创建索引run_id
,但查询规划器不使用它们。
杂项信息:
frames_stat
表有 4200 万行架构:
CREATE TABLE run.frame_stat (
id bigint NOT NULL,
run_id bigint NOT NULL,
frame bigint NOT NULL,
heap_size bigint NOT NULL,
"time" timestamp without time zone NOT NULL,
CONSTRAINT frame_stat_pkey PRIMARY KEY (id)
)
Run Code Online (Sandbox Code Playgroud)
解释分析:
HashAggregate (cost=1086240.000..1086242.800 …
Run Code Online (Sandbox Code Playgroud) 我正在尝试为 Postgres 9.4 中的大型(1.2TB)静态表创建部分索引。
我的数据是完全静态的,所以我可以插入所有数据,然后创建所有索引。
在这个 1.2TB 的表中,我有一个名为的列run_id
,可以清晰地划分数据。通过创建涵盖一系列run_id
s 的索引,我们获得了出色的性能。下面是一个例子:
CREATE INDEX perception_run_frame_idx_run_266_thru_270
ON run.perception
(run_id, frame)
WHERE run_id >= 266 AND run_id <= 270;
Run Code Online (Sandbox Code Playgroud)
这些部分索引为我们提供了所需的查询速度。不幸的是,每个部分索引的创建大约需要 70 分钟。
看起来我们的 CPU 有限(top
进程显示为 100%)。
我可以做些什么来加快部分索引的创建?
系统规格:
表规格:
表定义:
CREATE TABLE run.perception(
id bigint NOT NULL,
run_id bigint NOT NULL,
frame bigint NOT NULL,
by character varying(45) NOT NULL,
by_anyone bigint NOT …
Run Code Online (Sandbox Code Playgroud) postgresql performance index ddl performance-tuning postgresql-performance