Netezza/PureData - 在 HASH JOIN 中选择了错误的分布键
Netezza/PureData - Bad distribution key chosen in HASH JOIN
我正在使用 Netezza/Pure 数据进行查询。我在 A 和 B 两列上有一个 INNER JOIN(变成了 HASH JOIN)。A 是一个分布良好的列,B 是一个分布不佳的列。出于某种原因,我的查询计划总是使用 B 而不是 A 作为该 JOIN 的分布键,这会导致巨大的性能问题。
GENERATE STATISTICS 确实有助于缓解这个问题,但由于性能限制,在每次查询之前生成 STATISTICS 是不可行的。我在批处理 运行 之前执行此操作,但不在批处理中的每个查询之间执行。
简而言之,源表具有良好的分布,但是当我加入它们时,它们选择了一个错误的分布键(实际上根本没有在源中用作分布列)。
所以我的问题是,有哪些好方法可以在不执行 GENERATE STATISTICS 的情况下影响 JOIN 中分布键的选择。我试过改变源表的分布列,但即使我确保所有偏差都小于 0.5,也没有太大作用。
您可以创建一个临时文件 table 并强制分发,以便它们都对齐,这应该会加快加入速度
解决方法是强制使用详尽计划器。
设置num_star_planner_rels = X; -- 将 X 设置为非常高。
根据 IBM Netezza 团队的说法,超过 7 个实体(表的数量)的查询将使用名为 "Snowflake" 的贪婪查询计划器。在 7 个或更少实体时,它将使用蛮力方法找到最佳计划。
权衡是穷举搜索对于大量实体来说非常昂贵。
我正在使用 Netezza/Pure 数据进行查询。我在 A 和 B 两列上有一个 INNER JOIN(变成了 HASH JOIN)。A 是一个分布良好的列,B 是一个分布不佳的列。出于某种原因,我的查询计划总是使用 B 而不是 A 作为该 JOIN 的分布键,这会导致巨大的性能问题。
GENERATE STATISTICS 确实有助于缓解这个问题,但由于性能限制,在每次查询之前生成 STATISTICS 是不可行的。我在批处理 运行 之前执行此操作,但不在批处理中的每个查询之间执行。
简而言之,源表具有良好的分布,但是当我加入它们时,它们选择了一个错误的分布键(实际上根本没有在源中用作分布列)。
所以我的问题是,有哪些好方法可以在不执行 GENERATE STATISTICS 的情况下影响 JOIN 中分布键的选择。我试过改变源表的分布列,但即使我确保所有偏差都小于 0.5,也没有太大作用。
您可以创建一个临时文件 table 并强制分发,以便它们都对齐,这应该会加快加入速度
解决方法是强制使用详尽计划器。
设置num_star_planner_rels = X; -- 将 X 设置为非常高。
根据 IBM Netezza 团队的说法,超过 7 个实体(表的数量)的查询将使用名为 "Snowflake" 的贪婪查询计划器。在 7 个或更少实体时,它将使用蛮力方法找到最佳计划。
权衡是穷举搜索对于大量实体来说非常昂贵。