优化Redshift性能以进行分组操作

时间:2019-09-23 12:29:58

标签: database-design amazon-redshift

我目前正面临一个挑战,一个简单的“分组依据”大约需要2分钟。这是我做的:

  1. 我创建一个表格
create table devdb.raw_external_listings.pq_base_account_table
(
sap_id varchar(50) 
,account_name nvarchar(max) 
,Lead_source_code smallint not null
,company_id nvarchar(50) 
,company_name nvarchar(max) 
,description nvarchar(max) 
,Lead_source_name nvarchar(max) 
,Source_Code nvarchar(50) not null
,Source_Name nvarchar(max) 
,source_country varchar(20) 
,business_model varchar(20) 
,posting_ID bigint not null
,Date_Posted date  not null 
,posted_year int not null
,posted_month int not null
,Work_Type varchar(max) 
,Job_Country varchar(20) 
,joblocation nvarchar(max) 
,class_id int 
,unique_clid varchar(max) not null  sortkey
--,unique_clid bigint not null  sortkey
,ultimate_parent_sap_id varchar(50) 
,ultimate_parent_name nvarchar(max)
,ultimate_legal_parent_sap_id varchar(50) 
,ultimate_legal_parent_sap_name varchar(max) 
,account_bl varchar(50) 
,postal_code varchar(50) 
,emp_resp_login varchar(50) 
,full_name nvarchar(max) 
)
  1. 我插入了数据(54mio行)
  2. 我的小组成员是
SELECT count(distinct unique_clid),count(distinct company_id), count(distinct work_type), posted_year, posted_month
FROM devdb.raw_external_listings.pq_base_account_table with (nolock)
GROUP by posted_year, posted_month
order by posted_year, posted_month

是否有一种方法可以优化这些基本聚合方法的性能?

THX 拉兹鲁(Lazloo)

2 个答案:

答案 0 :(得分:0)

Redshift中有sort_key和dist_key的概念,这对于Redshift的优化非常关键。这些键定义了如何在表的Redshift中存储数据。

在您的情况下,当前Redshift默认选择这些键,根据用户的使用情况,这些键可能有效,也可能无效。请通过下面的链接并相应地设计表格。

要考虑的步骤 https://docs.aws.amazon.com/redshift/latest/dg/tutorial-tuning-tables.html

对于排序键: https://docs.aws.amazon.com/redshift/latest/dg/c_best-practices-sort-key.html

对于dist键: https://docs.aws.amazon.com/redshift/latest/dg/c_best-practices-best-dist-key.html

答案 1 :(得分:0)

要详细说明上面的dist键建议:

使用此设置,您同一年/月的数据分散在Redshift群集节点上。我可以想象,要计算不同的值,引擎将在每个节点上获得唯一值,但随后必须将这些列表发送到领导节点,以将它们组合成主唯一列表,最后进行计数。如果将数据分布在“年”或“月”列中,则可能会最终确定每个节点上独立的不同操作的计数,从而使过程更快。

您也可以在分组的列上对数据进行排序,但主要是分配数据。

至少对于此查询,无需按unique_clid进行排序。