約 500 万件のレコードを含むテーブルがあり、最後の 100 万件だけを本番環境に移動する必要があります (残りの 400 万件はそこにあるため)。毎回テーブル全体を再コピーする必要がないように、これを行う最善の方法は何ですか?
4 に答える
編集:(多くの改訂をして申し訳ありません。私はあなたの質問をよりよく理解しています)
Insert into TblProd
Select * from TblDev where
pkey not in (select pkey from tblprod)
これは、ターゲット テーブルにまだ存在しないレコードのみをコピーする必要があります。
それらはすべてを変更する別のサーバー上にあるためです。要するに、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 回のバッチで実行されるため、より信頼性が高くなります。
もう少し速くなるでしょう:
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
必要な行のみを転送するため、これははるかに効率的です。
テーブルが同じサーバー上にある場合、次のようなことができます
私は MySQL を使用しているため、構文が少し異なる可能性がありますが、私の意見では、すべて同じである必要があります。
INSERT INTO newTable (columnsYouWantToCopy)
SELECT columnsYouWantToCopy
FROM oldTable WHERE clauseWhichGivesYouOnlyRecodsYouNeed
別のサーバーにある場合は、次のようなことができます: http://dev.mysql.com/doc/refman/5.0/en/select-into.html