Postgresql 使用联接查询检索行

Postgresql 使用联接查询检索行,postgresql,Postgresql,我有两张这样的桌子 A B ---- ------- col1 col2 col1 col2 ---------- ----------- 一个表包含300k行 B表包含400k行 如果表A的col1与表B的col1匹配,我需要计算表A的col1 我写了这样一个查询: select count(distinct ab.col1) from A ab join B bc on(ab.col1=bc.col1) 但这需要太

我有两张这样的桌子

A             B
----          -------       
col1  col2    col1   col2
----------    -----------
一个表包含300k行 B表包含400k行

如果表A的col1与表B的col1匹配,我需要计算表A的col1 我写了这样一个查询:

select count(distinct ab.col1) from A ab join B bc on(ab.col1=bc.col1)
但这需要太多时间

您可以尝试通过以下方式进行分组。。。 还要确保col1在两个表中都建立了索引

SELECT COUNT (col1 )
FROM
(
SELECT aa.col1
FROM A aa JOIN B bb on aa.col1 = bb.col1
GROUP BY (aa.col1)
)

如果你不提出更多的细节就很难回答:你分析了表格了吗?每个表上都有col1的索引吗?你数了几行

也就是说,您的查询没有那么多潜在的查询计划。您可能有两个散列连接在一起的seq扫描,这是您所能做的最好的。。。如果你有大量的行数,你会数到无数行,这需要时间

也许您可以以不同的方式重写查询?如果每个B.col1都在A.col1中,则在没有联接的情况下可以得到相同的结果:

select count(distinct col1) from B
如果A的基数较低,则依赖exists()可能会更快:

或者,如果您知道A.col1中所有可能的值,并且该值相当小,则可以在根本不查询A的情况下取消对数组的测试:

select count(*) from unnest(Array[val1, val2, ...]) as vals (val)
where exists(select 1 from B where B.col1 = vals.val)

反之亦然,在上述每种情况下,如果每个B都有参考值。

我在两列上都创建了btree indexe,还尝试了您的查询…这也会花费太多时间请为您的查询类型显示
解释分析
答案,在前两段之后突出显示的各种查询只会在非常具体的情况下产生您所寻找的结果,这取决于您的模式和数据。另外,顺便说一句,如果没有在我的答案开始时发布所要求的信息,就没有空间提供更好的答案。
select count(*) from unnest(Array[val1, val2, ...]) as vals (val)
where exists(select 1 from B where B.col1 = vals.val)