Postgresql 新分区表上的位图堆扫描
我使用表分区来存储按月分区的消息。这个月,我们的网站因为查询新的一个月的表现非常糟糕而宕机。还是不知道为什么 解释上个月的查询(~2亿行) 解释当月的同一查询(~400k行) 正如您在解释中所看到的,一个是使用索引扫描(conv_id,filter on'created'),另一个是在位图索引扫描之后首先执行位图堆扫描 表格结构:Postgresql 新分区表上的位图堆扫描,postgresql,Postgresql,我使用表分区来存储按月分区的消息。这个月,我们的网站因为查询新的一个月的表现非常糟糕而宕机。还是不知道为什么 解释上个月的查询(~2亿行) 解释当月的同一查询(~400k行) 正如您在解释中所看到的,一个是使用索引扫描(conv_id,filter on'created'),另一个是在位图索引扫描之后首先执行位图堆扫描 表格结构: CREATE TABLE conv_messages ( conv_message_id bigint NOT NULL GENERATED BY DEF
CREATE TABLE conv_messages
(
conv_message_id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 9223372036854775807 CACHE 1 ),
conv_id bigint NOT NULL,
message text COLLATE pg_catalog."default" NOT NULL,
message_type smallint NOT NULL DEFAULT 1,
created timestamp without time zone NOT NULL DEFAULT now(),
unread boolean NOT NULL DEFAULT true,
from_user_id integer NOT NULL,
CONSTRAINT convmessages_pkey PRIMARY KEY (conv_message_id, created)
) PARTITION BY RANGE (created) ;
CREATE INDEX conv_messages_unreads
ON conv_messages USING btree
(unread ASC NULLS LAST)
TABLESPACE pg_default
WHERE unread IS TRUE;
CREATE INDEX ix_convm_user_id
ON conv_messages USING btree
(from_user_id ASC NULLS LAST)
TABLESPACE pg_default;
CREATE INDEX ix_convmessages_convid
ON conv_messages USING btree
(conv_id ASC NULLS LAST)
TABLESPACE pg_default;
CREATE INDEX ix_convmessages_created
ON conv_messages USING btree
(created DESC NULLS FIRST)
TABLESPACE pg_default;
以及(简单)查询:
从conv_消息中选择*
哪里
m、 创建>='2020-03-01 00:00:00'和
m、 已创建<'2020-04-01 00:00:00'和
m、 conv_id=259395024
由m.C.创建的订单
限制20偏移0;
考虑到表是相同的,我不明白为什么一个有200多行的分区表比只有40万行的分区表执行速度快40倍。我尝试重新索引创建的_ix和conv_id_ix,但没有任何区别
有人知道这里会发生什么吗?我使用的是postgresql 12,问题似乎在于错误估计。尝试增加
default\u statistics\u target
,查看自动分析经常在表上运行;那可能会有所不同。谢谢!阅读完文档后,我决定增加一点,查询时间增加到0.2ms!不错。
select * from conv_messages m
where
m.created >= '2020-03-01 00:00:00' and
m.created < '2020-04-01 00:00:00' and
m.conv_id = 259395024
order by m.created desc
limit 20 offset 0;