Azure-Sql-Data-Warehouse

減少數據移動的最佳實踐 Azure 數據倉庫

  • July 28, 2017

我在 Employee_Key 上有一個帶有 HASH 的表,它還包含一個 Date_From 和 Date_To。

要建構事實,我需要在 by_date 列上進行更改。

但是,在 Azure DataWarehousing 中使用盡可能少的 DataMoving 的最佳做法是什麼。

我已經嘗試使用 INNER JOIN 到 ROUND_ROBIN 中的 Dates 表,或者嘗試將所有日期放在視圖中(使用僅呼叫 sys.objects 的技巧),..所有工作但……不確定由於 60 個節點之間的數據移動​​,性能的更好方法是什麼…

有什麼建議 ?

這裡表的某些部分…

CREATE TABLE [edw_hr_temp].[DIM_EMPLOYEE]
(
   [EMP_UID] [BIGINT] NULL,
   [EMP_BK] [CHAR](8) NULL,
   [EMP_DATE_FROM] [DATE] NULL,
   [EMP_DATE_TO] [DATE] NULL,
)
WITH
(
   DISTRIBUTION = HASH ( [EMP_BK] ),
   CLUSTERED COLUMNSTORE INDEX
)

第一個選項是一個真實的日期表

CREATE TABLE [bi_msft].[ALL_DATES]
(
   [ADATE] [DATE] NULL
)
WITH
(
   DISTRIBUTION = ROUND_ROBIN,
   CLUSTERED COLUMNSTORE INDEX
)

第二個選項在儲存過程使用者中,作為將其儲存在#tempTable 中的子查詢

 SELECT d
   FROM (SELECT d = DATEADD(DAY, rn - 1, @FROM_DATE)
           FROM (SELECT TOP (DATEDIFF(DAY, @FROM_DATE, @TO_DATE)) 
                        rn = ROW_NUMBER() OVER (ORDER BY s1.[object_id])
                   FROM sys.all_objects AS s1
                        CROSS JOIN sys.all_objects AS s2
                  ORDER BY s1.[object_id]
                ) AS x
        ) AS y;

所以基本上我的問題是,當使用第二個變體時,這個查詢是否會在每個節點上執行,所以不需要數據移動它會在一個節點上執行並且都會被移動……

對於 Azure SQL 數據倉庫,除非您擁有數百萬條記錄,否則您不太可能真正受益於聚集列儲存索引。事實上,這甚至可能對性能有害。對於較小的捲表,使用堆(用於快速載入)或聚集索引可能會更好。 ROUND_ROBIN至少會確保均勻分佈。如果您確實計劃散列分佈您的表,請確保您選擇的散列列將給出均勻分佈,即具有大量不同的值。EMP_BK例如什麼?

我通常會建議有一個表來儲存日期,而不是一些技巧構造。該表可能會更好地擴展。由於數據類型是日期,因此該表中似乎不太可能有足夠的行來證明聚集列儲存的合理性。改用聚集索引試試這個。

閱讀本文中的“散列分佈大表”部分:

https://docs.microsoft.com/en-us/azure/sql-data-warehouse/sql-data-warehouse-best-practices

就像觀察一樣,表中的所有列都可以為空,這對維度模型不利(您不能在 上建構多維數據集NULLs)並且通常不代表良好的數據建模。

如果您遇到真正的性能問題,請考慮發布EXPLAIN計劃並了解表中的行數和數據類型。如前所述,對於較大的表,為了避免數據移動,散列將表分佈在同一列上。

僅供參考 -您現在可以使用複製表,因此這可能是您對此類較小維度表的最佳選擇。

引用自:https://dba.stackexchange.com/questions/170684