我正在设计一个红移表,它将存储大量的anlaytic数据,这些数据将跨越很长的时间范围。
相关架构如下:
CREATE TABLE analytics (
user_id VARCHAR(30),
ts TIMESTAMPTZ,
)
diststyle even;
我正在根据两个查询模式选择排序键:
# 1: select a bounded time range of recent data for a client (high perf priority)
SELECT * FROM analytics WHERE user_id = foo and ts > month_start and ts <= month_end;
# 2: select all events for a client (can be slower):
SELECT * FROM analytics WHERE user_id = foo;
我正在决定排序键并考虑:
选项1:
sortkey(user_id, ts);
选项2:
sortkey(ts, user_id);
选项3:
interleaved sortkey (ts, user_id);
选项1首先具有client_id优势,可以协助两个查询。但是,我怀疑选项2可能会更好,因为基于时间的查询对于时间范围查询模式来说似乎更优,并且可以更精细地切片数据。最后,我可以选择3平衡两个用例。
我的问题是:
对此处的表现形象的任何其他想法表示赞赏。阅读亚马逊文档并没有给我足够的背景来理解这里的相对性能权衡。
答案 0 :(得分:0)
在大型表格中,您可以做的最重要的事情是设置分配密钥。这是Redshift用于并行查询的主要方法。如果没有分发密钥,您的临时结果必须“广播”到单个节点进行评估。 (专业提示:在解释计划中查找广播步骤并尝试消除它们。)
复合排序键在您需要时非常有用,但根据我的经验,简单排序键的效果最佳。这里对排序关键策略进行了深入研究:https://github.com/awslabs/amazon-redshift-utils/blob/ec7257e072e56375728aab4b9b0ebe38c95beb60/src/Investigations/EarlyMaterialization.md
我建议如下:
CREATE TABLE analytics
( user_id VARCHAR(30)
,ts TIMESTAMPTZ
)
DISTSTYLE KEY
DISTKEY (user_id)
SORTKEY (ts)
;