我在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。我已经检查了计算机的性能,并没有挣扎。有没有人对如何加快查询有任何建议?我只是问过多吗?
答案 0 :(得分:0)
您可以尝试在两个表中为元组(id1,id2)创建组合索引。然后使用ON (LT.id1, LT.id2) = (ST.id1, ST.id2)
答案 1 :(得分:0)
由于这是一个左外连接,最好的办法是使用large_table
上的索引来减少早期的行数。
不幸的是,您的条件都没有检查是否相等,因此组合索引是无用的。
您可以在large_table
的三列上创建索引,并查看PostgreSQL是否使用它们(例如,使用位图无法扫描并合并结果)。
PostgreSQL选择不使用的那些索引可以再次删除。