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) 来获得完整的计划。
我有如下疑问:
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) 来获得完整的计划。