【问题标题】:Azure Synapse: Performant way to promote data from staging schema to prod schema?Azure Synapse:将数据从暂存架构提升到生产架构的高效方法?
【发布时间】:2021-09-13 18:17:07
【问题描述】:

我使用 ADF/synapse 管道将我的事实数据从源提取到专用 sql 池中的暂存模式表。

我现在的任务是使用代理键丰富事实数据,该代理键是通过从 prod 模式中已经存在的小维度表中查找来实现的。

为此,我一直在使用 ADF/突触数据流,但它似乎效率低下,因为它将数据移回 ADF。我可以通过 spark notebook 做到这一点,但似乎也是不必要的数据移动。

所以我认为最好的方法是在专用的 sql 池上创建一个存储过程来执行这种扩充。我关心的是确保这个 sql proc 以高性能的方式编码(而不是逐行插入)。

有很多 proc 示例从无到有 (ctas) 创建表,但我还没有找到以可扩展方式执行丰富/追加操作的示例。对此有什么好的 sql 代码实践?

【问题讨论】:

    标签: azure-synapse


    【解决方案1】:

    我认为最好的做法是将您的小维度分布为REPLICATE,并使用CTAS 在合适的列上创建HASH 分布式表。如果您有足够的容量,还可以考虑进行分区切换。一个简化的例子:

    CREATE TABLE fact.yourBigTable
    WITH
    (
        CLUSTERED COLUMNSTORE INDEX,
        DISTRIBUTION = HASH( someColumn )
    )
    AS
    SELECT ...
    FROM staging. ...
    
    
    CREATE TABLE dim.yourSmallTable (
    
        ...
    
    )
    WITH
    (
        CLUSTERED INDEX ( someColumn ),
        DISTRIBUTION = REPLICATE
    );
    

    CTAS 经过优化,可在专用 SQL 池的 MPP 基础架构上正常工作。如果您觉得 CTAS 不合适,请直接查看 INSERT。专用 SQL 池现在支持 MERGE(预览版),因此也值得一看。

    我同意你不要为此使用 ADF 或数据流,因为没有什么比直接在服务器上运行一点 SQL 更快的了,我将这些东西保留给你不能用 SQL 做的事情,例如编排/运行任务并行,高级转换(例如使用笔记本)等等。

    【讨论】:

    • 感谢您的回复。是的,暗淡在分片中复制,是的,事实是在一个好的列上散列。我认为我在我的问题中没有得到很好的理解的是,这个 staging -> prod Promotion/enrichment 是一个增量负载。即事实表已经存在于产品中并且很大。新一天的数据(没有代理键)是暂存的数据,需要添加代理键才能移动到 prod。这就是我觉得 cta 不适合的原因?
    • 因此,如果 CTAS 的音量不合适,您可以尝试 INSERT / UPDATE / DELETEMERGE。您是否尝试过其中任何一个?您也可以尝试将其分为两个阶段,即使用 CTAS 创建一个添加了代理键的临时表,然后从那里进行 upsert。我会尝试几种方法,看看哪种方法最适合您的工作量。
    • 啊,我明白你在说什么 - 谢谢。我一直回避插入语句,因为它在 ADF 中的性能体验不佳(批量插入与 polybase/复制 cmd)。但可能与 sql 中已有的数据不同。我试了一下-谢谢!
    猜你喜欢
    • 2020-10-20
    • 2021-12-10
    • 2016-12-04
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 2014-07-10
    相关资源
    最近更新 更多