复合标准的最佳红移复合排序键(时间范围+列匹配)

时间:2017-01-19 22:48:38

标签: indexing amazon-redshift

我正在设计一个红移表,它将存储大量的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平衡两个用例。

我的问题是:

  1. 选项1和选项2如何比较用例#1的性能?
  2. 交错索引在这里有意义吗?与用户案例#1的复合索引相比如何?担心加载时间增加。
  3. 对此处的表现形象的任何其他想法表示赞赏。阅读亚马逊文档并没有给我足够的背景来理解这里的相对性能权衡。

1 个答案:

答案 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)
;
相关问题