我有一个表,它有一个名为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;
任何见解,不胜感激。
谨致问候。
在这种情况下,
- 对主表使用"偶数"分布,这将允许视差。(dateid将是一个糟糕的候选者(
- 对dateid表使用"all"分布(较小的表您加入(
一般来说,"偶数"分发是一个不错的选择,除非您需要将大型表连接在一起,否则会给您带来最佳结果。
参见https://docs.aws.amazon.com/redshift/latest/dg/c_choosing_distrongort.html