Netezza / PureData - 在HASH JOIN中选择的错误分配键

时间:2015-01-12 20:21:22

标签: performance distribution netezza sql-execution-plan

我正在使用Netezza / Pure Data进行查询。我在两列A和B上有一个INNER JOIN(它变成了HASH JOIN).A是一个分布很好的列,B是一个分布不好的列。出于某种原因,我的查询计划总是使用B代替A作为该JOIN的分配键,这会导致巨大的性能问题。

GENERATE STATISTICS确实有助于缓解此问题,但由于性能限制,在每次查询之前生成统计数据都是不可行的。我在批处理运行之前执行此操作,但不在批处理中的每个查询之间执行。

简而言之,源表具有良好的分布,但是当我加入它们时,它们会选择一个错误的分发键(实际上它从未在源中用作分发列)。

所以我的问题是,在不执行GENERATE STATISTICS的情况下,有什么好的方法可以影响JOIN中分配键的选择。我已经尝试更改源表的分配列,但即使我确保所有偏差都小于0.5,这也没有做太多。

2 个答案:

答案 0 :(得分:0)

您可以创建临时表并强制分发以使它们都对齐,这样可以加快连接

答案 1 :(得分:0)

解决方法是强制使用详尽的计划程序。

设置num_star_planner_rels = X; - 将X设置为非常高。

据IBM Netezza团队称,超过7个实体(表格数量)的查询将使用名为“Snowflake”的贪婪查询计划器。在7个或更少的实体,它将使用蛮力方法来找到最佳计划。

权衡的是,对于大量实体而言,详尽的搜索非常昂贵。