Php Symfony2,提高查询性能

Php Symfony2,提高查询性能,php,performance,symfony,doctrine,dql,Php,Performance,Symfony,Doctrine,Dql,有人知道如何提高此查询的性能吗 我正在使用DQL模型,下面是代码 (没有分页包需要5-6秒) public function findOperationReport($condition = array()) { $data = $condition['record']; $move_types = array(); $result = $this->createQueryBuilder("sp") ->addSelect("

有人知道如何提高此查询的性能吗

我正在使用DQL模型,下面是代码
(没有分页包需要5-6秒)

 public function findOperationReport($condition = array()) {

  $data = $condition['record'];
  $move_types = array();

  $result = $this->createQueryBuilder("sp")
                    ->addSelect("sp");


  // move types
  if(isset($data['vessel_discharge'])) {
      //$move_types[] = $this->container->getParameter('MOVE_TYPE.VESSEL_DIS');
       $move_types[] = 'VY';
  }
  if(isset($data['vessel_loading'])) {
      //$move_types[] = $this->container->getParameter('MOVE_TYPE.VESSEL_LOAD');
       $move_types[] = 'YV';
  }      
  if(isset($data['truck_out'])) {
      $move_types[] = 'TC';
  }    
  if(isset($data['truck_in'])) {
      $move_types[] = 'CT';
  }  
  if(isset($data['stuffing'])) {
      //$move_types[] = 'CT';
  }  
  if(isset($data['unstuffing'])) {
      //$move_types[] = 'CT';
  } 
  if(isset($data['rail_in'])) {
      $move_types[] = 'YR';
  }  
  if(isset($data['rail_out'])) {
      $move_types[] = 'RY';
  } 
  if(count($move_types) > 0) {
       $result->andWhere('sp.move_type IN (:move_type)')
               ->setParameter('move_type',$move_types);

  } else {
      $result->andWhere("1 = 2");
  }

 //container types
 if(isset($data['empty']) && isset($data['full'])) {
     //skipping
 }
 elseif (isset($data['empty'])) {
    $result->andWhere('sp.ctnr_status = :ctnr_status')
           ->setParameter('ctnr_status',self::CTNR_EMPTY);
}
elseif (isset($data['full'])) {
    $result->andWhere('sp.ctnr_status = :ctnr_status')
           ->setParameter('ctnr_status',self::CTNR_FULL);

    if(isset($data['weight_from'])) {
        $result->andWhere("cast(replace([weight],',','.') as float) :weight_from")
               ->setParameter('weight_from',$data['weight_from']);
        echo 'weight from';
    }
    if(isset($data['weight_to'])) {
        $result->andWhere('sp.weight <= :weight_to')
               ->setParameter('weight_to',(string)$data['weight_to']);
    }

}       

/*
//excpetion
$result->andWhere('sp.move_type NOT IN (:move_type_not)')
       ->setParameter('move_type_not',array('TY','YT'));     

  */     
 if(isset($data['today']) || isset($data['yesterday'])) {
     //yesterday
     if(isset($data['yesterday'])) {
        $yesterday = new \DateTime(date("Ymd"));
        $interval = new \DateInterval("P1D");
        $interval->invert = 1;
        $yesterday->add($interval);
     }

     //yesterday + today
    if(isset($data['today']) && isset($data['yesterday'])) {
        $result->andWhere('sp.move_time >= :yesterday')
                ->setParameter('yesterday',$yesterday->format("Ymd000000"));
    } 
    elseif(isset($data['yesterday'])) {
        $result->andWhere('sp.move_time >= :yesterday_from AND sp.move_time <= :yesterday_to')
                ->setParameter('yesterday_from',$yesterday->format("Ymd000000"))
                ->setParameter('yesterday_to',$yesterday->format("Ymd235959"));
     }
     elseif(isset($data['today'])) {
        $result->andWhere("sp.move_time = :today")
                ->setParameter('today',date("Ymd000000"));   
     } 
    } 
    else {
       //date conditions
       $date_from =  new \DateTime(strtotime($data['date_from']));
       $date_to =  new \DateTime(strtotime($data['date_to']));

       $result->andWhere("sp.move_time >= :date_from")
               ->setParameter('date_from',$date_from->format("Ymd000000"));
       $result->andWhere("sp.move_time <= :date_to")
               ->setParameter('date_to',$date_to->format("Ymd235959"));
    }
    //booking
    if(isset($data['booking']) && !empty($data['booking'])) {
       $result->andWhere("sp.booking = :booking")
               ->setParameter('booking',$data['booking']);   
    }


    //is reffer
    if(isset($data['reefer'])) {
       $result->andWhere("sp.reefer_flag = :reefer")
               ->setParameter('reefer','Y');   
    }

    //is damage
    if(isset($data['damage'])) {
       $result->andWhere("sp.hazards <> ''");  //$result->expr()->neq("sp.hazards","")  
    }

    //specific_type
    if(isset($data['specific_type'])) {
        /*
        $result->andWhere("sp.equip_type <> :specific_type")
                 ->setParameter('specific_type',$data['specific_type']);
         *
         */
    }

    //specific_type
    if(isset($data['container_type_20']) && isset($data['container_type_40'])) {
        //$result->andWhere("sp.equip_type <> :specific_type")
        //         ->setParameter('specific_type',$data['specific_type']);
    }
    elseif(isset($data['container_type_20'])) {
              $result->andWhere($result->expr()->substring('sp.equip_type',1,1)." = :equip_type")
                       ->setParameter('equip_type',2);
    }
    elseif(isset($data['container_type_40'])) {
              $result->andWhere($result->expr()->substring('sp.equip_type',1,1)." = :equip_type")
                       ->setParameter('equip_type',4);
    }
   return $result->setMaxResults(30)->getQuery();
控制器:

    $data = $this->getDoctrine()
                ->getEntityManager('sparcs')
                ->getRepository('TruckingMainBundle:BCT_CNTR_EVENTS')
                ->findOperationReport(Convert::serializeToArray($request->getContent()));
 public function findOperationReport($condition = array()) {

  $data = $condition['record'];
  $move_types = array();

  $result = $this->createQueryBuilder("sp")
                    ->addSelect("sp");


  // move types
  if(isset($data['vessel_discharge'])) {
      //$move_types[] = $this->container->getParameter('MOVE_TYPE.VESSEL_DIS');
       $move_types[] = 'VY';
  }
  if(isset($data['vessel_loading'])) {
      //$move_types[] = $this->container->getParameter('MOVE_TYPE.VESSEL_LOAD');
       $move_types[] = 'YV';
  }      
  if(isset($data['truck_out'])) {
      $move_types[] = 'TC';
  }    
  if(isset($data['truck_in'])) {
      $move_types[] = 'CT';
  }  
  if(isset($data['stuffing'])) {
      //$move_types[] = 'CT';
  }  
  if(isset($data['unstuffing'])) {
      //$move_types[] = 'CT';
  } 
  if(isset($data['rail_in'])) {
      $move_types[] = 'YR';
  }  
  if(isset($data['rail_out'])) {
      $move_types[] = 'RY';
  } 
  if(count($move_types) > 0) {
       $result->andWhere('sp.move_type IN (:move_type)')
               ->setParameter('move_type',$move_types);

  } else {
      $result->andWhere("1 = 2");
  }

 //container types
 if(isset($data['empty']) && isset($data['full'])) {
     //skipping
 }
 elseif (isset($data['empty'])) {
    $result->andWhere('sp.ctnr_status = :ctnr_status')
           ->setParameter('ctnr_status',self::CTNR_EMPTY);
}
elseif (isset($data['full'])) {
    $result->andWhere('sp.ctnr_status = :ctnr_status')
           ->setParameter('ctnr_status',self::CTNR_FULL);

    if(isset($data['weight_from'])) {
        $result->andWhere("cast(replace([weight],',','.') as float) :weight_from")
               ->setParameter('weight_from',$data['weight_from']);
        echo 'weight from';
    }
    if(isset($data['weight_to'])) {
        $result->andWhere('sp.weight <= :weight_to')
               ->setParameter('weight_to',(string)$data['weight_to']);
    }

}       

/*
//excpetion
$result->andWhere('sp.move_type NOT IN (:move_type_not)')
       ->setParameter('move_type_not',array('TY','YT'));     

  */     
 if(isset($data['today']) || isset($data['yesterday'])) {
     //yesterday
     if(isset($data['yesterday'])) {
        $yesterday = new \DateTime(date("Ymd"));
        $interval = new \DateInterval("P1D");
        $interval->invert = 1;
        $yesterday->add($interval);
     }

     //yesterday + today
    if(isset($data['today']) && isset($data['yesterday'])) {
        $result->andWhere('sp.move_time >= :yesterday')
                ->setParameter('yesterday',$yesterday->format("Ymd000000"));
    } 
    elseif(isset($data['yesterday'])) {
        $result->andWhere('sp.move_time >= :yesterday_from AND sp.move_time <= :yesterday_to')
                ->setParameter('yesterday_from',$yesterday->format("Ymd000000"))
                ->setParameter('yesterday_to',$yesterday->format("Ymd235959"));
     }
     elseif(isset($data['today'])) {
        $result->andWhere("sp.move_time = :today")
                ->setParameter('today',date("Ymd000000"));   
     } 
    } 
    else {
       //date conditions
       $date_from =  new \DateTime(strtotime($data['date_from']));
       $date_to =  new \DateTime(strtotime($data['date_to']));

       $result->andWhere("sp.move_time >= :date_from")
               ->setParameter('date_from',$date_from->format("Ymd000000"));
       $result->andWhere("sp.move_time <= :date_to")
               ->setParameter('date_to',$date_to->format("Ymd235959"));
    }
    //booking
    if(isset($data['booking']) && !empty($data['booking'])) {
       $result->andWhere("sp.booking = :booking")
               ->setParameter('booking',$data['booking']);   
    }


    //is reffer
    if(isset($data['reefer'])) {
       $result->andWhere("sp.reefer_flag = :reefer")
               ->setParameter('reefer','Y');   
    }

    //is damage
    if(isset($data['damage'])) {
       $result->andWhere("sp.hazards <> ''");  //$result->expr()->neq("sp.hazards","")  
    }

    //specific_type
    if(isset($data['specific_type'])) {
        /*
        $result->andWhere("sp.equip_type <> :specific_type")
                 ->setParameter('specific_type',$data['specific_type']);
         *
         */
    }

    //specific_type
    if(isset($data['container_type_20']) && isset($data['container_type_40'])) {
        //$result->andWhere("sp.equip_type <> :specific_type")
        //         ->setParameter('specific_type',$data['specific_type']);
    }
    elseif(isset($data['container_type_20'])) {
              $result->andWhere($result->expr()->substring('sp.equip_type',1,1)." = :equip_type")
                       ->setParameter('equip_type',2);
    }
    elseif(isset($data['container_type_40'])) {
              $result->andWhere($result->expr()->substring('sp.equip_type',1,1)." = :equip_type")
                       ->setParameter('equip_type',4);
    }
   return $result->setMaxResults(30)->getQuery();
存储库方法:

 public function findOperationReport($condition = array()) {

  $data = $condition['record'];
  $move_types = array();

  $result = $this->createQueryBuilder("sp")
                    ->addSelect("sp");


  // move types
  if(isset($data['vessel_discharge'])) {
      //$move_types[] = $this->container->getParameter('MOVE_TYPE.VESSEL_DIS');
       $move_types[] = 'VY';
  }
  if(isset($data['vessel_loading'])) {
      //$move_types[] = $this->container->getParameter('MOVE_TYPE.VESSEL_LOAD');
       $move_types[] = 'YV';
  }      
  if(isset($data['truck_out'])) {
      $move_types[] = 'TC';
  }    
  if(isset($data['truck_in'])) {
      $move_types[] = 'CT';
  }  
  if(isset($data['stuffing'])) {
      //$move_types[] = 'CT';
  }  
  if(isset($data['unstuffing'])) {
      //$move_types[] = 'CT';
  } 
  if(isset($data['rail_in'])) {
      $move_types[] = 'YR';
  }  
  if(isset($data['rail_out'])) {
      $move_types[] = 'RY';
  } 
  if(count($move_types) > 0) {
       $result->andWhere('sp.move_type IN (:move_type)')
               ->setParameter('move_type',$move_types);

  } else {
      $result->andWhere("1 = 2");
  }

 //container types
 if(isset($data['empty']) && isset($data['full'])) {
     //skipping
 }
 elseif (isset($data['empty'])) {
    $result->andWhere('sp.ctnr_status = :ctnr_status')
           ->setParameter('ctnr_status',self::CTNR_EMPTY);
}
elseif (isset($data['full'])) {
    $result->andWhere('sp.ctnr_status = :ctnr_status')
           ->setParameter('ctnr_status',self::CTNR_FULL);

    if(isset($data['weight_from'])) {
        $result->andWhere("cast(replace([weight],',','.') as float) :weight_from")
               ->setParameter('weight_from',$data['weight_from']);
        echo 'weight from';
    }
    if(isset($data['weight_to'])) {
        $result->andWhere('sp.weight <= :weight_to')
               ->setParameter('weight_to',(string)$data['weight_to']);
    }

}       

/*
//excpetion
$result->andWhere('sp.move_type NOT IN (:move_type_not)')
       ->setParameter('move_type_not',array('TY','YT'));     

  */     
 if(isset($data['today']) || isset($data['yesterday'])) {
     //yesterday
     if(isset($data['yesterday'])) {
        $yesterday = new \DateTime(date("Ymd"));
        $interval = new \DateInterval("P1D");
        $interval->invert = 1;
        $yesterday->add($interval);
     }

     //yesterday + today
    if(isset($data['today']) && isset($data['yesterday'])) {
        $result->andWhere('sp.move_time >= :yesterday')
                ->setParameter('yesterday',$yesterday->format("Ymd000000"));
    } 
    elseif(isset($data['yesterday'])) {
        $result->andWhere('sp.move_time >= :yesterday_from AND sp.move_time <= :yesterday_to')
                ->setParameter('yesterday_from',$yesterday->format("Ymd000000"))
                ->setParameter('yesterday_to',$yesterday->format("Ymd235959"));
     }
     elseif(isset($data['today'])) {
        $result->andWhere("sp.move_time = :today")
                ->setParameter('today',date("Ymd000000"));   
     } 
    } 
    else {
       //date conditions
       $date_from =  new \DateTime(strtotime($data['date_from']));
       $date_to =  new \DateTime(strtotime($data['date_to']));

       $result->andWhere("sp.move_time >= :date_from")
               ->setParameter('date_from',$date_from->format("Ymd000000"));
       $result->andWhere("sp.move_time <= :date_to")
               ->setParameter('date_to',$date_to->format("Ymd235959"));
    }
    //booking
    if(isset($data['booking']) && !empty($data['booking'])) {
       $result->andWhere("sp.booking = :booking")
               ->setParameter('booking',$data['booking']);   
    }


    //is reffer
    if(isset($data['reefer'])) {
       $result->andWhere("sp.reefer_flag = :reefer")
               ->setParameter('reefer','Y');   
    }

    //is damage
    if(isset($data['damage'])) {
       $result->andWhere("sp.hazards <> ''");  //$result->expr()->neq("sp.hazards","")  
    }

    //specific_type
    if(isset($data['specific_type'])) {
        /*
        $result->andWhere("sp.equip_type <> :specific_type")
                 ->setParameter('specific_type',$data['specific_type']);
         *
         */
    }

    //specific_type
    if(isset($data['container_type_20']) && isset($data['container_type_40'])) {
        //$result->andWhere("sp.equip_type <> :specific_type")
        //         ->setParameter('specific_type',$data['specific_type']);
    }
    elseif(isset($data['container_type_20'])) {
              $result->andWhere($result->expr()->substring('sp.equip_type',1,1)." = :equip_type")
                       ->setParameter('equip_type',2);
    }
    elseif(isset($data['container_type_40'])) {
              $result->andWhere($result->expr()->substring('sp.equip_type',1,1)." = :equip_type")
                       ->setParameter('equip_type',4);
    }
   return $result->setMaxResults(30)->getQuery();
我可以在没有KnpPaginatorBundle的情况下执行本机sql查询(需要0.333毫秒)

 public function findOperationReport($condition = array()) {

  $data = $condition['record'];
  $move_types = array();

  $result = $this->createQueryBuilder("sp")
                    ->addSelect("sp");


  // move types
  if(isset($data['vessel_discharge'])) {
      //$move_types[] = $this->container->getParameter('MOVE_TYPE.VESSEL_DIS');
       $move_types[] = 'VY';
  }
  if(isset($data['vessel_loading'])) {
      //$move_types[] = $this->container->getParameter('MOVE_TYPE.VESSEL_LOAD');
       $move_types[] = 'YV';
  }      
  if(isset($data['truck_out'])) {
      $move_types[] = 'TC';
  }    
  if(isset($data['truck_in'])) {
      $move_types[] = 'CT';
  }  
  if(isset($data['stuffing'])) {
      //$move_types[] = 'CT';
  }  
  if(isset($data['unstuffing'])) {
      //$move_types[] = 'CT';
  } 
  if(isset($data['rail_in'])) {
      $move_types[] = 'YR';
  }  
  if(isset($data['rail_out'])) {
      $move_types[] = 'RY';
  } 
  if(count($move_types) > 0) {
       $result->andWhere('sp.move_type IN (:move_type)')
               ->setParameter('move_type',$move_types);

  } else {
      $result->andWhere("1 = 2");
  }

 //container types
 if(isset($data['empty']) && isset($data['full'])) {
     //skipping
 }
 elseif (isset($data['empty'])) {
    $result->andWhere('sp.ctnr_status = :ctnr_status')
           ->setParameter('ctnr_status',self::CTNR_EMPTY);
}
elseif (isset($data['full'])) {
    $result->andWhere('sp.ctnr_status = :ctnr_status')
           ->setParameter('ctnr_status',self::CTNR_FULL);

    if(isset($data['weight_from'])) {
        $result->andWhere("cast(replace([weight],',','.') as float) :weight_from")
               ->setParameter('weight_from',$data['weight_from']);
        echo 'weight from';
    }
    if(isset($data['weight_to'])) {
        $result->andWhere('sp.weight <= :weight_to')
               ->setParameter('weight_to',(string)$data['weight_to']);
    }

}       

/*
//excpetion
$result->andWhere('sp.move_type NOT IN (:move_type_not)')
       ->setParameter('move_type_not',array('TY','YT'));     

  */     
 if(isset($data['today']) || isset($data['yesterday'])) {
     //yesterday
     if(isset($data['yesterday'])) {
        $yesterday = new \DateTime(date("Ymd"));
        $interval = new \DateInterval("P1D");
        $interval->invert = 1;
        $yesterday->add($interval);
     }

     //yesterday + today
    if(isset($data['today']) && isset($data['yesterday'])) {
        $result->andWhere('sp.move_time >= :yesterday')
                ->setParameter('yesterday',$yesterday->format("Ymd000000"));
    } 
    elseif(isset($data['yesterday'])) {
        $result->andWhere('sp.move_time >= :yesterday_from AND sp.move_time <= :yesterday_to')
                ->setParameter('yesterday_from',$yesterday->format("Ymd000000"))
                ->setParameter('yesterday_to',$yesterday->format("Ymd235959"));
     }
     elseif(isset($data['today'])) {
        $result->andWhere("sp.move_time = :today")
                ->setParameter('today',date("Ymd000000"));   
     } 
    } 
    else {
       //date conditions
       $date_from =  new \DateTime(strtotime($data['date_from']));
       $date_to =  new \DateTime(strtotime($data['date_to']));

       $result->andWhere("sp.move_time >= :date_from")
               ->setParameter('date_from',$date_from->format("Ymd000000"));
       $result->andWhere("sp.move_time <= :date_to")
               ->setParameter('date_to',$date_to->format("Ymd235959"));
    }
    //booking
    if(isset($data['booking']) && !empty($data['booking'])) {
       $result->andWhere("sp.booking = :booking")
               ->setParameter('booking',$data['booking']);   
    }


    //is reffer
    if(isset($data['reefer'])) {
       $result->andWhere("sp.reefer_flag = :reefer")
               ->setParameter('reefer','Y');   
    }

    //is damage
    if(isset($data['damage'])) {
       $result->andWhere("sp.hazards <> ''");  //$result->expr()->neq("sp.hazards","")  
    }

    //specific_type
    if(isset($data['specific_type'])) {
        /*
        $result->andWhere("sp.equip_type <> :specific_type")
                 ->setParameter('specific_type',$data['specific_type']);
         *
         */
    }

    //specific_type
    if(isset($data['container_type_20']) && isset($data['container_type_40'])) {
        //$result->andWhere("sp.equip_type <> :specific_type")
        //         ->setParameter('specific_type',$data['specific_type']);
    }
    elseif(isset($data['container_type_20'])) {
              $result->andWhere($result->expr()->substring('sp.equip_type',1,1)." = :equip_type")
                       ->setParameter('equip_type',2);
    }
    elseif(isset($data['container_type_40'])) {
              $result->andWhere($result->expr()->substring('sp.equip_type',1,1)." = :equip_type")
                       ->setParameter('equip_type',4);
    }
   return $result->setMaxResults(30)->getQuery();
//开始
$query=$this->getDoctrine()
->getEntityManager('sparcs')->getConnection()->executeQuery(
"选择,*
从(选择行号()
结束(
ORDER BY(选择0))作为“doctrine_rownum”,
b0_u1;id作为id0,
b0.集装箱作为集装箱1,
b0.容器\u使用\u键作为容器\u使用\u键2,
b0线与第3线相同,
b0.计费线路作为计费线路4,
b0。移动时间为移动时间5,
b0.移动类型为移动类型6,
b0位置从第7位开始,
b0位置到AS位置到8,
b0.旋转编号为旋转编号9,
b0.从车到车,从车到车,
b0.对车和对车11,
b0.从che_kind到che_kind 12,
B.到车的种类到车的种类13,
b0.从第14章开始,从第14章开始,
b0.至che_op至che_op15,
b0_uu.功率作为功率16,
b0.作为内部卡车的内部卡车17,
b0.升降机作为升降机18,
b0.码头起重机作为码头起重机19,
b0.牌照作为牌照20,
b0.卡车司机id为卡车司机id 21,
b0.卡车司机姓名为卡车司机姓名22,
b0_uuu.arrv_uqual作为arrv_uqual23,
b0.作为卸货承运人的卸货承运人24,
b0部门资格为部门资格25,
b0部门承运人作为部门承运人26,
b0.发票作为发票27,
b0_uu2;作为出航的出航28,
b0.劳埃德船级社规范为劳埃德船级社规范29,
b0.加载端口作为加载端口30,
b0排放口作为排放口31,
b0.目的地作为目的地32,
b0.装备类型为装备类型33,
b0.捆绑为捆绑34,
b0.ctnr类别作为ctnr类别35,
b0.ctnr\U状态为ctnr\U状态36,
b0。ctnr_停止,因为ctnr_停止37,
b0.作为商品的商品38,
b0.重量等于重量39,
b0.作为损坏的损坏40,
b0.冷藏箱温度作为冷藏箱温度41,
b0.冷藏车标志作为冷藏车标志42,
b0.损坏详情作为损坏详情43,
b0.密封件1作为密封件144,
b0.轨道车id为轨道车id45,
b0.暂停时间作为暂停时间46,
b0.特殊装载作为特殊装载47,
b0.作为服务的服务48,
b0.作为预订进行预订49,
b0.发布注释作为发布注释50,
b0。cmr\U编号为cmr\U编号51,
b0.作为货运代理的货运代理52,
b0.货物代理作为货物代理53,
b0.发票编号为发票编号54,
b0.发票状态为发票状态55,
b0。最后一个标志作为最后一个标志56,
b0.sparcs\U用户作为sparcs\U用户57,
b0.程序作为程序58,
b0_.id为id59,
b0.集装箱作为集装箱60,
b0.容器\u使用\u键作为容器\u使用\u键61,
b0.行作为第62行,
b0.计费线路作为计费线路63,
b0。移动时间为移动时间64,
b0.移动类型为移动类型65,
b0位置从第66位开始,
b0位置至AS位置至67,
b0.旋转编号为旋转编号68,
b0.从_che到_che69,
b0至che至che至che 70,
b0.从che_kind到che_kind 71,
例如:,
b0.从che_op到che_op73,
b0.至che_op至che_op74,
b0_u.功率为功率75,
b0.作为内部卡车的内部卡车76,
b0.升降机作为升降机77,
b0.码头起重机作为码头起重机78,
b0.车牌作为车牌79,
b0.卡车司机id为卡车司机id 80,
b0.卡车司机姓名为卡车司机