2016-03-25 14 views
2

私は2,000,000行のテキストファイルを持っており、データベース行に各行を挿入したいのでPHPファイルを使用してSQLサーバに2,000,000レコードを挿入します。それを行う最速の方法は何ですか?それは多くの時間を要し、PHPを使用してSQL Serverに何百万ものレコードを挿入する速い方法

for ($i=1 ; $i<=2000000 ; $i++) 
    { 
     $sql = "INSERT INTO BlastSequenceDim (Seq_id) VALUES ('$i')"; 
     $stmt = sqlsrv_query($conn, $sql); 
     if($stmt === false) 
     { 
      die(print_r(sqlsrv_errors(), true)); 
     } 
    } 

しかし:テスト用

私はこのコードを使用しています。このクエリは数秒で実行できますか?

おかげで、

+0

このテキストファイルには何が入っていますか? –

+1

接続とオーバーヘッドに関連している間に2秒間に200万レコードを挿入する方法はないと思いますが、一度に1つずつではなくバッチで挿入するほうが速くなります。詳細については、http://stackoverflow.com/questions/5526917/how-to-do-a-batch-insert-in-mysqlを参照してください。 – Technoh

+0

これは本当の問題ではありません。恐らくそれを実行するのに数秒かかります。 最速の方法は、できる場合は複数の挿入のブロックごとです。 – Loenix

答えて

3

これはパフォーマンスが大幅に向上し、時間を節約する一括挿入を使用してください。

はPHPを切り出し、直接SQLデータベースにアクセスすることによって、SQL

ます。また、時間を節約することができますでBulk insert queryの詳細については、これが最初にDBを移入するのが一般的でしょう。

Another link

+0

この一括挿入の簡単な例はありますか?私はリンクを読むでしょうが、あなたが簡単な例があればそれはより良いでしょう – Alaa

+0

コピーの代わりに例を貼り付けてください。私はあなたが探している例でなければならない次の記事を読むことを好むだろう。 [リンク] http://www.sqlteam.com/article/using-bulk-insert-to-load-a-text-file –

+0

私は最初にテストしたいです。私は今テキストファイルを持っていません。私のアプリケーションタスクの1つは、このテキストファイルを生成してデータベースに挿入することです。私は今テストフェーズです。私はSQL Serverに何百万ものレコードを挿入するのにかかる時間を知りたい。あなたが深く行く前にテスト段階にいるので私のコードで私はちょうど "私"の値を挿入することがわかります。 – Alaa

2

の代わりに個別のクエリを実行しています。クエリをまとめて一度に実行します。

for ($i=1 ; $i<=2000000 ; $i++) 
{ 
    $sql .= "INSERT INTO BlastSequenceDim (Seq_id) VALUES ('$i');"; 
} 

$stmt = sqlsrv_query($conn, $sql); 
if($stmt === false) 
{ 
    die(print_r(sqlsrv_errors(), true)); 
} 
+0

これは解決策ですが、より効率的な方法があります。 –

+0

@Ray私はあなたのコードをしようとしていますが、このエラーがあります:致命的なエラー:行106のC:\ inetpub \ wwwroot \ webclient \ saveResult.phpに134217728バイトを使い果たしました(225778224バイトを割り当てようとしました)。 :$ stmt = sqlsrv_query($ conn、$ sql); – Alaa

+0

@Alaa実際には良い解決策ではありません。私はそれを実装することを強く嫌うでしょう。解決方法は、ファイルのサイズによって決定される終了を有する。あなたは確かにPHPのメモリを増やすことができますが、それは何ですか? –

0

通常、ボトルネックはPHPがマルチスレッドで動作していないことです。つまり、1つのプロセスがファイルを順番に読み取っていて、サーバー/ PCに8つ以上のコアがある場合でも、行ごとに挿入します。

私はmemcacheキーに多くの値を挿入しなければならなかったのと同じ問題を抱えていました。私はphp pthreadで解決しました。

確かに多くの作業がありますが、それは私の場合のように繰り返されるタスクの場合は、pthreadで実装することは間違いありません。

開始スレッドの合計量は、number_of_cpu_cores x 1.5以上であるべきではありません。

小文字問題:テキストファイルからどのように読みを調整しますか?ここで私は、各スレッドに2つの数値を渡すために検討する:

  • スタート行番号X
  • であなたが他のスレッドによって読み取られた行をスキップするために、Xに追加されたオフセット。

あなたはパフォーマンスの向上について驚くでしょう!あなたの質問のための他の答えと組み合わせると、それは無敵になります...

関連する問題