是否更改Dist键、IDentity列或联接列?列的基数,用于排序键的联接考虑



我有一个表,它有一个名为ID的Identity列和另一个引用另一个表的名为DateID的列。

日期列用于联接,但ID列具有更多的基数。

ID列的不同计数:657167DateID列的不同计数:350

有人能提供一些见解吗?哪一列是分发密钥的更好选择?


*关于另一个问题:我在表中选择排序键和dist键时遇到了一个难题。排序键选择排序键时是否应该考虑基数?

  • 一个将与其他表连接的列将是排序键的候选者,我的假设正确吗
  • 如果我使用复合排序键并使用两列,那么列的顺序重要吗
  • 如果我将列DateID定义为dist键,那么在定义复合排序键时,我应该将DateID放在customerId前面吗*

另一个问题合并到这个旧问题,因为它们是相关的


p.S.我读过一些关于选择dist键的文章,他们说我应该使用一个用于与其他表连接的列,并且具有更大的基数。

SELECT SP.*, CP.*, TV.* FROM ( SELECT * --> there are about 20 aggregation statements in the select statement FROM FactCustomer f -- contains about 600K records JOIN DimDate d -- contains about 700 records ON f.DateID = d.DateID JOIN DimTime t -- contains 24 records ON f.TimeID = t.HourID JOIN DimSalesBranch s -- contains about 64K records ON f.BranchID = s.BranchID WHERE s.BranchID IN ( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ) AND d.DateTimeInfo >= (CASE WHEN s.OpeningDate > '2018-01-01' THEN s.OpeningDate ELSE '2018-01-01' END ) AND d.DateTimeInfo <= '2018-12-31' AND StartHour >= 9 AND starthour > 0 AND (EndHour <= 22) ) SP LEFT JOIN ( SELECT * --> there are about 20 aggregation statements in the select statement FROM FactCustomer f JOIN DimDate d ON f.DateID = d.DateID JOIN DimTime t ON f.TimeID = t.HourID JOIN DimSalesBranch s ON f.BranchID = s.BranchID WHERE s.BranchID IN ( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ) AND d.DateTimeInfo >= (CASE WHEN s.OpeningDate > '2018-01-01' THEN s.OpeningDate ELSE '2018-01-01' END ) AND d.DateTimeInfo <= '2018-09-16' AND StartHour >= 9 AND (EndHour <= 22) ) CP ON SP.StartDate = CP.StartDate_CP AND SP.EndDate = CP.EndDate_CP LEFT JOIN ( SELECT * --> there are about 6 aggregation statements in the select statement FROM FactSalesTargetBranch f JOIN DimDate d ON f.DateID = d.DateID JOIN DimSalesBranch s ON f.BranchID = s.BranchID WHERE s.BranchID IN ( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ) AND d.DateTimeInfo >= (CASE WHEN s.OpeningDate > '2018-01-01' THEN s.OpeningDate ELSE '2018-01-01' END ) AND d.DateTimeInfo <= '2018-09-16' ) TV ON SP.StartDate = TV.StartDate_TV AND SP.EndDate = TV.EndDate_TV;

任何见解,不胜感激。

谨致问候。

在这种情况下,

  1. 对主表使用"偶数"分布,这将允许视差。(dateid将是一个糟糕的候选者(
  2. 对dateid表使用"all"分布(较小的表您加入(

一般来说,"偶数"分发是一个不错的选择,除非您需要将大型表连接在一起,否则会给您带来最佳结果。

参见https://docs.aws.amazon.com/redshift/latest/dg/c_choosing_distrongort.html

最新更新