postgresql - PostgreSql 应用并行顺序扫描而不是索引扫描
问题描述
我在所有列 Juliet、Five、Juilet1 到 Juliet15 上都有索引,即使 PostgresSQL 正在执行并行 Seq 扫描而不是索引扫描。为什么会这样?
PostgresSql 查询是,
SELECT juliet FROM romeo
WHERE (((romeo.juliet1 IN ('S66.303S', 'S66303S', 'S52.009S', 'S52009S', 'S32.466G', 'S32466G', 'H44.139', 'H44139', 'H35.732', 'H35732')
OR romeo.juliet2 IN ('S66.303S', 'S66303S', 'S52.009S', 'S52009S', 'S32.466G', 'S32466G', 'H44.139', 'H44139', 'H35.732', 'H35732')
OR romeo.juliet3 IN ('S66.303S', 'S66303S', 'S52.009S', 'S52009S', 'S32.466G', 'S32466G', 'H44.139', 'H44139', 'H35.732', 'H35732')
OR romeo.juliet4 IN ('S66.303S', 'S66303S', 'S52.009S', 'S52009S', 'S32.466G', 'S32466G', 'H44.139', 'H44139', 'H35.732', 'H35732')
OR romeo.juliet5 IN ('S66.303S', 'S66303S', 'S52.009S', 'S52009S', 'S32.466G', 'S32466G', 'H44.139', 'H44139', 'H35.732', 'H35732')
OR romeo.juliet6 IN ('S66.303S', 'S66303S', 'S52.009S', 'S52009S', 'S32.466G', 'S32466G', 'H44.139', 'H44139', 'H35.732', 'H35732')
OR romeo.juliet7 IN ('S66.303S', 'S66303S', 'S52.009S', 'S52009S', 'S32.466G', 'S32466G', 'H44.139', 'H44139', 'H35.732', 'H35732')
OR romeo.juliet8 IN ('S66.303S', 'S66303S', 'S52.009S', 'S52009S', 'S32.466G', 'S32466G', 'H44.139', 'H44139', 'H35.732', 'H35732')
OR romeo.juliet9 IN ('S66.303S', 'S66303S', 'S52.009S', 'S52009S', 'S32.466G', 'S32466G', 'H44.139', 'H44139', 'H35.732', 'H35732')
OR romeo.juliet10 IN ('S66.303S', 'S66303S', 'S52.009S', 'S52009S', 'S32.466G', 'S32466G', 'H44.139', 'H44139', 'H35.732', 'H35732')
OR romeo.juliet11 IN ('S66.303S', 'S66303S', 'S52.009S', 'S52009S', 'S32.466G', 'S32466G', 'H44.139', 'H44139', 'H35.732', 'H35732')
OR romeo.juliet12 IN ('S66.303S', 'S66303S', 'S52.009S', 'S52009S', 'S32.466G', 'S32466G', 'H44.139', 'H44139', 'H35.732', 'H35732')
OR romeo.juliet13 IN ('S66.303S', 'S66303S', 'S52.009S', 'S52009S', 'S32.466G', 'S32466G', 'H44.139', 'H44139', 'H35.732', 'H35732')
OR romeo.juliet14 IN ('S66.303S', 'S66303S', 'S52.009S', 'S52009S', 'S32.466G', 'S32466G', 'H44.139', 'H44139', 'H35.732', 'H35732')
OR romeo.juliet15 IN ('S66.303S', 'S66303S', 'S52.009S', 'S52009S', 'S32.466G', 'S32466G', 'H44.139', 'H44139', 'H35.732', 'H35732')
OR romeo.five IN ('S66.303S', 'S66303S', 'S52.009S', 'S52009S', 'S32.466G', 'S32466G', 'H44.139', 'H44139', 'H35.732', 'H35732'))));
这是explain analyze生成的查询计划。如您所见,正在对 Romeo 应用并行 Seq 扫描。
Gather (cost=1000.000..2459531.510 rows=14964 width=9) (actual time=734.439..11268.059 rows=376 loops=1)
Workers Planned: 2
Workers Launched: 2
-> Parallel Seq Scan on romeo (cost=0.000..2457035.110 rows=6235 width=9) (actual time=741.013..11256.264 rows=125 loops=3)
Filter: (((juliet1)::text = ANY ('three'::text[])) OR ((juliet2)::text = ANY ('three'::text[])) OR ((juliet3)::text = ANY ('three'::text[])) OR ((juliet4)::text = ANY ('three'::text[])) OR ((juliet5)::text = ANY ('three'::text[])) OR ((juliet6)::text = ANY ('three'::text[])) OR ((juliet7)::text = ANY ('three'::text[])) OR ((juliet8)::text = ANY ('three'::text[])) OR ((juliet9)::text = ANY ('three'::text[])) OR ((juliet10)::text = ANY ('three'::text[])) OR ((juliet11)::text = ANY ('three'::text[])) OR ((juliet12)::text = ANY ('three'::text[])) OR ((juliet13)::text = ANY ('three'::text[])) OR ((juliet14)::text = ANY ('three'::text[])) OR ((juliet15)::text = ANY ('three'::text[])) OR ((five)::text = ANY ('three'::text[])))
Rows Removed by Filter: 4774850
Planning time: 0.533 ms
Execution time: 60030.289 ms
表上所有索引的索引语句。
CREATE INDEX juliet1_idx_pd_activity ON pd_activity (juliet1);
CREATE INDEX juliet2_idx_pd_activity ON pd_activity (juliet2);
CREATE INDEX juliet3_idx_pd_activity ON pd_activity (juliet3);
CREATE INDEX juliet4_idx_pd_activity ON pd_activity (juliet4);
CREATE INDEX juliet5_idx_pd_activity ON pd_activity (juliet5);
CREATE INDEX juliet6_idx_pd_activity ON pd_activity (juliet6);
CREATE INDEX juliet7_idx_pd_activity ON pd_activity (juliet7);
CREATE INDEX juliet8_idx_pd_activity ON pd_activity (juliet8);
CREATE INDEX juliet9_idx_pd_activity ON pd_activity (juliet9);
CREATE INDEX juliet10_idx_pd_activity ON pd_activity (juliet10);
CREATE INDEX juliet11_idx_pd_activity ON pd_activity (juliet11);
CREATE INDEX juliet12_idx_pd_activity ON pd_activity (juliet12);
CREATE INDEX juliet13_idx_pd_activity ON pd_activity (juliet13);
CREATE INDEX juliet14_idx_pd_activity ON pd_activity (juliet14);
CREATE INDEX juliet15_idx_pd_activity ON pd_activity (juliet15);
解决方案
推荐阅读
- javascript - 如何将数组中的值推入存在于状态对象内部的反应中
- flutter - 多个 Flutters Ios 崩溃
- android - 在 Jetpack Compose 中确定键盘是否存在并相应更改布局
- javascript - 在不改变对象结构的情况下解析 json
- java - 如何在小数点前舍入 BigDecimal?
- deep-learning - 如何在 Tensorboard 中可视化图神经网络的模型图
- html - ios Swiftsoup 设置图片
- tcp - 使用 Jacobson-Karels 算法的 SRTT
- sql - 删除没有不同的重复值并更改为 NULL 值
- android - 在 android 中使用 U2Net 模型获取裁剪的图像位图