2012-02-19 9 views
3

データログファイルに次の形式のデータがあります。効率的なバルクデータの挿入

各行はデータベース内の行を表し、一度に500-1000行が挿入されます。

は、直接店舗プロシージャを呼び出すことにより、データベース内のデータを挿入した方が良いです

OR

が、それを解析するために、より良いです(手順は、ログファイルやデータを挿入呼び出すためのロジックが含まれています)データを挿入します。

29 2011-02-01 11:00:40 1 0 1 0 
    30 2011-02-01 11:00:44 1 0 1 0 
    32 2011-02-01 11:00:49 1 0 1 0 
+0

は、httpを参照してください。 /msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx – Phil

答えて

0

大量にデータを挿入する(パフォーマンスのために)優れている(FROM LOADを使用して、または取引。私は店が似た何かをすると仮定しています)行あたりのクエリで1度に1つずつ挿入するよりも、 。

+0

クラスを作成し、データベースの代わりにアプリケーションで前処理ロジックを維持する方が良いと思わないでください。 – arjun

+0

SQL ser verには、あらかじめ処理するコードと同じように最適化された関数があります。さらに、サーバーとスクリプトの間の往復時間を節約します。ファイルシステムの絶対パスを使用してファイルにアクセスすることができます(同じサーバー上にあり、適切な権限を持っていることが前提です)。結局、どちらもトランザクションを使用している限り動作し、500〜1000行では、dbを直接使用するか、構文解析スクリプトからクエリを実行するまでのパフォーマンスの差が最小限に抑えられます。 – AlexanderZ

+0

しかし、オンラインでホストしている場合は、絶対パスをファイルシステム上でどのように使用しますか。 – arjun

1

おそらく.tsv形式(タブ区切りの値)です。

LOAD DATA LOCAL INFILE 'uniq.csv' INTO TABLE tbl 
    FIELDS TERMINATED BY '\t' 
    ENCLOSED BY '' 
    LINES TERMINATED BY '\n' 
(column1, column2, column3) 

\ tはタブ文字です。それが動作しない場合は、スペースを変更してください。

行単位で行を読み取ろうとすると、ハードディスクに何度もアクセスするため、行単位の行を効率的に処理できません。 LOADコマンドは、一度にファイル全体を読み込む必要があります。

インデックスは、このような挿入を著しく遅くすることがあります。多くのデータ(たとえば100000行)を読み込む必要がある場合、挿入後にインデックスを削除し、挿入して再作成するほうがよい場合があります。

+0

しかし、別の問題は、データベースとアプリケーションが両方ともオンラインでホストされている場合、データベースからファイルにアクセスする方法です。 – arjun

+0

クラスを作成し、データベースの代わりにアプリケーションで前処理ロジックを保持する方が良いとは思わない – arjun

1

また、BCP(一括コピー)コマンドを使用することもできます。

Excelでこのログファイルをインポートし、別の列名でcsvとして保存します。 次の構文を使用して、cmdプロンプトでテーブルにインポートします。

$の\ Program Files \ Microsoft SQL Serverの\ 100 \ツールに行くには、テーブル名にcmdプロンプト

BCP "D:\ログ\ log.csv" でのBinnを\ -Sサーバー名-Uユーザ名-c -Pパスワード-t "" "\ n" は

-rあなたは、代わりに-c ... -tの代わりに-nを指定することができます: - カンマ区切り、-r: - :/行ターミネータ