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.卡车司机姓名为卡车司机