2011-08-17 44 views
2

我需要定期執行預定作業中的以下SQL(SQL Server 2008)。查詢計劃顯示53%成本爲,從Oracle服務器中提取數據後。不過,我已經在openquery中訂購了這些數據。如何在合併連接時強制查詢不進行排序?訂單提示爲openquery?

merge target as t 
using (select * from openquery(oracle, ' 
     select * from t1 where UpdateTime > ''....'' order by k1, k2') 
    ) as s on s.k1=t.k1 and s.k2=t.K2 -- the clustered PK of "target" is K1,k2 
when matched then ...... 
when not matched then ...... 

有什麼樣bulk insert的 「with (order({ column [ ASC | DESC ] } [ ,...n ]))」?如果它存在,它將有助於改進merge語句的查詢計劃嗎?

如果oracle表已經在K1,K2上有了PK,會不會只用oracle.db.owner.tablename作爲目標? (SQL Server會從oracle元信息中找出索引嗎?)

或者我能做的最好的事情是將oracle數據存儲在本地臨時表中,並在K1,k2上創建聚簇主鍵?我試圖避免創建臨時表,因爲有時返回的openquery數據集可能很大。

回答

1

我認爲一張表是最好的方法,因爲那樣你可以創建任何你需要的索引,但沒有理由爲什麼它應該是臨時的;爲什麼不創建一個永久的臨時表?使用本地索引的本地連接可能比連接遠程查詢的效率要高效得多,但唯一確定的方法是測試它並查看。

如果您擔心大量的行,您可以查看只複製新行或更改的行。如果Oracle表已經有用於行創建和更新時間的列,那很容易。

或者,您可以考慮使用SSIS而不是預定作業。我知道如果你還沒有使用SSIS,你可能不想花時間學習它,但它是一個非常強大的工具,它被設計用於將大量數據移入MSSQL。您可以創建一個包,下面的工作流程:

  1. 從分段表(只有當你無法增量填充它)從Oracle
  2. 刪除現有行
  3. 將數據複製
  4. 執行MERGE語句
+0

謝謝。基本上我需要SQL Server中的Oracle表的副本,所以額外的完整登臺表似乎太多了。具有上述三個步驟的SSIS包是否會執行TSQL語句?唯一的區別是(2)?如果有大量新數據,SSIS可能會將數據分割成更小的塊。並且在不創建額外表的情況下合併數據流轉換是否快速? – ca9163d9

+0

我不會在SSIS中使用合併轉換;我只是將來自Oracle的數據複製到一個永久表中,並使用Execute SQL任務來執行TSQL MERGE,正如您已經在做的那樣。解決性能問題的唯一方法就是嘗試一下並查看,但使用永久表可以完全控制涉及的查詢和索引。我總是發現鏈接服務器和OPENQUERY有點不可預測,而且一點都不透明。 – Pondlife