繁体   English   中英

SQL花费太多

[英]SQL Takes too much

由于某种原因,我的脚本花费了太多时间,这就是为什么我必须添加ini_set('max_execution_time', 300); 因为30秒是默认设置,所以我遇到了致命错误。

我不明白为什么会这样,如果我直接进入SSMS,我会在0秒内得到该查询。 会发生什么? 我正在使用php 5.4.16和扩展名php_sqlsrv_54_ts运行wamp

<?php
error_reporting(E_ALL ^ E_DEPRECATED);
ini_set('max_execution_time', 300);
include "ChromePhp.php";
$sort = isset($_POST['sort']) ? strval($_POST['sort']) : 'Cliente';
$order = isset($_POST['order']) ? strval($_POST['order']) : 'DESC';

include "includes/db_config.php";
$conn = sqlsrv_connect(SV_NAME, $connectionInfo) OR die("Unable to connect to the database");
$sql = 
"SELECT  *  FROM
(Select 
    Id
    ,Cliente
    ,Contrato
    ,Anexo
    ,SO
    ,NombreFlota
    ,(SELECT count(*) FROM LiveTest LEFT JOIN Producto ON Producto.Id=LiveTest.Producto_Id WHERE Producto.Order_Id=Orders.Id) as Hechas
    ,((SELECT count(*) FROM Producto WHERE Order_Id=Orders.Id) - (SELECT count(*) FROM LiveTest LEFT JOIN Producto ON Producto.Id=LiveTest.Producto_Id WHERE Producto.Order_Id=Orders.Id and RMA is  null )) as Pendientes
    ,(SELECT count(*) FROM Producto WHERE Order_Id=Orders.Id ) as Total
FROM
    Orders
WHERE 
    Orders.FechaPick is not null) as A
WHERE Total - Pendientes >0
ORDER BY $sort $order";
ChromePHP::log($sql);     
$params = array();
$options =  array( "Scrollable" => SQLSRV_CURSOR_KEYSET );
$result = array();  
$res = sqlsrv_query($conn, $sql, $params, $options);   
while($row = sqlsrv_fetch_object($res))            
{
    array_push($result, $row);
}   
ChromePHP::log($result);
echo json_encode($result);

?>

尝试像这样修改您的查询:

注意:您执行“ where f0b.Order_Id = f1.Id”,则您的左连接被取消,因为您测试了一个值(这就是为什么我已被内部连接替换的原因),如果您也想要空值,则必须这样做:其中f0b.Order_Id = f1.Id或f0b.Order_Id为空'

Select 
     Id
    ,Cliente
    ,Contrato
    ,Anexo
    ,SO
    ,NombreFlota
    ,isnull(f3.NbProdLive, 0)  as Hechas
    ,isnull(f2.NbProd, 0) - isnull(f3.NbProdLiveRMANull, 0) as Pendientes
    ,isnull(f2.NbProd, 0) as Total
FROM
    Orders f1
    outer apply
    (
      select count(*) NbProd from Producto f0
      where f0.Order_Id=f1.Id

    ) f2

    outer apply
    (
      select count(*) NbProdLive, sum(case when RMA is null then 1 else 0 end) NbProdLiveRMANull 
      from LiveTest f0 INNER JOIN Producto f0b ON f0b.Id=f0.Producto_Id  
      where f0b.Order_Id=f1.Id

    ) f3
WHERE f1.FechaPick is not null and (isnull(f2.NbProd, 0) - (isnull(f2.NbProd, 0) - isnull(f3.NbProdLiveRMANull, 0))) >0
ORDER BY $sort $order

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM