复合排序键与排序键
Posted
技术标签:
【中文标题】复合排序键与排序键【英文标题】:Compound Sort Key vs. Sort Key 【发布时间】:2018-10-17 10:32:18 【问题描述】:让我问一下有关 redshift sortkey 的其他问题。 我们打算用 WHERE 语句中经常使用的列来设置 sortkey。
到目前为止,我们系统的最佳组合似乎是: DISTSTYLE EVEN + COMPOUND SORTKEY + COMPRESSED 列(第一个 SortKey 列除外)
只是想知道哪个更好,简单的 SORTKEY 或 COMPOUND SORTKEY 用于我们的 BI 表,可以根据用户的分析进行多样化的查询。
例如,我们在几个查询的 WHERE 语句中按频率设置复合排序键如下。
COMPOUND SORTKEY
(
PURCHASE_DATE <-- set as first sort key since it's date column.
STORE_ID,
CUTOMER_ID,
PRODUCT_ID
)
但有时在实际查询中只能查询“PRODUCT ID”,不能与其他列出的排序键一起查询,也不能与 COMPOUND KEY 顺序不同的查询。
在那种情况下,请问'COMPOUND SORTKEY'可能没用还是简单的SORT KEY可以更有效......?
如果您能告诉我您的想法和经历,我将不胜感激。
【问题讨论】:
【参考方案1】:Amazon Redshift 的简单规则是:
在最常与JOIN
一起使用的列上使用 DISTKEY
在最常与WHERE
一起使用的列上使用 SORTKEY
您是正确的,只有当PURCHASE_DATE
包含在WHERE
中时才会使用上述复合排序键。
另一种方法是使用交错排序键,它为许多列赋予相同的权重,并且可以在WHERE
中经常使用不同字段的地方使用。但是,交错排序键比 VACUUM
慢得多,而且很少值得使用。
因此,希望在您的大多数查询中使用 SORTKEY,但不要太担心其他查询,除非您遇到一些特定的性能问题。
见:Redshift Sort Keys - Choosing Best Sort Style | Hevo Blog
【讨论】:
再次感谢@John Rotenstein。感谢您的链接,我了解交错排序键现在是什么样的。我们正在进一步验证 DIST/SORTKEY 的适当组合是否适合我们的系统。【参考方案2】:您的复合排序键对我来说看起来很合理。重要的是要了解 Redshift 排序键不是索引,它使用或未使用。 排序键用于物理排列磁盘上的数据。
查询优化器通过在查询执行期间查看每个块的“区域图”(最小值和最大值)来“使用”排序键。这发生在所有列无论它们是否在排序键中。
复合排序键中的辅助列在减少必须从磁盘扫描的数据方面仍然非常有效,尤其是在列值低基数时。
查看前面的示例以检查排序键有效性的查询:Is my sort key being used?
请查看我们的有效设计表格指南:"Amazon Redshift Engineering’s Advanced Table Design Playbook"。该指南讨论了交错排序键的正确使用,但请注意它们只应在非常特定的情况下使用。
【讨论】:
我真的很感谢您再次提供有用的指导,@Joe Harris。听到辅助列仍然有用,尤其是它们的基数低,我松了一口气,因为我们的 BI 系统应该尽可能确保多样化的查询。我查看了您介绍的剧本并再次验证我们的系统。以上是关于复合排序键与排序键的主要内容,如果未能解决你的问题,请参考以下文章
SQLite - 每个组的第一个 - 复合顺序和相反的排序顺序
初学者必备:MySQL的主键,外键与唯一约束设置(点赞!!!)