【问题标题】:SQL Takes too muchSQL 占用太多
【发布时间】:2017-08-16 17:03:44
【问题描述】:

由于某种原因,我的脚本花费了太多时间,这就是为什么我不得不添加 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);

?>

【问题讨论】:

  • 你如何在 ssms 中传递这些值 ORDER BY $sort $order
  • 我觉得这是参数嗅探问题:阅读这篇文章了解更多信息:Slow in the Application, Fast in SSMS?
  • @TheGameiswar 我只是省略了它们,但如果我放置它们没有区别
  • 这有很大的不同,如果一个订单没有很好的索引来支持,它会花费很多
  • 出于示例目的,尝试使用您从应用程序传递的各种值运行,它将帮助您理解

标签: php sql-server wamp


【解决方案1】:

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

注意:您执行 'where f0b.Order_Id=f1.Id' 然后您的左 ouer 连接被取消,因为您测试了一个值(这就是我用内部连接替换的原因),如果您也想要空值,您必须这样做它:'其中 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 2015-10-14
    • 2013-07-18
    • 2013-07-11
    • 1970-01-01
    • 2020-05-18
    • 2011-09-08
    相关资源
    最近更新 更多