【问题标题】:How can I optimize my sql query for faster results rendering如何优化我的 sql 查询以更快地呈现结果
【发布时间】:2017-11-15 22:34:59
【问题描述】:

我的 MS SQL Server 查询使用了很多子查询,当在具有近 10000000 大数据的服务器上运行时,它需要永远执行。我需要一种更好的方法来重建查询以使其更快。

这里是查询:

 <?php
                        $query =  "SELECT ".$limitresult." * FROM customer c INNER JOIN (SELECT MIN(ac_no) ac_no 
                                    FROM loans where full_paid ='0' GROUP BY ac_no) AS l ON c.cust_no = l.ac_no and 
                                    cust_type = 'BUS' ".$branchid." ".$accnos." ";
                        $check =  @sqlsrv_query($conn, $query);
                        $i = 1;
                        while($rows = @sqlsrv_fetch_array( $check, SQLSRV_FETCH_ASSOC)) {

                        $que22 = "select * from company";
                        $checks22 = sqlsrv_query($conn, $que22);
                        $row22 = @sqlsrv_fetch_array($checks22, SQLSRV_FETCH_ASSOC);
                        $comi = $row22['branch'];

                         $ques = "select BRSES_DATE from company";
                        $checks22y = sqlsrv_query($conn, $ques);
                        $row22y = sqlsrv_fetch_array($checks22y, SQLSRV_FETCH_ASSOC);
                        $dat = @$row22y['BRSES_DATE']->format('Y-m-d H:m:i');

                        $iu = $rows['cust_no'];
                        $qur = "SELECT Member.Branch,Member.GL_No,Member.Ac_NO,Member.BRANCH+Member.GL_NO+Member.AC_NO AS BRGLAC,Customer.Cust_No,Customer.Name,Group_Name,ID_CARD,Subgroup as subgroup2,Cust_Type,Cust_Sex,Cust_Cat,Area_Code,Cust_Type,Dobirth,Address,Ref_No,Bank_VNO,Cust_Ca2,nType,Group_Code FROM Member INNER JOIN CUSTACC ON Member.Branch = CustAcc.Branch AND cust_no='$iu' AND Member.GL_NO = CustACC.GL_No AND Member.AC_NO = CustACC.AC_No INNER JOIN Customer ON Member.Branch = Customer.Branch AND Member.Cust_No = Customer.Cust_No WHERE CUSTACC.Exp_Date < '$dat'  AND Member.Branch = '$comi' AND  MEMBER.Gl_NO IN (SELECT Coa.GL_NO FROM Coa WHERE Product = 'S' )";

                            $che = sqlsrv_query($conn, $qur);
                            $roe = @sqlsrv_fetch_array($che, SQLSRV_FETCH_ASSOC);

                            $c = $rows['cust_no'];

                            $ret ="select * from fssign where cust_no='$c'";
                            $c = sqlsrv_query($conn, $ret);
                           $r = sqlsrv_fetch_array($c, SQLSRV_FETCH_ASSOC);
                           //$cod = $r['bus_type'];

                ?>

【问题讨论】:

  • 连接几乎总是比子查询快
  • 先把你正在使用的rdbms产品弄对。不是mysql,而是ms sql server。
  • 发布您的主要查询并获取执行时间
  • @rtfm,正是我需要专家帮助我进行更好优化的原因。
  • 还是php太多了,你的问题应该只有t-sql语句你这里有t-sql语句,你有什么问题?也只是 t-sql 没有 php。

标签: php sql sql-server


【解决方案1】:

不太了解您的基表以及您遇到问题的确切查询,我可以推荐的一项改进是使用存储过程动态构建您的查询,而不是在 php 中构建它。并确保您使用 sp_executesql 系统存储过程来执行动态 t-sql 查询,这将使您受益于参数化执行计划。

对于你问题中的第一个 t-sql 语句,我会写一个类似这样的 proc...

CREATE PROCEDURE usp_MySpsNameBLabla
  @LimitResults INT = NULL
, @BranchID     INT = NULL
, @AccountNo    INT = NULL
AS
BEGIN
   SET NOCOUNT ON;
   Declare @Sql NVARCHAR(MAX);

SET @Sql = N'SELECT ' + CASE WHEN @LimitResults IS NOT NULL
                        THEN N' TOP (@LimitResults) ' ELSE N' ' END
         + N'        * 
            FROM customer c 
            INNER JOIN (
                         SELECT MIN(ac_no) ac_no 
                         FROM loans 
                         where full_paid =''0'' 
                         GROUP BY ac_no
                        ) AS l ON c.cust_no = l.ac_no 
            WHERE  c.cust_type = ''BUS'''
         + CASE WHEN @BranchID IS NOT NULL 
           THEN N' AND c.BranchID = @BranchID ' ELSE N' ' END
         + CASE WHEN @AccountNo IS NOT NULL 
           THEN N' AND c.ac_no = @AccountNo ' ELSE N' ' END

Exec sp_executesql @sql 
                  ,N'@LimitResults INT ,@BranchID INT , @AccountNo INT '
                  ,@LimitResults
                  ,@BranchID
                  ,@AccountNo
END

【讨论】:

  • 非常感谢您抽出宝贵时间...我会这样做的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 2016-02-27
  • 2022-09-30
  • 2020-04-25
  • 1970-01-01
  • 1970-01-01
  • 2012-06-27
相关资源
最近更新 更多