2

スケジュールされたジョブで定期的に次の 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 ......

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 をまだ使用していない場合は、学習に時間をかけたくないかもしれませんが、SSIS は非常に強力なツールであり、大量のデータを MSSQL に移動するように設計されています。次のワークフローでパッケージを作成します。

  1. ステージング テーブルから既存の行を削除します (段階的に入力できない場合のみ)。
  2. Oracle からデータをコピーする
  3. MERGE ステートメントを実行する
于 2011-08-17T07:22:59.260 に答える