我有一个关于Err的问题:“超出每个段限制的工作文件数”
我知道在泄漏大量数据时会产生此错误 到磁盘,创建了太多的工作文件。其中一个原因很大 在hashjoin期间创建的哈希表。哈希表是常见的 为连接中的内部表生成,所以我无法理解以下事实:
我有左表HashJoin的两个表外一个和内一个,分布 这两个表都不是很好(外表在释放键中主要有NULL,内表在释放键中主要有''值,两个表的分配键和连接键是相同的。)
1)当我尝试连接这些没有过滤条件的表时,它会下降 带有“超出每个查询限制的工作文件数”的段,其中''值存储在内部关系中(注释中附件中的95段)。
2)我从INNER中删除所有带有连接条件的''值 有意减少HashTable的表。之后,查询显示不同的行为:如果DB加载得很高,则查询会出现错误:第10个段上的“每个段的工作文件数超出限制数”,其中存储了外部关系中的NULL。如果数据库正常加载,则执行查询时没有问题(正如您在第10段中附加溢出时所见)
3)我从OUTER和INNER表中删除了NULL和''值,它可以工作! 我想提一下,INNER表的大小仍然与示例中的相同 从外部关系中删除所有''之后的“2)”
我得出结论,OUTER表会影响到磁盘的溢出数据量。
所以问题是: 外表的大小如何影响磁盘数据的溢出量? 外表大小和HashTable之间是否存在依赖关系 尺寸? 为什么在Hash_Join中使用w_mem,除了生成HashTable?
我问这个是因为我找不到任何详细的信息,而不是HashJoin算法, 我找到的HashJoin算法和spilled_files的所有desriptions看起来像: “在OUTER表上的SeqScan期间通过Hash在Hash_table上扫描(在内部关系上生成)”和“当你有大型HashTable时spill_files溢出” 也许某人有更复杂的基本数据库操作描述的链接?