Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 新分区表上的位图堆扫描_Postgresql - Fatal编程技术网

Postgresql 新分区表上的位图堆扫描

Postgresql 新分区表上的位图堆扫描,postgresql,Postgresql,我使用表分区来存储按月分区的消息。这个月,我们的网站因为查询新的一个月的表现非常糟糕而宕机。还是不知道为什么 解释上个月的查询(~2亿行) 解释当月的同一查询(~400k行) 正如您在解释中所看到的,一个是使用索引扫描(conv_id,filter on'created'),另一个是在位图索引扫描之后首先执行位图堆扫描 表格结构: CREATE TABLE conv_messages ( conv_message_id bigint NOT NULL GENERATED BY DEF

我使用表分区来存储按月分区的消息。这个月,我们的网站因为查询新的一个月的表现非常糟糕而宕机。还是不知道为什么

解释上个月的查询(~2亿行)

解释当月的同一查询(~400k行)

正如您在解释中所看到的,一个是使用索引扫描(conv_id,filter on'created'),另一个是在位图索引扫描之后首先执行位图堆扫描

表格结构:

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;