2011-01-12 30 views
0
SELECT s1.ID FROM binventory_ostemp s1 JOIN 
(SELECT Cust_FkId, ProcessID, MAX(Service_Duration) AS duration 
FROM binventory_ostemp WHERE ProcessID='4d2d6068678bc' AND Overall_Rank IN 
(
    SELECT MIN(Overall_Rank) FROM binventory_ostemp WHERE ProcessID='4d2d6068678bc' GROUP BY Cust_FkId 
) 
GROUP BY Cust_FkId 
) AS s2 ON s1.Cust_FkId = s2.Cust_FkId AND s1.ProcessID=s2.ProcessID 
AND s1.Service_Duration=s2.duration AND s1.ProcessID='4d2d6068678bc' 
GROUP BY s1.Cust_FkId 

它就消失了,如果有超过10K行该表。它所做的是为每个有分钟的客户查找行。整体等级和最大值。对于一个给定的ProcessID服务持续时间的我怎样才能重写此查询以加快执行速度

表数据

ID Cust_FkId Overall_Rank Service_Duration ProcessID 
1  23  2   30    4d2d6068678bc 
2  23  1   45    4d2d6068678bc 
3  23  1   60    4d2d6068678bc 
4  56  3   90    4d2d6068678bc 
5  56  2   50    4d2d6068678bc 
6  56  2   85    4d2d6068678bc 

结果数据

结果ID值必须和仅

+0

我猜你的意思是导致ID必须是3和6,而不是5? 5具有更短的服务持续时间超过6 .. – 2011-01-12 09:13:52

回答

0

以下SELECT可能会更快。

(覆盖)上

  • Cust_FkID索引,Overall_Rank
  • Cust_FkID,Service_Duration
  • Cust_FkID,Overall_Rank,Service_Duration
  • Overall_Rank
  • Service_Duration

删除那些不习惯于通过看执行计划指标。

SQL语句

SELECT b.* 
FROM binventory_ostemp b 
     INNER JOIN (
      SELECT b.Cust_FkID 
        , ovr.Overall_Rank 
        , MAX(Service_Duration) AS Service_Duration 
      FROM binventory_ostemp b 
        INNER JOIN (
        SELECT Cust_FkID 
          , MIN(Overall_Rank) AS Overall_Rank 
        FROM binventory_ostemp   
        GROUP BY 
          Cust_FkID 
       ) ovr ON ovr.Cust_FkID = b.Cust_FKID 
          AND ovr.Overall_Rank = b.Overall_Rank   
      GROUP BY 
        b.Cust_FkID 
        , ovr.Overall_Rank 
     ) ovrs ON ovrs.Cust_FkID = b.Cust_FkID 
        AND ovrs.Overall_Rank = b.Overall_Rank 
        AND ovrs.Service_Duration = b.Service_Duration 
+0

错误:#1054 - 未知列 'ovr.Overall_Rank' 在 '上条款' – sam 2011-01-12 10:09:14