Vertica中的JOIN失败,“内部分区不适合内存”

时间:2012-10-18 16:50:46

标签: database join vertica

我对10个连接表中的大查询有问题。我正在将数据从广泛的事实表(f1)迁移到星型模式中。我首先从f1填充维度表,然后用新的事实表(f2)填充维度表以获得相应的ID。

不幸的是我收到了一个错误,“内部分区不适合内存”。从日志中我看到:

2012-10-18 16:20:31.607 Init Session:0x2aac6c02b250 [EE] <INFO>   ENABLE_JOIN_SPILL may allow this query to run, with reduced performance 
2012-10-18 16:20:31.607 Init Session:0x2aac6c02b250 [EE] <INFO> Query Retry action: Setting add_vertica_options('EE','ENABLE_JOIN_SPILL');

但是这不起作用,因为后来我得到了:

2012-10-18 16:23:31.138 Init Session:0x2aac6c02b250 [EE] <INFO>   Join ((public.owa_search_term_dim x public.page_impressions_with_session) using owa_search_term_dim_projection_node0001 and previous join (PATH ID: 7)) inner partition did not fit in memory; value 
2012-10-18 16:23:31.138 Init Session:0x2aac6c02b250 [EE] <INFO> Query Retry action: Swapping join order with override: 1|7|0

这种情况持续了一段时间,而Vertica显然试图找到一种方法来执行连接,但最终会因为连接不适合内存而出现错误。

是否有关于如何最小化执行连接所需的内存或为什么溢出到磁盘不起作用的提示?我可以处理性能损失,我只需要能够执行查询。

2 个答案:

答案 0 :(得分:6)

我为解决这个错误所做的事情......

  • 重写查询
    有时初始查询没有尽可能优化。我接近这个的方法之一是使用子查询。
  • 使用临时表
    通过使用临时表,我必须生成的一些报告非常有效。这是使用子查询的更“极端”版本。
  • 其他过滤器
    有时候,添加额外的过滤器并确保将它们推送到连接的表格之类的小事情将使5分钟OOM查询和30秒工作查询之间产生差异。
  • 限制数据 多个步骤执行多个数据子集。与其他过滤器非常相似,执行数据子集可减少Vertica将使用的资源量,从而可以成功执行。我经常这样做基于日期的聚合;我按天 - >月 - >年进行。这个子集从未失败过,当简单地聚合年份时,我最终会得到准确的年度汇总。
  • 预测
    使用针对此定制的查询特定投影可以使Vertica使用更少的资源。
  • 解释计划
    通过解释计划,我获得了两个主要的好处 A) 确保Vertica正在使用预期的投影。例如,查询特定投影以优化性能。如果我发现它们不是,我可以查看我对查询的期望和假设 B) 检查所有表格是否都应用了最大过滤器。在我的一些较复杂的子查询中,我发现Date列未被正确地推送到所有的表格。一旦我纠正了这个,性能提高了一个数量级(见上面5分钟到30秒)。

使用这些步骤,我没有遇到任何无法获得结果的情况。有时需要一段时间。我有一组查询泵入一系列14个临时表,结束于一个非常小的结果集;但由于必须完成原始的运算量,因此需要花费超过15分钟才能运行。

答案 1 :(得分:0)

Nija的答案是更好的答案,但这里有一个建议要考虑:获得更多的记忆。有时你会超出你的系统。

他建议使用临时表是我过去使用过的,但是我很久没有遇到过这个问题了。但那是因为我们的系统没有做很多连接。