2

我需要定期在计划的作业中执行以下 SQL ( SQL Server 2008 )。查询计划显示 53% 的成本是在从 oracle 服务器中提取数据后进行排序的。但是,我已经在 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 数据集可能很大。

4

1 回答 1

1

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

如果您担心大量的行,您可以考虑只复制新的或更改的行。如果 Oracle 表已经有用于行创建和更新时间的列,那将非常容易。

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

  1. 从临时表中删除现有行(仅当您无法增量填充时)
  2. 从 Oracle 复制数据
  3. 执行 MERGE 语句
于 2011-08-17T07:22:59.260 回答