我目前正面临一个挑战,一个简单的“分组依据”大约需要2分钟。这是我做的:
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)
)
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)
答案 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
进行排序。