Php 我的doctrine2查询中的内部联接将执行时间从400毫秒增加到5秒

Php 我的doctrine2查询中的内部联接将执行时间从400毫秒增加到5秒,php,sql,doctrine-orm,Php,Sql,Doctrine Orm,doctrine2查询中的内部联接将执行时间从400毫秒增加到5秒,但如果提取SQL并直接在SQLServerStudio中运行,则执行需要几毫秒 以下是我的疑问,瓶颈仅限于内部连接: $qb = $em->createQueryBuilder(); $q = $qb->select( 'wp.id, wp.last_activity_datetime' ) ->from( '\Entities\wall_post', 'wp' ) ->LeftJoin( 'wp.wal

doctrine2查询中的内部联接将执行时间从400毫秒增加到5秒,但如果提取SQL并直接在SQLServerStudio中运行,则执行需要几毫秒

以下是我的疑问,瓶颈仅限于内部连接:

$qb = $em->createQueryBuilder();
$q = $qb->select( 'wp.id, wp.last_activity_datetime' )
->from( '\Entities\wall_post', 'wp' )
->LeftJoin( 'wp.wall_postsLikes', 'likes' )
->LeftJoin( 'wp.wall_postsShare', 'shares' )
->LeftJoin( 'wp.wall_postsComment', 'comments' )
->leftJoin( 'wp.wall_postsFrom_user','fromUser');
if( $wall_type == self::WALL_TYPE_SOCIALISE )
{
    $q->leftJoin( 'wp.wall_postsSocialise_album','album');
    $q->innerJoin( 'album.socialise_albumsSocialise_photo','photo');
}
$q->setParameter( 'my_links_r', $my_links_r )
->setParameter( 1, $userId )

->setFirstResult( $offset )
->setMaxResults( $limit )
->groupBy( 'wp.id, wp.last_activity_datetime' )
->orderBy( 'wp.last_activity_datetime', 'DESC' );

if( $wall_type )
{
    $q->where( 'wp.wall_postsFrom_user = ?1 AND wp.wall_type = ?4' );
    $q->orWhere( 'wp.wall_postsFrom_user IN (:my_links_r) AND wp.wall_type = ?4' );
    $q->orWhere( 'likes.likesLiked_by IN (:my_links_r) AND wp.wall_type = ?4' );
    $q->orWhere( 'shares.sharesShared_by IN (:my_links_r) AND wp.wall_type = ?4' );
    $q->orWhere( 'comments.commentsIlook_user IN (:my_links_r) AND wp.wall_type = ?4' );
    $q->andWhere('fromUser.account_closed_on is null');
    if( $blocked_user_ids_arr ):
        $q->setParameter( 'blocked_users_r', $blocked_user_ids_arr );
        $q->andWhere( 'wp.wall_postsFrom_user NOT IN (:blocked_users_r)' );
    endif;

    $q->setParameter( 4, $wall_type );
}


$q = $q->getQuery()->getResult( \Doctrine\ORM\Query::HYDRATE_ARRAY );
以下是我的SQL extract,它还通过内部连接运行得非常出色:

SELECT TOP 10 w0_.id AS id0, w0_.last_activity_datetime AS last_activity_datetime1
FROM wall_post w0_
  LEFT JOIN likes l1_ ON  w0_.id = l1_.wall_post_id
  LEFT JOIN share s2_ ON w0_.id = s2_.wall_post_id
  LEFT JOIN comments c3_ ON w0_.id = c3_.wall_post_id 
  LEFT JOIN ilook_user i4_ ON w0_.from_user_id = i4_.id 
  LEFT JOIN socialise_album s5_ ON w0_.socialise_album_id = s5_.id 
  INNER JOIN socialise_photo s6_ ON s5_.id = s6_.socialise_album_id 
WHERE ((w0_.from_user_id = 1 AND w0_.wall_type = 2) 
   OR (w0_.from_user_id IN (1) AND w0_.wall_type = 2)  
   OR (s2_.ilook_user_id IN (1) AND w0_.wall_type = 2)) 
  AND i4_.account_closed_on IS NULL 
GROUP BY w0_.id, w0_.last_activity_datetime 
ORDER BY w0_.last_activity_datetime DESC

任何帮助都将不胜感激。

如果我使用having statementleft join代替internal join,这不是确切的答案,但解决了我的问题:

$q->leftJoin( 'album.socialise_albumsSocialise_photo','photo');
$q->having('count(photo) > 1');

您是否100%确定上述代码生成的sql与底部的sql完全相同?还有,你的相册有哪些字段。社交。。。“你有桌子吗?@JeremyC。是SQL仅从上述条令查询中提取。我的socialise_photo表有1个主键(int)、2个其他整数字段、4个varchar和1个datetime字段。仍不清楚为什么doctrine2内部联接要多花10倍的时间。