次の設定と要件を備えた新しいプロジェクトを用意してください:-
私のクライアントは、オフィスに MSSQL 2005 サーバー (A) を持っています。彼らのベンダーは、リアルタイムのトランザクション データを含む MSSQL 2005 サーバー (B) を世界の別の場所に持っています。私のクライアントは、営業時間外に毎日 (B) から (A) にデータをロードしたいと考えています。彼らは (B) へのデータリーダー アクセス権を持っていますが、それだけです。ベンダーはレプリケーションやログ配布などを行いません。私のクライアントは、独自のレポート/キューブを実行できるように独自のデータを取得する責任があります。
私が使用したスクリプトは次のとおりで、分散 TSQL と (B) へのリンク サーバーを使用しています。
DECLARE @sqlCommand VARCHAR(2000)
DECLARE @LastProcessedDate DATETIME
-- run the following code for Table 1 to Table XX
SELECT @LastProcessedDate = LastProcessedDate
FROM [ProcessControl]
WHERE TableName = 'table_1'
SET @sqlCommand = 'INSERT INTO Table1
SELECT *
FROM OPENQUERY(VendorsLinkedServerName,
''SELECT *
FROM Table1
WHERE LastModified >= '''' + @LastProcessedDate + '''')'
EXEC @sqlCommand
丸 1 日分のデータに対して 10 個の最大テーブルの最初の試行を行いましたが、1 時間かかりすぎました。また、テストのために、テーブルの主キー (1 ~ 4 個の BIGINT 列で構成される) を除くすべてのインデックスと制約を既に削除しました。ロード時間を短縮したり、データをロードしたりする方法について何か提案はありますか?
編集: select ステートメントがこのように記述された理由を疑問に思う場合に備えて、追加するだけです。上記の例では、(A) の Table1 は ETL データベースにあり、その後、データが比較されて、実際の挿入/更新/削除が決定されます。 (A) のレポート データベース