【发布时间】:2022-12-19 22:59:15
【问题描述】:
我一直在尝试优化 Postgres 12 上的这个简单查询,该查询将多个表连接到一个基本关系。它们每个都有一对一的关系,并且有 10,000 到 1,000 万行。
SELECT *
FROM base
LEFT JOIN t1 ON t1.id = base.t1_id
LEFT JOIN t2 ON t2.id = base.t2_id
LEFT JOIN t3 ON t3.id = base.t3_id
LEFT JOIN t4 ON t4.id = base.t4_id
LEFT JOIN t5 ON t5.id = base.t5_id
LEFT JOIN t6 ON t6.id = base.t6_id
LEFT JOIN t7 ON t7.id = base.t7_id
LEFT JOIN t8 ON t8.id = base.t8_id
LEFT JOIN t9 ON t9.id = base.t9_id
(实际关系比这复杂一点,但为了演示目的,这很好)
我注意到当我只执行 SELECT base.id 时查询仍然很慢,这看起来很奇怪,因为查询规划器应该知道连接是不必要的并且不应该影响性能。
然后我注意到 8 似乎是某种神奇的数字。如果我删除任何一个连接,查询时间将从 500 毫秒变为 1 毫秒。通过 EXPLAIN,我能够看到 Postgres 在连接 8 个表时只进行索引扫描,但是对于 9 个表,它开始进行顺序扫描。
即使我只执行SELECT base.id,表的数量也会以某种方式阻碍查询规划器。
【问题讨论】:
标签: postgresql join query-optimization