学说结合了可连接的插入物



我有两个entites:

Voucher
Support

那些实体有一个称为

的联接表
 voucher_support

当我将1000个现有支持添加到新的凭证中时,它将在我的SQL Server上调用1000个插入查询。还有50.000肯定的插入物。

我如何才能实现该学说,只能制作一个插入并提高我的性能?

编辑

我认为批量插入不是解决方案。这是我目前的更好理解的代码:

$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();

阅读批量插入Doctrine2文档的一部分。它建议在每个"批处理"中使用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();

doctrine2不允许您将多个插入语句组合为一个:

有些人似乎想知道为什么学说不使用多插入(插入(...(值(...(,(...(,(...(,...

首先,此语法仅在MySQL和更新的PostgreSQL版本上支持。其次,在使用自动插入或串行时,没有简单的方法可以在此多插入中掌握所有生成的标识符,并且ORM需要标识符来实现对象的身份管理。最后,插入性能很少是ORM的瓶颈。在大多数情况下,普通插入件足够快,如果您真的想执行快速散装插入物,那么多插入并不是最好的方法,即Postgres副本或MySQL负载数据填充的速度更快。p>这些就是为什么不值得努力实施在ORM中对MySQL和PostgreSQL执行多插入的抽象的原因。您可以在此处阅读有关Doctrine2批处理处理的更多信息:http://www.doctrine-project.org/blog/doctrine2-batch-processing.html

您可以切换到DBAL,也可以通过在一定的插入后冲洗实体管理器,以小批量处理您的数据:

$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();

相关内容

  • 没有找到相关文章