当前位置: 代码迷 >> Sql Server >> 下面这段sql代码怎么优化
  详细解决方案

下面这段sql代码怎么优化

热度:87   发布时间:2016-04-24 09:15:45.0
下面这段sql代码如何优化
SELECT    rv.ReceiptInformationId
                                  FROM      dbo.ReturnVisit rv,
                                            dbo.DimensionCategory dc where rv.Satisfaction = dc.Id
                                            AND DC.ReservedField2=1
                                  and     rv.ReturnVisitDate = ( SELECT
                                                              MAX(rv1.ReturnVisitDate)
                                                              FROM
                                                              dbo.ReturnVisit rv1
                                                              WHERE
                                                              rv.ReceiptInformationId = rv1.ReceiptInformationId
                                                              GROUP BY rv1.ReceiptInformationId
                                                              )

这段代码我测试了一下,执行需要15分钟。ReturnVisit 表大概有8w的数据量
时间主要耗在下面的子查询:rv.ReturnVisitDate = ( SELECT
                                                              MAX(rv1.ReturnVisitDate)
                                                              FROM
                                                              dbo.ReturnVisit rv1
                                                              WHERE
                                                              rv.ReceiptInformationId = rv1.ReceiptInformationId
                                                              GROUP BY rv1.ReceiptInformationId
                                                              )
------解决思路----------------------
-- 建索引
CREATE INDEX IX_ReturnVisit_ID_Date
    ON ReturnVisit (ReceiptInformationId,ReturnVisitDate)
    INCLUDE (Satisfaction);
GO

;WITH t1 AS ( -- 求分组ID
    SELECT ReceiptInformationId
      FROM dbo.ReturnVisit
  GROUP BY ReceiptInformationId
)
,t2 AS ( -- 取每个分组日期最大的一条
        SELECT c.*
          FROM t1
   CROSS APPLY (
                    SELECT top 1
                           ReceiptInformationId,
                           Satisfaction
                      FROM dbo.ReturnVisit rv
                     WHERE rv.ReceiptInformationId = t1.ReceiptInformationId
                  ORDER BY ReturnVisitDate DESC
               ) c
)
-- 关联过滤
SELECT t2.ReceiptInformationId
  FROM t2
  JOIN dbo.DimensionCategory dc
    ON t2.Satisfaction = dc.Id
 WHERE dc.ReservedField2 = 1
  相关解决方案