5

ファイルから一括挿入を行う必要がある MS SQL Server を使用するアプリケーションがあります。問題は、データベースとアプリケーションが別々のサーバーでホストされることです。ネットワーク全体で一括挿入を行う最善の方法は何ですか? これまでに思いついた2つのアイデア:

  1. アプリ サーバーから、db サーバーが検出できるディレクトリを共有し、リモート ファイルから一括挿入ステートメントを使用してインポートを実行します。

  2. dbサーバーからFTPサーバーを実行します-インポートが実行されると、ファイルをdbサーバーにftpし、ローカルファイルからの一括挿入を使用してインポートを実行します(私はこのオプションに傾いています)。

これを行うためのより良い方法があるかどうか、またはそうでない場合は、どれが最も理にかなっているのか、そしてその理由を誰か他の人に教えてもらえますか?

4

5 に答える 5

2

私は以前にそれを行い、両方のオプションを試しました。

結局、私は選択の反対を行いました1.アプリが見つけることができるDBサーバー上のディレクトリを共有します。一括挿入中に帯域幅の問題に対処する必要はありません。

FTPサーバーオプションは、セキュリティや転送可能性に特に関心がある場合に機能します。

最後のオプション(非常に注意してください)は、ローカライズされたSQLサーバーでDTSを使用することです。より安全かもしれません。間違えると、効率が大幅に低下します。

于 2009-01-13T19:04:07.327 に答える
1

私はまだ MS SQL でこれを行う方法を探していますが、MySQL で行ったことは、CSV を BLOB として一時テーブルに保存し、DB サーバーのローカル ディレクトリで SELECT ... INTO DUMPFILE を実行することでした。次に、そのローカル ファイルに対して通常の LOAD DATA ステートメントを実行します (編集:指摘しておく必要があると思いますが、これは LOAD DATA LOCAL が使用可能になる前でした)。

spWriteStringToFileでできると思います。

編集:私は何かに取り組んでいます。

comm.CommandText = @"EXEC spWriteStringToFile @data, 'c:\datadumps', 'data.csv';
    BULK INSERT my_table FROM 'c:\datadumps\data.csv';";
comm.Parameters.AddWithValue("data", File.ReadAllText(path));
comm.ExecuteNonQuery();
于 2011-10-21T18:14:11.530 に答える
0

サーバー間でファイルをコピーするための追加のユーティリティがいくつかあるため、2k08についてはよくわかりません。FTPは、ウィンドウのファイルシステムを使用してファイルを転送しないため、2つのうち高速になります。(オーバーヘッドがありますが、ファイルが大きくない限り、無視できる可能性があります)。アクセス中にファイルがクラッシュするリモートサーバーなど、共有を使用しないことには他にも利点があります。

dbサーバーにオープンシェアを追加することについてcmartinに同意しません。一般に、ファイル共有はセキュリティリスクと見なされており、多くの場所で許可されていないため、データベースサーバーに対してファイル共有を開くことは望ましくありません。そうは言っても、一括インポートを使用するためにファイルを別の場所に転送する必要はありません。

于 2009-01-13T19:10:35.847 に答える
0

ファイルが十分に小さい場合は、ftpオプションが機能する可能性があります(dbボックスに重複があります)。ただし、オプション1)を実行する際に、シングルホップで2つの間にギガビットネットワークがある場合は、それほど問題はありません。

于 2009-01-13T19:02:24.350 に答える
0

実際には、アプリケーションサーバーとデータベースサーバーの両方にファイルを配置できます。

両方のファイルが同じパスである必要があります。アプリケーションサーバーからの目的は、選択のみです。データベースサーバーは一括挿入用です。

これは私が顧客のためにしたことであり、彼らもこの単純なトリックに同意しました。

于 2012-03-30T03:45:08.027 に答える