Amazon redshift 亚马逊红移负荷优化

Amazon redshift 亚马逊红移负荷优化,amazon-redshift,Amazon Redshift,我目前正在将一个主要包含web分析数据的数据库从Postgresql迁移到Redshift。我无法优化加载过程。我正在寻求关于我的模式和我使用的一般方法的反馈 下面是模式的一个小示例,它说明了我遇到的问题: CREATE TABLE dim_browser ( browser_key integer IDENTITY(-2,1) PRIMARY KEY, browser_name varchar(40) DEFAULT 'Unknown'::text NOT NULL,

我目前正在将一个主要包含web分析数据的数据库从Postgresql迁移到Redshift。我无法优化加载过程。我正在寻求关于我的模式和我使用的一般方法的反馈

下面是模式的一个小示例,它说明了我遇到的问题:

CREATE TABLE dim_browser (
    browser_key integer IDENTITY(-2,1) PRIMARY KEY,
    browser_name varchar(40) DEFAULT 'Unknown'::text NOT NULL,
    version varchar(30) DEFAULT 'Unknown'::text NOT NULL,
    row_created_at timestamp DEFAULT getdate(),
    UNIQUE(browser_name, version)
);

CREATE TABLE fact_visit (
    visit_key integer IDENTITY(-2,1) PRIMARY KEY,
    visit_uuid char(36) NOT NULL UNIQUE, -- the natural key
    universal_start_date_key integer DEFAULT 1 NOT NULL REFERENCES dim_date,
    universal_start_time_key integer DEFAULT -1 NOT NULL REFERENCES dim_time,
    universal_start_timestamp timestamp DEFAULT '1900-01-01 00:00:00'::timestamp NOT NULL,
    customer_id bigint NOT NULL,
    visitor_key integer NOT NULL REFERENCES dim_visitor,
    entry_web_page_key integer NOT NULL REFERENCES dim_web_page,
    browser_key integer DEFAULT -1 NOT NULL REFERENCES dim_browser,
    device_key integer DEFAULT -1 NOT NULL REFERENCES dim_device,
    operating_system_key integer DEFAULT -1 NOT NULL REFERENCES dim_operating_system,
    row_created_at timestamp DEFAULT getdate()
  DISTKEY(customer_id)
  SORTKEY(universal_start_date_key);
DW中的所有数据都来自一个运动流,并写入CSV。 以事实访问为例,CSV加载到Kinesis中,如下所示:

创建一个临时表fact_visit_load,它包含与fact_visit相同的列,不包括代理项键/标识列,并根据需要具有其他列以标识任何外键。例如,“事实访问加载”有“浏览器名称”和“浏览器版本”列,允许我们唯一地标识dim_浏览器记录并获取其浏览器键。CSV具有相同的模式。 将csv复制到临时表中。所有外键引用列(如browser_key)最初都为空。 从临时表中删除任何重复项。重复项由自然键识别;对于事实访问,将删除具有匹配访问ID值的记录的重复数据。 从临时表中删除已出现在主表中的所有记录,再次使用自然键。从事实访问加载中删除,其中访问ID位于从事实访问中选择访问ID 更新所有外键。这涉及到几个查询,如更新事实访问加载集浏览器键=从dim浏览器b中选择浏览器键,其中b.browser\U name=事实访问浏览器键和b.version=事实访问浏览器版本。这里有一些优化,比如尽可能在同一个查询中获得多个FK。 从临时表插入主表 此加载过程是有序的,因此依赖于其他表的表(例如,事实访问对dim_浏览器的依赖关系)将在它们所依赖的表之后加载。这确保了外键查找工作

两个瓶颈是设置外键的更新和针对主表的自然键重复数据消除

因此,我的问题是:

关于模式,像这样使用代理键是个坏主意吗?我应该始终使用自然键作为主键吗?这会影响连接的性能吗,因为我会对所有主键使用md5哈希列或UUID? 这个过程是否合理,或者如果我以这种方式加载数据,我是否在对抗红移? 如果模式和流程良好,我可以做些什么来缩短加载时间?
我不太知道从哪里开始,因为这是一个巨大的问题——虽然措辞很好,也解释得很清楚!我想你知道最重要的部分是正确的排序键和距离键。所以有两个问题1为什么要使用客户id作为distkey?2我相信有很多事情是可以改变的,但是你在这里面临的主要挑战是什么?装载时间是否太长?你能给出一些表格的尺寸/时间吗?还有-有什么原因不能从根本上改变你的dw设计吗?把桌子弄宽些等等?e、 g.很多报告都依赖于格式?客户id是dist键,因为我希望该选择的偏差最小。但是请注意,我只使用一个节点密集存储,因此dist键在这里不相关。如果我错了,请纠正我。主要的挑战是,当前加载大约需要1.5小时,而且随着数据库的增长,加载速度似乎越来越慢。要加载的最大也是最慢的表有586164861行,加载大约需要20分钟。我对从根本上改变db设计持开放态度,但希望您能提供指导,说明这些更改应该是什么,或者解释为什么需要这些更改:您在dist键上错了,这对单个节点也很重要。问题是-大多数查询是查看所有客户ID,还是仅查看1个。如果只有1,那么这是一个非常糟糕的dist键。谢谢您的更正。看起来我有几个表的dist键不正确,需要修复。除此之外,你对我原始帖子底部的三个问题有什么建议吗?我不太知道从哪里开始,因为这是一个巨大的问题——虽然措辞很好,也解释得很清楚!我想你知道最重要的部分是正确的排序键和距离键。所以有两个问题1为什么要使用客户id作为distkey?2我相信有很多事情是可以改变的,但是你在这里面临的主要挑战是什么?装载时间是否太长?你能给出一些表格的尺寸/时间吗?还有-有什么原因不能从根本上改变你的dw设计吗?把桌子弄宽些等等?e、 g.很多报告都依赖于格式?客户id是dist键,因为我希望该选择的偏差最小。但是请注意,我只使用一个节点密集存储,因此dist键在这里不相关。如果我错了,请纠正我。主要的挑战是,当前加载大约需要1.5小时,而且随着数据库的增长,加载速度似乎越来越慢。要加载的最大也是最慢的表有586164861行,加载大约需要20分钟
. 我对从根本上改变db设计持开放态度,但希望您能提供指导,说明这些更改应该是什么,或者解释为什么需要这些更改:您在dist键上错了,这对单个节点也很重要。问题是-大多数查询是查看所有客户ID,还是仅查看1个。如果只有1,那么这是一个非常糟糕的dist键。谢谢您的更正。看起来我有几个表的dist键不正确,需要修复。除此之外,你对我原来帖子底部的三个问题有什么建议吗?