2011-02-23 76 views
1

我是設計ETL過程的新手。目前我有兩個數據庫,一個是應用程序每天使用它的實時數據庫。另一個是數據倉庫。如何在執行ETL過程時減少對OLTP的影響

我在活動數據庫中有一張表,它定期插入新的數據。目標是每天晚上ETL過程會將實時數據庫中的數據傳輸到數據倉庫,然後刪除實時數據庫中的數據。

由於缺乏知識,我得到的解決方案是實現一些稱爲滾動表的方法。基本上在現場數據庫,我有兩個具有相同結構的表。我稱他們爲tblLive1tblLive2。我也有一個同義詞叫tblLive。所有插入都在同義詞上完成。同義詞將指向其中一個表格。

當我運行ETL過程時,我有一個存儲過程會丟棄並創建一個新的同義詞,指向tblLive2。這允許ETL過程在不影響應用的情況下轉換來自tblLive1的數據。假定ETL過程需要一個小時才能運行,並且我不希望ETL過程鎖定表,阻止應用程序向它插入新數據。

該解決方案應該在理論上工作,但不夠優雅。

我相信這個問題是一個常見問題,有沒有其他的解決方案呢?

+0

你正在使用哪個數據庫以及該數據庫的哪個版本?答案很可能取決於數據庫的高度依賴性,除非您真的需要嘗試創建數據庫不可知解決方案的開銷。 – 2011-02-23 20:53:20

+0

我現在正在使用SQL Server,但這個概念也適用於Oracle。 – dsum 2011-02-24 02:03:19

回答

1

要添加到Bob的答案(上圖),它是在數據倉庫/商業智能應用程序通常,所有必要的表基本上覆制到「升級」數據庫或「分期」 DWH數據庫中的架構(取決於表的數量/大小等)。這些通常位於與OLTP系統不同的服務器上 - 對於任何大小的DWH實現)

要回答關於性能影響的問題,它取決於您的服務器規格/ io配置。

數據是否正在插入OLTP系統24小時/天?還是有停機時間?或交通流量低?

使用數據庫壓縮可能是值得的,因爲IO將成爲您最大的敵人,這將有相當大的幫助。

+0

交通擁堵時間很短。所以絕對是我們執行ETL過程的時候。感謝您的建議,我認爲可能首先在OTLP db中創建快照副本,然後將它們移動到DWH,然後執行Transformationon DWH。 目前,ETL過程的設計使得轉換可以在C#應用程序中完成,也可以在存儲過程中完成。此存儲過程存儲在DWH中,但它動態訪問OLTP和DWH以執行ETL。 – dsum 2011-02-26 00:23:12

0

將表讀入臨時區域並處理臨時表。您通常希望在生產系統上花費盡可能少的時間。特別是如果它正在使用。

您可能還想查看使用由觸發器加載的表。或變更數據捕獲,如果你在SQL 2008

+0

是的,我的目標是在生產系統上花費盡可能少的時間來減少對系統的影響。對於臨時表,這是一種臨時表嗎? 我正在使用SQL 2008.我需要執行ETL的表格範圍從100k到2000k行。安能辨什麼是對性能的影響會是什麼樣子,如果我的ETL過程讀讀100K +行,其中標識數量少於特定數量,同時我插入30+排表中每一秒兼任。 – dsum 2011-02-25 05:47:02

+1

將200萬行拖入分段只需幾分鐘。我在4分鐘內通過我的筆記本電腦和4GB RAM將150萬行數據從開發盒中拖到了SQL 2008開發箱中。所有機器都會比生產慢得多。更新性能還取決於編碼和性能調整。但是,你的音量應該沒問題。 – 2011-02-25 16:33:18

+0

感謝您的信息。它可能會改變我們如何執行ETL的策略。我假設你使用存儲過程來執行ETL,因爲它聽起來非常快。 我們使用C#,它有一個數據訪問層正在減慢ETL過程。使用C#應用程序的優點是我們可以使轉換變得複雜並且更易於調試,但是性能可能是一個問題。 – dsum 2011-02-26 00:27:02