【发布时间】:2018-11-28 08:40:09
【问题描述】:
我有一个表,其中有一个名为 ID 的标识列和另一个名为 DateID 的列,该列引用另一个表。
日期列用于连接,但 ID 列具有更多基数。
ID 列的不同计数:657167 DateID 列的不同计数:350
任何人都可以就哪一列作为分发密钥的更好选择提供任何见解吗?
*另外关于另一个问题: 我在选择表中的 sort 和 dist 键时进退两难。 排序键 选择排序键时是否应该考虑基数?
- 将与其他表连接的列将成为排序键的候选者,我的假设是否正确?
- 如果我使用复合排序键并使用两列,那么列的顺序是否重要?
- 如果我将 DateID 列定义为 dist 键,我应该在定义复合排序键时将 DateID 放在 customerId 前面吗?*
另一个问题合并到这个旧问题,因为它们是相关的。
附:我读了一些关于选择 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 列的表,它们与日期表本身以及其他表连接。你会推荐使用按 dateID 列均匀分布吗?
-
是的“偶数”分布 - 请注意,“偶数”分布不需要列
-
多个大表之间是否有任何大连接?
-
我的表中的数据高达 1000 万(多个表的数据量如此之大),我不确定什么会被认为是一个大表,请您提供您的见解吗?在我的帖子中的示例中,日期表包含大约 700 行,而事实表包含大约 600K 记录。鉴于这样的记录,我什至应该使用 dist 键吗?。
标签: amazon-redshift