У меня есть таблица, в которой есть столбец Identity с именем ID и другой столбец с именем DateID, который ссылается на другую таблицу.
Столбец даты используется в соединениях, но столбец ID имеет гораздо больше элементов.
Отличительный счетчик для столбца ID: 657167 Отличный счетчик для столбца DateID: 350
Может ли кто-нибудь предоставить какие-либо сведения о том, какой столбец будет лучшим выбором для ключа распределения?
* Также относительно другого вопроса: у меня есть дилемма в выборе сортировки и ключей дистрибутива в моей таблице.Ключи сортировки Должен ли я учитывать количество элементов при выборе ключа сортировки?
- Столбец, который будет объединяться с другими таблицами, будет кандидатом на ключ сортировки. Правильно ли мое предположение?
- Если яиспользовать составной ключ сортировки и использовать два столбца, имеет ли значение порядок столбцов?
- Если я определю столбец DateID как ключ dist, я должен поставить DateID перед customerId при определении составных ключей сортировки? *
другой вопрос объединился с этим старым вопросом, поскольку они связаны между собой.
PS Я прочитал несколько статей о выборе dist key, и они сказали, что я должен использовать столбец, которыйиспользуется в соединении с другими таблицами и имеет большую мощность.
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;
Любые идеи высоко ценится.
С уважением.