Как я могу переписать этот запрос для более быстрого выполнения - PullRequest
0 голосов
/ 12 января 2011
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 строк. находит строки для каждого клиента с мин. общего ранга и в тех макс. длительности обслуживания для данного процесса

Таблица данных

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

Данные результата

Значения идентификатора результата должны быть 3 и 6 только

1 Ответ

0 голосов
/ 12 января 2011

Следующий выбор может быть быстрее.

(покрытие) Указатели по

  • Cust_FkID, Общий_Ранк
  • Cust_FkID, Service_Duration
  • Cust_FkID, Общий_Ранк, Сервис_Длительность
  • 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...