[英]How can i rewrite this query for faster execution
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
如果该表中的行数超过1万,它就会消失。 它的作用是为有最低收入的每个客户查找行。 总排名中的最高 给定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值只能为3和6
选择以下内容可能会更快。
(覆盖)索引
通过查看执行计划,删除不使用的索引。
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.