Sql 在红移中永远运行的简单查询
我正在红移中运行一个简单的查询,其中源表有2600万条记录,而另一个表有120k条记录。一个问题是,这两个表之间没有直接的关系,所以我使用了另一个外键,这在这两个表中都很常见,用于进行连接。当我给出一个限制时,查询将在几秒钟内完成,但是当无限制运行时,它将永远运行Sql 在红移中永远运行的简单查询,sql,amazon-web-services,amazon-redshift,Sql,Amazon Web Services,Amazon Redshift,我正在红移中运行一个简单的查询,其中源表有2600万条记录,而另一个表有120k条记录。一个问题是,这两个表之间没有直接的关系,所以我使用了另一个外键,这在这两个表中都很常见,用于进行连接。当我给出一个限制时,查询将在几秒钟内完成,但是当无限制运行时,它将永远运行 `select a.person_name, b.city from persons a left outer join address b on a.zip_code= b.zip_code` `QUERY PLAN XN
`select a.person_name, b.city from persons a left outer join address b on a.zip_code= b.zip_code`
`QUERY PLAN
XN Hash Left Join DS_BCAST_INNER (cost=1559.11..39246081357.77 rows=224197624453 width=15)
Hash Cond: ("outer".zip_code = "inner".zip_code)
-> XN Seq Scan on persons a (cost=0.00..269134.10 rows=26913410 width=16)
-> XN Hash (cost=1247.29..1247.29 rows=124729 width=15)
-> XN Seq Scan on address b (cost=0.00..1247.29 rows=124729 width=15)`
Any help would be appreciated.
您可能有一堆在两个表中都有重复值的邮政编码。您可以通过
联接计算中间表的大小,方法是:
select sum(p.cnt * a.cnt)
from (select zip_code, count(*) as cnt
from persons
group by zip_code
) p join
(select zip_code, count(*) as cnt
from address
group by zip_code
) a
on p.zip_code = a.zip_code;
您可能会发现,这实际上生成了数十亿行——如果不是更多的话。这就是为什么查询要花这么长时间
您需要适当的join
条件来解决问题