2017-05-30 4 views
0

を挿入結合:これらのエンティティは、テーブルに参加してい教義は、私は2 entitesを持っJoinTableが

Voucher 
Support 

は、私は新しいバウチャー1000の既存のサポートを追加すると、それは1000個のINSERTクエリを呼び出します

voucher_support 

と呼ばれます私のSQLサーバーへのvoucher_supportで。 50.000と確かに50.000のインサートもあります。

どのようにしてその教義が単一のINSERTを作成し、パフォーマンスを向上させることができますか?

EDIT

私はバルクinsertationが解決策ではないと思います。 Doctrine2ドキュメントの

$voucher = new Voucher(); 
$voucher->setCreatedAt(new \DateTime()); 
$supports = $this->em->getRepository('Support')->getOpen(); 
foreach($supports as $support){ 
    // this generates for each support a INSERT in join table. 
    $voucher->addSupport($support); 
} 
$this->em->persist($voucher); 
$this->em->flush(); 

答えて

0

読むBulk inserts一部: はここより良い理解のために私の現在のコードです。すべての 'バッチ'に対してflush()を使用することを示唆しています。 また、トランザクションでラッピングすることを検討する必要があります。

<?php 
$batchSize = 20; 
for ($i = 1; $i <= 10000; ++$i) { 
    $user = new CmsUser; 
    $user->setStatus('user'); 
    $user->setUsername('user' . $i); 
    $user->setName('Mr.Smith-' . $i); 
    $em->persist($user); 
    if (($i % $batchSize) === 0) { 
     $em->flush(); 
     $em->clear(); // Detaches all objects from Doctrine! 
    } 
} 
$em->flush(); //Persist objects that did not make up an entire batch 
$em->clear(); 
+0

Iこのアプローチを知っていて、すでに他の部分で使用しています。 しかし、私は複数のバウチャーやサポートを挿入しません。 Join Tableの挿入が問題です。 – develth

+0

'INSERT INTO ... SELECT FROM ... 'でネイティブ・クエリを使用すると、行をジョイン・テーブルに取り込むことができます。 –

-1

Doctrine2は、1つに複数のINSERT文を組み合わせることができません。

一部の人々はDoctrineは((...)の値に挿入する(マルチ挿入を使用していない理由を不思議に思っているようです。.. )、...(...)、...(...)

まず、この構文は、mysqlとそれより新しいpostgresqlバージョンでのみサポートされています。 AUTO_INCREMENTまたはSERIALを使用し、ORMを使用する場合、そのようなマルチインサートで生成された識別子は、オブジェクトのID管理の識別子を必要とします。 ORMのeck。通常のインサートはほとんどの状況では十分速いので、速いバルクインサートをしたいのであれば、マルチインサートは最善の方法ではありません。つまり、Postgres COPYまたはMysql LOAD DATA INFILEは数桁速くなります。

これは、ORMのmysqlとpostgresqlで複数の挿入を行う抽象化を実装する努力をする価値がない理由です。インサートの設定量の後にあなたのエンティティマネージャをフラッシュすることにより、あなたはどちらか小さいバッチでデータを処理することにDBALに切り替えたり、頼ることができhttp://www.doctrine-project.org/blog/doctrine2-batch-processing.html

: あなたはここにDoctrine2のバッチ処理の詳細を読むことができ

$batchSize = 20; 

foreach ($items as $i => $item) { 
    $product = new Product($item['datas']); 

    $em->persist($product); 

    // flush everything to the database every 20 inserts 
    if (($i % $batchSize) == 0) { 
     $em->flush(); 
     $em->clear(); 
    } 
} 

// flush the remaining objects 
$em->flush(); 
$em->clear(); 
+0

バルク挿入は私の問題の解決策ではありません。 – develth

+0

btw。私は元の投稿を知っています:https://stackoverflow.com/a/18655238/1101500 – develth

関連する問題