如何加速这些嵌套的SQL查询

时间:2014-03-06 19:20:12

标签: php sql sql-server

当我尝试这些查询时,它运行得很慢,因为我有很多数据,但我不能从顶部查询中排除任何更多,因为我需要先查看第二个查询是否导致{0总计{ {1}}和第一个查询中的futureAmts

on_hand

我尝试了$inv = odbc_exec($live,"SELECT * FROM V1ICPR WHERE Account='".$account."'"); while (odbc_fetch_array($inv)) { $futureOrds = 0; $checkFuture = odbc_exec($live,"SELECT Order_num FROM V1OEMF WHERE Account = '".$account."' AND Status='Open' AND Ship_date > '".date("Ymd")."'"); while(odbc_fetch_array($checkFuture)) { $getFutureAmt = odbc_exec($live,"SELECT Amount FROM V1OEOO WHERE bol='".odbc_result($checkFuture,'Order_num')."' AND Prod_code='".odbc_result($inv,'Prod_code')."'"); while (odbc_fetch_array($getFutureAmt)){ $futureOrds = $futureOrds + intval(odbc_result($getFutureAmt,'Amount')); } } ,但该查询无法完全运行,我的INNER JOIN查询是否存在问题?是否有更快的方法来编码?

Inner Join

如果我只运行第一个获得产品信息的第一个级别,并且没有关于未来订单的信息,它会在2秒内运行,但是使用这些嵌套查询可能需要30 - 60 +秒

TABLES:

    /*
    $checkFuture = odbc_exec($live,"SELECT V1OEMF.Order_num, V1OEOO.Amount FROM V1OEMF INNER JOIN V1OEOO ON V1OEMF.Order_num = V1OEOO.bol WHERE V1OEMF.Account = '".$account."' AND V1OEMF.Status='Open' AND V1OEMF.Ship_date > '".date("Ymd")."' AND V1OEOO.Prod_code='".odbc_result($inv,'Prod_code')."'")
    while(odbc_fetch_array($checkFuture))
    {
        $futureOrds = $futureOrds + intval(odbc_result($checkFuture,'Amount'));
    }
    */

1 个答案:

答案 0 :(得分:1)

此解决方案已在评论中得到解决,但我将其添加为未来读者的利益答案。

您需要在WHERE子句的每个列上添加索引。如果你说拥有大量数据,这将大大提高每个查询的速度。您可以使用ALTER TABLE命令执行此操作。

此外,只要您期望只有一个结果,尤其是在内部循环中,请使用TOP 1(对于MSSQL,对于MySQL为LIMIT 1)。