我有一个关于错误的问题:“超出了每个段的工作文件数量限制”
我知道这个错误是在大量数据溢出时产生的 到磁盘,并且创建了太多工作文件。原因之一是大 在 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 会溢出” 也许有人有关于基本数据库操作的更复杂描述的链接?
请按照以下步骤操作
> set optimizer=off;
> Run your Query
> set optimizer=on;
有时,优化器没有为我们的查询制定一个好的计划,然后 Greenplum 会生成许多工作文件,从而出现此错误。