Ключ Redshift Dist, столбец IDentity или столбец соединения?Количество элементов в столбце, используемом в рассмотрении объединения для ключа сортировки - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть таблица, в которой есть столбец 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;

Любые идеи высоко ценится.

С уважением.

1 Ответ

0 голосов
/ 28 ноября 2018

В этом случае

  1. Используйте «четное» распределение для вашей основной таблицы, это даст хороший паралеллизм.(dateid будет плохим кандидатом)
  2. Используйте «all» для вашей таблицы dateid (меньшую таблицу, к которой вы присоединяетесь)выбора и даст вам лучшие результаты, если вам не нужно объединять большие таблицы.

    см. https://docs.aws.amazon.com/redshift/latest/dg/c_choosing_dist_sort.html

...