none
[SQL Server 2005]sql急待优化,dgdba请进 RRS feed

  • 问题

  • 各位,小弟的sql继续优化,受限于老业务,我只是在上面优化一下,所以sql比较繁琐,望大家多提优化意见,拍砖的不要

    主要是RecordCount = COUNT(1) OVER ( ) 加上它查询时间为22秒,去掉它查询时间为500ms,这个东西用于分页所以没办法去掉

     

    WITH    Records
              AS ( SELECT   ROW_NUMBER() OVER ( ORDER BY T.detail_id ) AS RecordNumber ,
                            RecordCount = COUNT(1) OVER ( ) ,
                            T.*
                   FROM     ( SELECT DISTINCT
                                        atd.detail_id ,
                                        atd.WareId ,
                                        atd.WareName ,
                                        atd.Num ,
                                        atd.productid ,
                                        atd.orderid ,
                                        atd.TypeOfRfid ,
                                        atd.price ,
                                        at.FromTime ,
                                        at.TimeUpdated ,
                                        AT.IdCompany
                              FROM      T1 at WITH ( NOLOCK )
                                        JOIN T1Deail atd ( NOLOCK ) ON atd.rfid = at.Transfer_id
                              WHERE     YN = 1
                                        AND IO = 0
                                        AND Status = 4
                                        AND IdCompany = 6
                                        AND StoreFrom = 1
                            ) T
                 )
        SELECT  * ,
                ( CASE WHEN Records.IdCompany = 6 THEN 'XX公司'
                       WHEN Records.IdCompany = 3 THEN 'XY分公司'
                       WHEN Records.IdCompany = 10 THEN 'XZ分公司'
                       WHEN Records.IdCompany = 4 THEN 'XC分公司'
                       WHEN Records.IdCompany = 600 THEN 'DF分公司'
                       ELSE '未知机构'
                  END ) AS NewIdCompanyStr ,
                ap.IdSupplier AS Supplier ,
                ap.price AS price1
        FROM    Records WITH ( NOLOCK )
                JOIN dbo.Product (NOLOCK) AS ap ON ap.productid = Records.productid
                                                   AND ap.OrderId = Records.orderid
        WHERE   RecordNumber BETWEEN 1 AND 1000
    


     



    2011年12月2日 6:46

答案

全部回复

  • 试试 将这个排序字段设置为聚集索引


    family as water
    2011年12月2日 7:24
  • RecordCount = COUNT(1) OVER ( ) 统计总记录数,改为无连接条件的JOIN (Select Count(*) ...)即可

    Try SQL Server 2008 QQ:315054403 dgdba@hotmail.com
    2011年12月2日 9:43
  • 十分感谢各位的回复
    2011年12月2日 10:56
  • RecordCount = COUNT(1) OVER ( ) 统计总记录数,改为无连接条件的JOIN (Select Count(*) ...)即可

    Try SQL Server 2008 QQ:315054403 dgdba@hotmail.com
    不好意思,怎么做无连接条件的join啊,没有on的话执行不过去,on 1=1的话速度没改善

    2011年12月8日 5:45
  • select * from table1 
    cross join (select count(*) as count from table1) as faketable
    
     
    2011年12月9日 8:42
  • 总记录数不用Count, 2000里可查sysIndexes里的RowCnt,2005、2008可查分区表Sys.Partitions里的某列

    若此查询频繁,应该按Where ID值可选择性高的列去聚焦索引

    Records里IdCompany = 6是死条件,那么后面就不用Case When 再去判断了


    Try SQL Server 2008 QQ:315054403 dgdba@hotmail.com
    2011年12月10日 6:13