优化PostgreSQL中的LEFT JOIN(PGAdmin4)

时间:2017-05-16 13:59:09

标签: postgresql

我在PostgreSQL中有2个表,其中一个是1600万行,另一个是3000左右。它们共享2个公共ID,但是较大的表有数千个相同ID的迭代。

我尝试使用以下几个条件进行LEFT JOIN:

SELECT LT.Col1, LT.Col2, LT.Col3, ST.Col1, ST.Col2
FROM large_table as LT
LEFT JOIN small_table as ST
ON LT.id1 = ST.id1 AND LT.id2 = ST.id2
WHERE LT.Col1 > 30
AND LT.Col2 > 2
AND LT.Col3 BETWEEN '11:00:00'::time AND '21:00:00'::time

我为每个表创建了基​​于id1和id2的多列索引,但查询正在运行并运行。在macbook pro 16gb RAM,2.9ghz四核i7上使用PGAdmin4。我已经检查了计算机的性能,并没有挣扎。有没有人对如何加快查询有任何建议?我只是问过多吗?

2 个答案:

答案 0 :(得分:0)

您可以尝试在两个表中为元组(id1,id2)创建组合索引。然后使用ON (LT.id1, LT.id2) = (ST.id1, ST.id2)

答案 1 :(得分:0)

由于这是一个左外连接,最好的办法是使用large_table上的索引来减少早期的行数。

不幸的是,您的条件都没有检查是否相等,因此组合索引是无用的。

您可以在large_table的三列上创建索引,并查看PostgreSQL是否使用它们(例如,使用位图无法扫描并合并结果)。

PostgreSQL选择不使用的那些索引可以再次删除。