Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server openquery的订单提示?_Sql Server_Sql Server 2008_Ssis_Openquery - Fatal编程技术网

Sql server openquery的订单提示?

Sql server openquery的订单提示?,sql-server,sql-server-2008,ssis,openquery,Sql Server,Sql Server 2008,Ssis,Openquery,我需要定期在计划作业中执行以下SQL(SQL Server 2008)。查询计划显示,从oracle服务器提取数据后,53%的成本是排序成本。但是,我已经在openquery中对数据进行了排序。合并加入时如何强制查询不排序 merge target as t using (select * from openquery(oracle, ' select * from t1 where UpdateTime > ''....'' order by k1, k2')

我需要定期在计划作业中执行以下SQL(SQL Server 2008)。查询计划显示,从oracle服务器提取数据后,53%的成本是排序成本。但是,我已经在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 ......
是否有类似于
批量插入
的“
with(order({column[ASC|DESC]}[,…n]))
”?如果存在
merge
语句,它是否有助于改进该语句的查询计划

如果oracle表在K1、K2上已经有PK,那么使用
oracle.db.owner.tablename
作为目标会更好吗?(SQL Server会从oracle元信息中计算出索引吗?)


或者我能做的最好的事情就是将oracle数据存储在本地临时表中,并在K1、k2上创建一个集群主键?我尽量避免创建临时表,因为有时返回的openquery数据集可能很大。

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

如果您担心行数太多,可以只考虑在新的或更改的行上进行复制。如果Oracle表已经有了行创建和更新时间的列,那就很容易了

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

  • 从临时表中删除现有行(仅当无法增量填充时)
  • 从Oracle复制数据
  • 执行MERGE语句

  • 谢谢基本上,我需要SQL Server中Oracle表的副本,因此额外完整的临时表似乎太多了。具有上述三个步骤的SSIS包是否会影响TSQL语句的性能?唯一的区别是(2)?如果有大量新数据,SSI可能会将数据分割成更小的片段。如果不创建额外的表,合并数据流转换会很快吗?我不会在SSIS中使用合并转换;我只是将数据从Oracle复制到一个永久表中,然后使用ExecuteSQL任务执行TSQL合并,就像您已经在做的那样。回答性能问题的唯一方法是试一试,但使用永久表可以让您完全控制所涉及的查询和索引。我总是发现链接服务器和OPENQUERY有点不可预测,一点也不透明。