我需要定期執行預定作業中的以下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數據集可能很大。
謝謝。基本上我需要SQL Server中的Oracle表的副本,所以額外的完整登臺表似乎太多了。具有上述三個步驟的SSIS包是否會執行TSQL語句?唯一的區別是(2)?如果有大量新數據,SSIS可能會將數據分割成更小的塊。並且在不創建額外表的情況下合併數據流轉換是否快速? – ca9163d9
我不會在SSIS中使用合併轉換;我只是將來自Oracle的數據複製到一個永久表中,並使用Execute SQL任務來執行TSQL MERGE,正如您已經在做的那樣。解決性能問題的唯一方法就是嘗試一下並查看,但使用永久表可以完全控制涉及的查詢和索引。我總是發現鏈接服務器和OPENQUERY有點不可預測,而且一點都不透明。 – Pondlife