7

Local_Tableローカルにテーブルがあり、別のサーバーと別のデータベースとテーブルがあると仮定しますRemote_Table(テーブル構造は同じです)。

Local_Tableデータはありますが、Remote_Tableありません。このクエリでからLocal_Tableにデータを転送したい:Remote_Table

Insert into RemoteServer.RemoteDb..Remote_Table
select * from Local_Table (nolock)

しかし、パフォーマンスはかなり遅いです。

ただし、SQL Serverのインポート/エクスポートウィザードを使用すると、転送が非常に高速になります。

私は何が間違っているのですか?インポート-エクスポートウィザードでは高速で、挿入-選択ステートメントでは低速なのはなぜですか?何か案は?

4

6 に答える 6

2

リンク サーバーにデータをプッシュするよりも、リンク サーバーからデータをプルする方がはるかに高速のようです。リンク サーバーから選択するか、リンク サーバーに挿入するか、どちらが効率的ですか?

更新:私自身の最近の経験がこれを裏付けています。可能であれば引っ張ってください - それははるかに速くなります。

他のサーバーでこれを試してください:

INSERT INTO Local_Table
SELECT * FROM RemoteServer.RemoteDb.Remote_Table
于 2014-03-20T11:24:09.353 に答える
1

インポート/エクスポートウィザードは、基本的にこれを一括挿入として実行しますが、コードは実行しません。

リモートテーブルにクラスター化インデックスがあると仮定して、ローカルテーブルに同じクラスター化インデックスがあることを確認し、リモートサーバーでトレースフラグ610をグローバルに設定し、リモートがシンプルまたはバルクログリカバリモードになっていることを確認します。

リモートテーブルがヒープである場合(とにかく高速化されます)、リモートデータベースがシンプルモードまたは一括ログモードになっていることを確認し、コードを次のように変更します。

INSERT INTO RemoteServer.RemoteDb..Remote_Table WITH(TABLOCK)
SELECT * FROM Local_Table WITH (nolock)
于 2012-10-20T12:23:13.100 に答える
1

回避策を見つけました。私は SSIS のような GUI ツールがあまり好きではないので、bcp スクリプトを再利用してテーブルを csv にロードしたり、その逆を行ったりしました。ええ、ファイルではなくテーブルに対して一括操作をサポートするのは奇妙なケースです。必要に応じて次のスクリプトを自由に編集してください。

exec xp_cmdshell 'bcp "select * from YourLocalTable" queryout C:\CSVFolder\Load.csv -w -T -S .' 
exec xp_cmdshell 'bcp YourAzureDBName.dbo.YourAzureTable in C:\CSVFolder\Load.csv -S yourdb.database.windows.net -U youruser@yourdb.database.windows.net -P yourpass -q -w' 

長所:

  • 毎回テーブル構造を定義する必要はありません。
  • 私がテストしたところ、LinkedServer を介して直接挿入するよりもはるかに高速に機能しました。
  • XML よりも管理が簡単です (とにかく varchar(max) の長さに制限されています)。
  • 抽象化の追加レイアウト (SSIS などのツール) は必要ありません。

短所:

  • xp_cmdshell インターフェイスを介して外部ツール bcp を使用します。
  • テーブルのプロパティは、csv の ex/im-poring 後に失われます (つまり、データ型、null、長さ、値内のセパレーターなど)。
于 2018-11-14T21:06:39.297 に答える