2

我有两张这样的桌子

A             B
----          -------       
col1  col2    col1   col2
----------    -----------

A 表包含 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)

但这需要太多时间

4

2 回答 2

1

如果不提供更多详细信息,很难回答:您是否分析了表格?你在每张桌子上的 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 都持有参考值。

于 2013-10-18T09:25:33.253 回答
1

可以尝试分组...同时确保 col1 在两个表中都有索引

SELECT COUNT (col1 )
FROM
(
SELECT aa.col1
FROM A aa JOIN B bb on aa.col1 = bb.col1
GROUP BY (aa.col1)
)
于 2013-10-18T09:08:08.560 回答