我有这个表格:
CREATE TABLE public.prodhistory (
curve_id int4 NOT NULL,
start_prod_date date NOT NULL,
prod_date date NOT NULL,
monthly_prod_rate float4 NOT NULL,
eff_date timestamp NOT NULL,
/* Keys */
CONSTRAINT prodhistorypk
PRIMARY KEY (curve_id, prod_date, start_prod_date, eff_date),
/* Foreign keys */
CONSTRAINT prodhistory2typecurves_fk
FOREIGN KEY (curve_id)
REFERENCES public.typecurves(curve_id)
) WITH (
OIDS = FALSE
);
CREATE INDEX prodhistory_idx_curve_id01
ON public.prodhistory
(curve_id);
这里有大约4200万行数据。
我要执行以下查询:
SELECT DISTINCT curve_id FROM prodhistory
我希望这个过程会非常快,因为有索引。但是实际上需要270秒。于是我解释了一下,得到了如下回复:
HashAggregate (cost=824870.03..824873.08 rows=305 width=4) (actual time=211834.018..211834.097 rows=315 loops=1)
Output: curve_id
Group Key: prodhistory.curve_id
-> Seq Scan on public.prodhistory (cost=0.00..718003.22 rows=42746722 width=4) (actual time=12.751..200826.299 rows=43218808 loops=1)
Output: curve_id
Planning time: 0.115 ms
Execution time: 211848.137 ms
我对阅读这些计划不是很有经验,但在数据库上进行Seq Scan似乎不太好。
有什么想法吗?我有点困惑。
curve_id
有多少个不同的值?另外,将PK设置为整个表的目的是什么? - Lamakexplain (analyze, verbose)
的输出结果。 - user330315curve_id
列上创建一个索引。 - krokodilko