2012-03-06 5 views
1

ここでは、「|」で区切られた約400 MBの.txtファイルがあります。 C#でWindowsフォームを使用して、SQL Serverデータベースのテーブルに.txtファイルの各行を挿入します。テキストファイルからSQLサーバーにデータを挿入する(speed?メソッド?)

私は何をやっていることは、単純に、この(簡潔にするために、「...」で短縮される):

while ((line = file.ReadLine()) != null) 
{ 
    string[] split = line.Split(new Char[] { '|' }); 

    SqlCommand cmd = new SqlCommand("INSERT INTO NEW_AnnualData VALUES (@YR1984, @YR1985, ..., @YR2012)", myconn); 
    cmd.Parameters.AddWithValue("@YR1984", split[0]); 
    cmd.Parameters.AddWithValue("@YR1985", split[1]); 
    ... 
    cmd.Parameters.AddWithValue("@YR2012", split[28]); 

    cmd.ExecuteNonQuery(); 
} 

さて、これが働いているが、それはしばらく取っています。膨大な量のデータを処理するのは今回が初めてのことなので、A)私はこれを効率的にやっていますし、B)私の期待はあまり高くありません。ループが起こっている間にSELECT COUNT()を使用して

、私は数が上がると時間をかけて見ることができます。だから私は時計といくつかの基本的な数学を使って、物事が働いているスピードを見つけました。 60秒で、73881インサートがあった。これは1秒あたり1231インサートです。質問は、これは平均的なスピードですか、あるいはパフォーマンスが低下していますか?後者の場合、パフォーマンスを向上させるために何ができますか?

私は、SSISは、まさにこの目的のために効率的であることについて何かを読みました。しかし、WindowsフォームのボタンをクリックしてSISSを経由しないようにするには、このアクションが必要です。

答えて

2

SqlBulkCopy on MSDN、またはnice blog post hereを見てください。私にとっては、1秒間に何万個ものインサートになる。

+0

これは私が必要としていたものです。 OutOfMemoryの例外を取得しているデータが非常に多かったため、私は最初にそれを使用する際に問題がありましたが、このポストは正しいパスに入れてくれます:http://stackoverflow.com/questions/9442171/a-way-out-from -getting-systemoutof mememory大文字からインポートまでのエクスプレッション – CptSupermrkt

1

私はこのタイプの方法よりも速いのフォニードSSISを持っていますが、パフォーマンスに影響を与える可能性のある変数があります。

SSISを試したい場合は、Management Studioのインポートとエクスポートウィザードを使用して、パイプで区切られたファイルをインポートするSSISパッケージを生成します。 http://blogs.msdn.com/b/michen/archive/2007/03/22/running-ssis-package-programmatically.aspxをプログラム的にSSISパッケージを実行する方法についての情報のため:あなたはこの記事を参照してください。パッケージを保存して、.NETアプリケーション

からそれを実行することができます。クライアントから、サーバーから、またはどこからでも実行する方法に関するオプションが含まれています。

また、あなたは一般的に一括挿入のパフォーマンスを向上させることができ、追加の方法については、この記事を見てみましょう。 http://msdn.microsoft.com/en-us/library/ms190421.aspx

+0

SSISコンポーネントのクライアント展開は必要ありませんか?また、SQL Serverのバージョンをアップグレードする場合は、通常SSISパッケージにも更新が必要です。 – Andomar

+0

上記のリンクは、コードからSSISパッケージを実行するための複数の方法を示しています。そのうちの3つは、クライアントツールを展開せずにオプションを含めてリモートで実行できます。また、SSISパッケージを05から08にR2に変更する必要はありません。 YMMV。 –

2

私はAndomarに同意する必要があると思います。私は本当にSqlBulkCopyが大好きです。それは本当に速いです(あなたの状況に合ったものを見つけるためにはplay around with BatchSizesが必要です)。

さまざまなオプションについて議論している記事については、Microsoftの「データ読み込みパフォーマンスガイド」を参照してください。 http://msdn.microsoft.com/en-us/library/dd425070(v=sql.100).aspx

また、SqlBulkCopyがCSV ReaderであるC#の例を見てください。それは無料ではありませんが、より短時間で高速で正確なパーサを書くことができれば、それに行きましょう。少なくとも、それはあなたにいくつかのアイデアを与えるでしょう。

2

うわー、このアプローチはあなたに驚異的なパフォーマンスを与えます。次のようにBULK INSERTを試してみてください。

BULK INSERT MyTable 
    FROM 'e:\orders\lineitem.tbl' 
    WITH 
    (
     FIELDTERMINATOR ='|', 
     ROWTERMINATOR ='\n' 
    ) 

これはパフォーマンス面で最適なソリューションです。ファイルがデータベースサーバー上に存在しなければならないという欠点があります。プロセスを実行しているサーバーのファイルシステムにアクセスできない場合は、過去に使用していたこれに対する2つの回避策があります。1つは、ワークステーションにSQL Expressのインスタンスをインストールし、メインサーバーをワークステーションインスタンスにリンクサーバーとして追加し、次に "BULK INSERT MyServer.MyDatabase.dbo.MyTable ..."を実行することです。もう1つの選択肢は、CSVファイルをXMLとして再フォーマットすることです。これは非常に迅速に処理できます。その後、XMLをクエリに渡してOPENXMLを使用して処理します。 BULK INSERTとOPENXMLの両方については、MSDNで詳しく解説されています。

関連する問題