PostgreSQL 改进一个查询

PostgreSQL improve a query

我有如下疑问:

SELECT MAX(c."Sequence") 
FROM "Cips" AS c 
WHERE c."StoreNumber" IN (1, 2) 
AND c."DataProvider" in ('MCIP'  , 'SAM')

我也 运行 explain analyse 我收到了以下答复:

"Aggregate  (cost=43628.91..43628.92 rows=1 width=8) (actual time=81.290..81.292 rows=1 loops=1)"
"  ->  Append  (cost=0.43..43498.29 rows=52248 width=8) (actual time=0.090..75.045 rows=61163 loops=1)"
"        ->  Index Scan using ""a_StoreNumber_DataProvider_idx"" on a c  (cost=0.43..43237.05 rows=52248 width=8) (actual time=0.089..67.541 rows=61163 loops=1)"
"              Index Cond: ((""StoreNumber"" = ANY ('{-1,1}'::integer[])) AND (""DataProvider"" = ANY ('{MCIP,SAM}'::text[])))"
"Planning Time: 0.677 ms"
"Execution Time: 81.366 ms"

我在此table上只定义了一个索引:

CREATE INDEX "idx_Cip_StoreNumber_Sequence_DataProvider"
    ON public."Cips" USING btree
    ("StoreNumber" ASC NULLS LAST, "Sequence" ASC NULLS LAST, "DataProvider" COLLATE pg_catalog."default" ASC NULLS LAST)
    TABLESPACE pg_default;

我的 table 行数约为 140 万行。我还尝试对 table 进行分区,但性能提高了 10%。我的问题是,我需要将性能提高 90%,我真的卡住了。

我想知道我是否可以提高这个查询的性能,或者我应该开始寻找其他方向,例如修改这个字段周围的体系结构以及我们如何获得最大值?

尝试使用不同的索引,其中的列已按此查询所需的方式排序:

CREATE INDEX "idx_Cip_StoreNumber_DataProvider_Sequence"
    ON public."Cips" USING btree
    ("StoreNumber" ASC NULLS LAST, "DataProvider" COLLATE pg_catalog."default" ASC NULLS LAST, "Sequence" DESC NULLS LAST, )
    TABLESPACE pg_default;

序列现在是索引中的最后一列,并且也是降序排序但 NULLS 最后。

这是否改进了查询计划?请使用 EXPLAIN(ANALYZE, VERBOSE, BUFFERS) 来获得完整的计划。