減少數據移動的最佳實踐 Azure 數據倉庫
我在 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
計劃並了解表中的行數和數據類型。如前所述,對於較大的表,為了避免數據移動,散列將表分佈在同一列上。
僅供參考 -您現在可以使用複製表,因此這可能是您對此類較小維度表的最佳選擇。