SQL Server-主キーなしで大きなテーブルをエクスポートする


9

SQL ServerとMySQLの間で主キーなしで約5億行の大きなテーブルを同期する必要があります。テーブルには、クラスター化された複合非一意インデックスのみがあります。

サーバー間にODBC接続がありますが、約800万行のインポートには約45分かかりました。そのため、いつでも中断が発生する可能性があるため、単一の大きなインポートは無理があると思います。既存のテーブル構造を変更できません。他のテーブルを追加できます。さらに読んだ後、オフセット/フェッチは大きなテーブルのオプションではありません。「選択... where where between ... and ...」は、一意のキーがないためオプションではありません。

すべての行を含むことが保証されているバッチでテーブルをエクスポートするにはどうすればよいですか?私の問題は、クラスター化されたキーが一意ではないため、物理的な行が連続するクエリ間で同じ順序になることを保証しない後の順序付けと、すべての列に時間がかかりすぎる場合の順序付けです。また、ODBCまたはCSVファイルを使用して、バッチをどのように移行することをお勧めしますか?


これは繰り返し(通常の操作)でしょうか、それとも一度の操作でしょうか?
ボグダンボグダノフ2016年

最初のエクスポートは1回限りの操作です。新しいレコードや更新などの同期の変更は繰り返し行う必要があります。CDCはオプションではありませんが、最初の移行後にさらに調査します。
1

プロセス全体を詳しく説明する必要があります(非常に複雑な問題があるようです)
Bogdan Bogdanov

「クラスター化されたキーは一意ではないため、それ以降の順序付けでは、物理的な行が連続するクエリ間で同じ順序になることは保証されません」。行の順序は保持されないため(シーケンスデータがない場合)、物理的に同じ行の順序を取得することはできません。行の順序は、デフォルトでは挿入順でもインデックス順でもありませんが、ORDER BY句で定義されます。
RLF、2016年

はい、RLF、同意します。列はすべてint、A、B、C、D、Eです。クラスター化されたキーはABCにあります。ABCの組み合わせは一意ではなく、ABCDの組み合わせも一意ではありません。一意でない列を「並べ替え」すると、テーブル全体をバッチでエクスポートできますか?そして、Bogdan Bodganov、Stackプラットフォームは複雑な問題を阻止します。問題に対処するだけの方が良いです。大きなテーブル全体を、行を失うことなくバッチでできるだけ速くエクスポートする方法は?
1

回答:


0

ソーステーブルに対する更新または削除がないと仮定すると、次のことを試すことができ
ます。1. CTAS構文を使用して既存のテーブルのコピーを作成します(SQLServerの場合SELECT * into source_table_copy FROM source_table)。このような操作は、巨大なテーブルでも非常に高速です。
2. 新しいレコードをにコピーするafter insertトリガーを追加source_tablesource_table_copyます。
3.今際のすべての新しいレコードsource_tableへ行くsource_table_copyにも、あなたはバッチでMySQLへコピーされたテーブルからデータを移動することができます。たとえば、2つのサーバー間にリンクがある場合、TSQLストアドプロシージャの本体内ですべてを実行できます。
たとえば、最大20レコードを新しいサーバーに移動するコードは次のようになります。

 --declare table variable to keep deleted records until they delivered to target host 
  BEGIN TRANSACTION;
  DELETE TOP (20) FROM source_table_copy OUTPUT DELETED.* INTO @Table_Var;

  --insert data into linked server , or to csv file
  COMMIT; 

CURSORを使用してデータを読み取り、with where current of句で削除することもできます。

**理想的には、source_tableステップ1の間にアプリケーションがデータを挿入しないようにする必要があります。それが絶対に不可能な場合は、after insertステップ1の直前に追加され、実行直後に削除されるトリガーを使用します。後でとマージしsource_table_copyます。


解決策をありがとう、私も何かを試みましたが、通常の挿入で。CTAS構文を試して、処理が速くなるかどうかを確認します。フォローアップの質問、よろしければ:「挿入後トリガー」はパフォーマンスに影響しますか?
1

トリガー本体は非常に単純なので(データを別のテーブルに挿入するだけ)、パフォーマンスへの影響は最小限です。
a1ex07 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.