У меня есть таблица RedShift с хитами страниц, например, такРаспределяет ли Redshift по DISTKEY последовательно?
CREATE TABLE hits
(
user_id INT,
ts TIMESTAMP,
page VARCHAR(255)
)
SORTKEY(user_id, ts)
DISTKEY(user_id);
Поскольку я работать кучу оконных функций над user_id
, я думал, что это было бы хорошей идеей, чтобы распределить таблицу user_id
так узлов не нужно обмениваться данными с пользователями перед тем, как выполнить запрос.
Но пользователи только активны в течение некоторого времени и нумеруются последовательно. user_id и time поэтому коррелируются, поэтому всякий раз, когда я запускаю запрос, который подмножества по времени (ts
), это приведет к перекос, если Redshift также будет распределяться по user_id
последовательно. Это будет менее проблематичным, если оно будет распределено случайно DISTKEY
. Мой вопрос: не так ли?
(я новичок в RedShift так что все это может быть просто общее непонимание того, как работают вещи в целом. В этом случае извинения заранее!)
Просто, чтобы понять это немного лучше: Если у меня есть две отдельные таблицы, которые имеют одинаковые имена и типы столбцов и которые разделяют некоторые значения в одном из столбцов. Если я установил этот столбец как DISTKEY, будут ли строки, имеющие одинаковое значение в DISTKEY, на том же узле независимо от таблицы, в которой они находятся? – RoyalTS
Я верю, что это правда, но я не могу найти документацию, которая конкретно говорит об этом. Значение передается через хеш-функцию, которая затем распределяет контент по узлам. Имя столбца не обязательно должно совпадать, оно использует только значение поля. –
@RoyalTS да, строки с одинаковыми значениями DISTKEY заканчиваются на одних и тех же узлах, что позволяет объединить объединение. См. Раздел [query plan] (https://docs.aws.amazon.com/redshift/latest/dg/c-the-query-plan.html), особенно раздел о типах соединений, для информации о 'merge' vs 'hash' присоединяется. –