2016-01-15 61 views
8

我有一個Oracle數據庫和一個SQL Server數據庫。有一個表格說Inventory,它在兩個數據庫表中都包含數百萬行,並且它不斷增長。將Oracle的數百萬條記錄與SQL服務器進行比較

我想將Oracle表數據與SQL Server數據進行比較,以瞭解SQL Server表中每天缺少哪些記錄。

這是最好的方法嗎?

  1. 創建SSIS包。
  2. 創建Windows服務。

我想消耗更少的資源來實現這個功能,這需要更少的時間和更少的資源。

例如:在Oracle 18數點以百萬計的記錄和16/17數以百萬計的SQL Server

兩個不同的數據庫中,這種情況的出現是因爲在網上兩個不同的應用和離線

編輯:有關連接SQL Server如何從Oracle通過Oracle網關到SQL服務器到

1)直接從Oracle查詢到SQL服務器,第一次更新SQL服務器中缺失的記錄。

2)在Oracle上創建一個觸發器,當從Oracle刪除記錄時它將被執行,並將刪除的記錄插入到新的Oracle表中。

3)創建SSIS包,將新創建的oracle表映射到SQL服務器以更新SQL服務器記錄。這樣一來只有少數記錄需要每天通過SSIS進行處理。

您如何看待這種方法?

+0

我認爲一個好的長期戰略是不將你的狀態存儲在不同的RDBMS中。你能否更新這個問題來解釋你如何最終解決這個問題? –

+0

您能否向我們解釋目前記錄是如何重複的? – Giova

+0

Oracle數據庫有所有的記錄..有可能從oracle數據庫中刪除記錄,我們必須更新從oracle數據庫中刪除的SQL服務器記錄 – Mahajan344

回答

0

其他替代方案:

如果你可以使用Oracle網關用於SQL Server,那麼你不需要傳輸數據,還可以直接進行查詢。

如果您不能使用Oracle網關,則可以使用Pentaho數據集成或其他ETL工具來比較表並獲取結果。易於使用。

+0

您的回答非常含糊,至少對我而言,因爲它沒有提供任何線索來說明如何實現這一點。還要考慮一個應用程序處於脫機狀態的情況。 – hotzst

+0

嗨。我只提出了一個替代程序傳輸數據的方法。使用SQLServer的oracle網關,您可以直接進行比較。與ETL工具一樣,但這種替代方法是不同的。 – JLC

1

我會創建一個SSIS包並使用數據流/ OLE DB數據源從Oracle表中加載數據。如果你有SQL企業版,Attunity連接器要快一點。

然後,我會從SQL Server表中加載密鑰到Lookup轉換中,在那裏匹配鍵上的2個源,並將不匹配的行導入到單獨的輸出中。

最後,我會指示不匹配的行輸出到OLE DB命令,以更新SQL Server表。

這個SSIS包需要大量的內存,但由於匹配是在內存中以最小的IO完成的,它可能會超越其他解決方案的速度。它將需要足夠的空閒內存來緩存SQL Server表中的所有密鑰。

如果您稍後需要SSIS,SSIS還具有很多其他可用的轉換功能。

+0

感謝您的回覆。因此,您建議使用SSIS包來比較18百萬的Oracle記錄和15/16萬個SQL服務器記錄與SSIS查找的最佳方法? – Mahajan344

+0

是的,由於最小的IO。 SSIS只需要從Oracle和SQL Server表中讀取一次,然後在內存中匹配,其中大多數其他技術需要讀取和寫入(然後再讀取)其中一個大型數據集。 –

+0

我不認爲SSIS Lookup能夠處理那個音量(儘管我很高興能夠糾正)。如果存在一定程度的複雜性(即不區分大小寫或範圍查找),則必須逐行執行查找,這對於1800萬條記錄來說將非常緩慢。 –

0

我認爲最好的方法是使用oracle網關。只需按照以下步驟操作即可。我有類似的經驗。

  1. 安裝和配置SQL Server的Oracle數據庫網關。 https://docs.oracle.com/cd/B28359_01/gateways.111/b31042/installsql.htm
  2. 現在你可以創建一個從oracle到sql server的dblink。
  3. 創建一個比較oracle數據庫中缺失的記錄並插入到sql server數據庫的過程。

例如,您可以在您的過程中使用此語句。

INSERT INTO "dbo"."sql_server_table"@dblink_name("column1","column2"...."column5") 
VALUES 
(
    select column1,column2....column5 from oracle_table 
    minus 
    select "column1","column2"...."column5" from "dbo"."sql_server_table"@dblink_name 
) 
  • 創建其中每日執行該過程的調度器。
  • 當兩個數據庫聯機時,丟失的記錄將被插入到sql server中。否則,調度程序失敗或者您可以手動執行該過程。 它需要最少的資源。

    1

    你基本上想要做的是從Oracle到SQL Server的複製。

    你可以在SSIS,Windows服務或甚至多種平臺上做到這一點。 真正的訣竅是使用正確的設計模式。

    一般有兩種設計模式

    1. 快照複製

    你拿從兩個系統中的所有記錄,並將其地方比較(到目前爲止,我們已經建議在SSIS比較或比較上甲骨文,但還沒有建議在SQL Server上比較,雖然這是有效的)

    您正在比較1800萬條記錄,所以這是很多工作

  • 差分複製
  • 您記錄在發行者的改變(即Oracle),然後將這些更改應用於訂閱者(即SQL Server)

    您可以通過在Oracle端實現觸發器和日誌表來手動執行此操作,然後使用常規ETL過程(SSIS,命令行工具,文本文件,等等),可能在SQL代理中安排將這些應用到SQL Server。

    或者你可以通過使用現成的複製能力的建立Oracle作爲一個出版商和SQL爲用戶做到這一點:https://msdn.microsoft.com/en-us/library/ms151149(v=sql.105).aspx

    你將不得不嘗試一些這些,看看什麼適合你。

    鑑於這一目標:

    我要消耗更少的資源來實現這一功能,它需要更少的時間和更少的資源

    事務複製更爲高效而複雜。出於維護目的,您最喜歡哪個平臺(.Net,SSIS,Python等)?

    0

    我會建議有一個自制的ETL解決方案。

    1. 附表一oracle job導出源表數據(基於所述應用邏輯的每日 方式)to plain CSV格式。
    2. 安排a SQL-Server job(從第一個oracle作業可接受的延遲)讀取此CSV文件,並使用BULK INSERT將其導入到sql-servter內的中型表中並將其導入 。
    3. SQL-Server作業的最後部分將讀取中等表數據 並執行邏輯(插入,更新目標表)。我建議有另一個表來存儲這個日常工作結果的報告。
    相關問題