簡體   English   中英

事實表分區:如何處理ETL中的更新?

[英]Fact table partitioning: how to handle updates in ETL?

我們正在嘗試為包含大約400M行的數據倉庫事實表實現表分區。 我們的ETL從前一個加載中向后50天(源行系統時間戳的新行,修改行)從源系統獲取數據。 因此,在每個ETL循環中都會有新行,以及更新Fact表中相應行的舊行。 我們的想法是在Fact表中插入新行並更新修改后的行。

分區列是date(int,YYYYMMDD),我們正在考慮按月分區。

就我而言,表分區可以通過快速分區切換操作簡化我們的插入。 我們可以拆分最近的分區以創建新的空閑分區,將新行加載到臨時表(使用日期約束,例如最近一個月),然后使用分區切換操作將新行“移動”到分區的事實表中。 但是我們如何處理應該更新Fact表中相應行的修改行? 這些行可以包含上個月的數據。 分區切換有幫助嗎? 通常INSERTUPDATE行由ETL工具(例如我們的SSIS)或MERGE語句確定。 分區在這種情況下如何工作?

我再看一下設計,試着弄清楚是否有更新的方法。 以下是更新事實表的一些含義:

性能:更新是完全記錄的事務。 大事實表也有大量的數據可供讀寫。

多維數據集:更新事實表需要重新處理受影響的分區。 隨着事實表的不斷增長,立方體處理時間也將繼續增加。

預算:快速存儲是昂貴的。 更新大事實表將需要大量快速讀寫。

純粹理論:除非初始值是錯誤(即用戶輸入15,000美元而不是1,500美元),否則不應更改事實表。 任何非錯誤情況都將改變最初記錄的事務。

有什么變化? 變化的部分真的是維度的屬性嗎? 如果是這樣,是否可以將它們移動到維度並使用“緩慢變化的維度”類型任務處理更改?

另一種可能性,這可以通過抵消交易來實現嗎? 例:

最初的InvoiceAmount是10.00美元。 會計后來增加了1.25美元的稅收,然后向客戶收取11.25美元的費用。 而不是將值更新為$ 11.25,插入1.25美元的記錄。 發票的總金額仍然是11.25美元,您可以執行最少日志記錄的插入而不是完全記錄的更新來完成。

不僅在理論上更新事實表是一個壞主意,它隨着事實表的增長而變得非常昂貴且不可擴展。 您將閱讀和編寫更多數據,從存儲子系統中需要更多IOPS。 當您准備好進行分析時,立方體處理會引發更多問題。

您還必須經常證明管理層為什么需要為數據倉庫提供如此多的IOPS。 是否有商業價值/理由需要所有這些IOPS用於不斷變化的“事實”表?

如果您無法找到事實表上的更新方法,那么至少要建立一個以只讀方式確定數據的截止點。 否則,你永遠無法擴展。

切換在這里沒有幫助。

也許您可以在不同的行范圍內使用多個線程同時執行更新。 這可能會加速它。 注意不要觸發鎖升級,以便獲得良好的並發性。

還要確保主要按聚簇索引的升序排序更新行。 這有助於磁盤IO(這種技術可能不適用於多線程)。

更新事實記錄的原因有很多,因為事實中存在非標識屬性。 除非您計划“先刪除”然后“插入”,否則您無法避免更新。 您不能簡單地說“將度量標准增量記錄為新事實”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM