我正在使用 Postgres 9.3.5 并且我在数据库中有一个大表,目前它有超过 2500 万行,而且它往往会迅速变大。我正在尝试使用一个简单的查询来选择特定的行(所有unit_id
s 都只有最新unit_timestamp
的),例如:
SELECT unit_id, max(unit_timestamp) AS latest_timestamp FROM all_units GROUP BY unit_id;
Run Code Online (Sandbox Code Playgroud)
在没有任何索引的情况下,此查询大约需要 35 秒才能执行。定义索引 ( CREATE INDEX partial_idx ON all_units (unit_id, unit_timestamp DESC);
) 后,查询时间缩短到(仅)19 秒左右。
我想知道是否有可能在更短的时间内(比如几秒钟)执行我的查询,如果是这样,我应该采取哪些步骤来进一步优化它?
我的表结构转储如下所示:
CREATE TABLE "all_units" (
"unit_id" int4 NOT NULL,
"unit_timestamp" timestamp(6) NOT NULL,
"lon" float4,
"lat" float4,
"speed" float4,
"status" varchar(255) COLLATE "default"
)
ALTER TABLE "all_units" ADD PRIMARY KEY ("unit_id", "unit_timestamp");
Run Code Online (Sandbox Code Playgroud)
该EXPLAIN (ANALYZE, BUFFERS)
如下:
QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------
HashAggregate (cost=663998.38..664069.73 rows=7135 …
Run Code Online (Sandbox Code Playgroud)