命令提示openquery?

时间:2011-08-17 02:43:57

标签: sql-server sql-server-2008 ssis openquery

我需要定期在预定作业中执行以下SQL( SQL Server 2008 )。从oracle服务器提取数据后,查询计划显示53%的成本为 sort 。但是,我已经在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 个答案:

答案 0 :(得分:1)

我认为桌子是最好的方法,因为那样你就可以创建你需要的任何索引,但没有理由说它应该是暂时的;为什么不创建一个永久的临时表?使用本地索引的本地连接可能比远程查询的结果更有效,尽管唯一可以确定的方法是测试它并查看。

如果您担心大量行,则可以查看仅复制新行或更改的行。如果Oracle表已经有用于行创建和更新时间的列,那将非常简单。

或者,您可以考虑使用SSIS而不是预定作业。我知道,如果您还没有使用SSIS,您可能不想花时间学习它,但它是一个非常强大的工具,它专为将大量数据移入MSSQL而设计。您将使用以下工作流创建包:

  1. 从临时表中删除现有行(仅当您无法以递增方式填充它时)
  2. 从Oracle复制数据
  3. 执行MERGE语句