簡體   English   中英

使用 WHERE 和 GROUP BY 為 AWS Redshift 表選擇 sortkeys 和 distkeys

[英]Selecting sortkeys and distkeys for an AWS Redshift table with WHERE and GROUP BY

給出這樣的查詢

with
  user_id, aggregate metrics
from
  table
where
  date < end_time and date >= start_time
group by
  user_id

我的 sortkey 和 dist key 應該是什么?

根據我在網上閱讀的文章, date的排序鍵最有意義,因為我們需要過濾掉不相關的數據。 但我不確定如何/是否可以通過將user_id添加到 sortkey 或 distkey 來優化 user_id 上的分組。

user_id添加到 distkey 的一個潛在問題是,由於該列中的分布嚴重不均勻,某些節點可能需要更長的時間並最終增加查詢所用的時間。

您的排序關鍵標准聽起來是正確的。 請注意,查詢中的“start_time”和“end_time”需要是文字日期或時間戳值,以便查詢優化器利用表元數據進行初始過濾。 還需要分析該表,以便元數據有效。

至於分布鍵,您可以尋找其他列,這些列可以在表傾斜方面充當更好的分布鍵,但仍與 user_id 關聯良好以提供性能優勢。 如果不存在,你可以做一個——當它足夠重要時,我已經為客戶做了幾次。 這是如何發揮作用的一個例子:

  1. 在你的表中創建一個新列,我們稱之為 __user_id_percentile(我喜歡用雙下划線開始“人工”列,以使其與真實數據列區分開來)
  2. 用 1-100 的值填充此列(如果集群較大,則為 1-10,000),這樣每個 user_id 值僅對應一個 __user_id_percentile 值,並且每個 __user_id_percentile 的行數大致相等
  3. 使 __user_id_percentile 成為表的 dist key - 這將導致表的平衡分布和 user_id 的每個值僅存在於單個切片上
  4. 將 __user_id_percentile 添加到您的分組列表 - “group by __user_id_percentile, user_id”。 您不需要在 select 列表中包含此新列,只要 user_id 不存在於 2 個或更多 __user_id_percentiles 中,它就不會影響查詢的 output
  5. 您可能希望在表中保留 user_id 到 __user_id_percentile 的映射,以便您的 ETL 過程可以快速填充此值。 此外,如果新數據開始扭曲分布,您可能需要更新此映射,但這是一個相當簡單的更新(和真空)過程,只需要很少運行

而已。 定義一個列,將每個 user_id 值保存在單個切片上,並使表保持均勻分布。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM