目前,我正在试验Doctrine 2中的EAV +单表继承方法。
我有一个具有许多值的Base-Class,并且我有多个Base-Class子类。子类是相关的。
在以下CodeExample中,除Value外,所有实体都是BaseClass的SubClasses。
在这个例子中,水合作用需要3200毫秒:
$qb = $this->createQueryBuilder('p')
->select('p', 'rip', 'rs', 'c', 'pv', 'ripv', 'rsv', 'cv')
->leftJoin("p.revisionsInProject", "rip")
->leftJoin("rip.revisionState", "rs")
->leftJoin("rs.component", "c")
->leftJoin("p.values", "pv")
->leftJoin("c.values", "cv")
->leftJoin("rs.values", "rsv")
->leftJoin("rip.values", "ripv")
->where("p.id = '".$id."'");
$q = $qb->getQuery();
return $q->getSingleResult();
在这个例子中,水合作用只需要302毫秒。唯一的区别是我从查询中删除了p.values
和pv
。
$qb = $this->createQueryBuilder('p')
->select('p', 'rip', 'rs', 'c', 'ripv', 'rsv', 'cv')
->leftJoin("p.revisionsInProject", "rip")
->leftJoin("rip.revisionState", "rs")
->leftJoin("rs.component", "c")
->leftJoin("c.values", "cv")
->leftJoin("rs.values", "rsv")
->leftJoin("rip.values", "ripv")
->where("p.id = '".$id."'");
$q = $qb->getQuery();
return $q->getSingleResult();
当我使用ARRAY
或SCALAR
等其他补水模式时问题无法解决。它们有点快,但仍然可笑很长。
任何人都可以解释为什么会这样吗?其他值(c.values, rs.values, rip.values
)不会显着改变性能。
代码本身可以在Github
查看