Hash-Join 中 OUTER 表大小对溢出数据量的影响

问题描述 投票:0回答:1

我有一个关于错误的问题:“超出了每个段的工作文件数量限制”

我知道这个错误是在大量数据溢出时产生的 到磁盘,并且创建了太多工作文件。原因之一是大 在 hashjoin 期间创建的哈希表。哈希表很常见 为连接中的内表生成,所以我无法理解以下事实:

我有两个表的Left HashJoin,外部一个和内部一个,分布 这两个表的性能都不是很好(外表的分布键主要为 NULL,内表的分布键主要为 ' ' 值,两个表的分布键和连接键相同)。

1)当我尝试在没有过滤条件的情况下连接这个表时,它会下降 在段上“超出每个查询限制的工作文件数”,其中“ ”值存储在内部关系中(注释中附件中的 95 段)。

2)我从 INNER 中删除所有具有连接条件的“ ”值 故意减少HashTable的表。之后,查询显示不同的行为:如果数据库负载较高,则查询会出现错误:第 10 段上的“超出每段工作文件数量限制”,其中存储了外部关系中的 NULL。如果数据库正常加载,则查询执行没有问题(正如您在附件中看到的,它溢出到第 10 段)

3)我从 OUTER 和 INNER 表中删除了 NULL 和 ' ' 值,它起作用了! 我想说的是,INNER 表的大小仍然与示例中的相同 从外部关系中删除所有“ ”后的“2)”

我得出一个结论,OUTER 表对溢出到磁盘的数据量有影响。

所以问题是: 外表的大小如何影响溢出到磁盘的数据量? 外表大小和HashTable之间有依赖关系吗 尺寸? 除了生成 HashTable 之外,在 Hash_Join 中使用 w_mem 有何目的?

我问这个是因为我找不到关于 HashJoin 算法的任何足够详细的信息, 我发现的 HashJoin 算法和溢出文件的所有描述如下: “在对 OUTER 表进行 SeqScan 期间,通过 Hash_table 上的哈希进行扫描(在内部关系上构建)”和“当您拥有大型 HashTable 时,spill_files 会溢出” 也许有人有关于基本数据库操作的更复杂描述的链接?

postgresql greenplum
1个回答
0
投票

请按照以下步骤操作

> set optimizer=off;
> Run your Query
> set optimizer=on;

有时,优化器没有为我们的查询制定一个好的计划,然后 Greenplum 会生成许多工作文件,从而出现此错误。

© www.soinside.com 2019 - 2024. All rights reserved.