1

約 500 万件のレコードを含むテーブルがあり、最後の 100 万件だけを本番環境に移動する必要があります (残りの 400 万件はそこにあるため)。毎回テーブル全体を再コピーする必要がないように、これを行う最善の方法は何ですか?

4

4 に答える 4

2

編集:(多くの改訂をして申し訳ありません。私はあなたの質問をよりよく理解しています)

Insert into TblProd
     Select * from TblDev where 
     pkey not in (select pkey from tblprod)

これは、ターゲット テーブルにまだ存在しないレコードのみをコピーする必要があります。

于 2012-11-14T21:02:52.457 に答える
2

それらはすべてを変更する別のサーバー上にあるためです。要するに、dev にないものを知るには、DEV のすべてを PROD のすべてと比較する必要があるため、巨大なデータセットの比較を避ける簡単な方法はありません。

PROD システムと DEV システム間のレプリケーションに使用されるいくつかの異なる戦略:

A. データベース全体をバックアップおよび復元し、後でスクリプトを適用してクリーンアップする

B. 変更を記録し、変更されたレコードのみをコピーする PROD データベースにトリガーを実装する

C. 変更されていないことがわかっているある種のパーティションまたはレコードのセット(つまり、12 か月前) を特定し、そのデータセットにないレコードのみを更新します。

D. SSIS を使用して、prod のすべてを DEV サーバー上のステージング テーブルにコピーします。上記と非常によく似たクエリを使用して、データベース全体に新しいレコードのみを挿入します。ステージング テーブルを削除します。

E. これを効率的に行うサード パーティの SSIS コンポーネントを見つけることができる場合があります。そのままでは、SSIS は比較更新では非効率的です。

最後の 100 万件のレコードが何であるか、実際に把握していますか? つまり、場所または日付または何かのためのものですか? それらを識別するための選択を記述できますか?

このコメントに基づいて:

ID> Xが機能することがわかっているため、比較する必要はありません

DEV サーバー上に PRODSERVER という名前のリンク サーバーを作成していると仮定すると、これを DEV サーバー上で実行できます。

INSERT INTO DB.dbo.YOURTABLE (COL1, COL2, COL3...)
SELECT COL1, COL2, COL3...
FROM PRODSERVER.DB.dbo.YOURTABLE
WHERE ID > X

作成方法の詳細については、「SQL Server リンク サーバー」を参照してください。

これは 1 回限りで問題ありませんが、これを定期的に行う場合は、より堅牢なものを作成したいと思うかもしれません。

たとえば、BCP.EXE を使用してデータをファイルにエクスポートし、それを DEV にコピーして再度インポートするスクリプトを作成できます。これは、ネットワーク接続を常に必要とするのではなく、1 回のバッチで実行されるため、より信頼性が高くなります。

于 2012-11-14T22:51:09.730 に答える
2

もう少し速くなるでしょう:

Insert into prod.dbo.table (column1, column2....)
Select column1, column2.... from dev.dbo.table d
where not exists (
    select 1 from prod.dbo.table pc where pc.pkey = d.pkey
    )

ただし、これらのテーブルが同じサーバー上にあるかどうかを教えていただく必要があります

また、この実行はどのくらいの頻度で実行され、どの程度堅牢である必要がありますか? 要件に応じて、代替ソリューションがあります。

OPからこの遅れて到着した宝石を考えると、 ID > X を知っているので比較する必要はありません。高価な比較を行う必要はありません。あなたはただ使うことができます

Insert into prod.dbo.table (column1, column2....)
Select column1, column2.... from dev.dbo.table d
where ID > x

必要な行のみを転送するため、これははるかに効率的です。

于 2012-11-14T22:00:31.780 に答える
0

テーブルが同じサーバー上にある場合、次のようなことができます

私は MySQL を使用しているため、構文が少し異なる可能性がありますが、私の意見では、すべて同じである必要があります。

INSERT INTO newTable (columnsYouWantToCopy)
    SELECT columnsYouWantToCopy
    FROM oldTable WHERE clauseWhichGivesYouOnlyRecodsYouNeed

別のサーバーにある場合は、次のようなことができます: http://dev.mysql.com/doc/refman/5.0/en/select-into.html

于 2012-11-14T21:06:14.283 に答える