如果不提供更多详细信息,很难回答:您是否分析了表格?你在每张桌子上的 col1 上有一个索引吗?你数了多少行?
话虽如此,您的查询没有太多潜在的查询计划。您可能有两个哈希连接在一起的 seq 扫描,这大约是您能做的最好的......如果您有大量的行,您将计算出无数行,这需要时间。
也许您可以以不同的方式重写查询?如果每个 B.col1 都在 A.col1 中,则无需加入即可获得相同的结果:
select count(distinct col1) from B
如果 A 具有低基数,则依赖 exists() 可能更快:
with vals as (
select distinct A.col1 as val from A
)
select count(*) from vals
where exists(select 1 from B where B.col1 = vals.val)
或者,如果您知道 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 都持有参考值。