Оптимизировать запрос выбора (внутренний выбор + группа) - PullRequest
0 голосов
/ 20 мая 2011

Моя текущая версия:

SELECT     DT, AVG(DP_H2O) AS Tx,
           (SELECT    AVG(Abs_P) / 1000000 AS expr1
           FROM       dbo.BACS_MinuteFlow_1
           WHERE      (DT =
                                     (SELECT     MAX(DT) AS Expr1
                                       FROM      dbo.BACS_MinuteFlow_1
                                       WHERE     DT <= dbo.BACS_KongPrima.DT ))
          GROUP BY DT) AS Px
  FROM    dbo.BACS_KongPrima
  GROUP BY DT

, но она работает очень медленно.

В основном во внутреннем выборе я выбираю максимальное время, близкое к моему времени, затем группирую по этому ближайшему времени..

Возможны ли оптимизации?Может быть, я могу как-то присоединиться к нему, но проблема в том, что я не уверен, как группировать к этой ближайшей дате.

Спасибо

1 Ответ

1 голос
/ 21 мая 2011

Вы можете попытаться изменить его, используя приведенный ниже код, используя перекрестное применение.Не уверен, что это улучшит производительность, но обычно я стараюсь любой ценой избегать использования запроса к определенному столбцу, и SQL Server довольно хорошо оптимизирует оператор Apply.

WITH  Bacs_MinuteFlow_1  (Abs_P ,DT ) AS
(SELECT 5.3,'2011/10/10'
    UNION SELECT 6.2,'2011/10/10'
    UNION SELECT 7.8,'2011/10/10'
    UNION SELECT 5.0,'2011/03/10'
    UNION SELECT 4.3,'2011/03/10'),
BACS_KongPrima (DP_H2O ,DT)AS
(SELECT 2.3,'2011/10/15'
    UNION SELECT 2.6,'2011/10/15'
    UNION SELECT 10.2,'2011/03/15')

SELECT DT, AVG(DP_H2O) AS Tx,
       a.Px

FROM    BACS_KongPrima
CROSS APPLY  
(
SELECT AVG(Abs_P) / 1000000 AS Px 
FROM BACS_MinuteFlow_1 
WHERE DT =
    (SELECT     MAX(DT) AS maxdt 
     FROM      BACS_MinuteFlow_1
     WHERE     DT <= BACS_KongPrima.DT
    )
) a
GROUP BY DT,a.Px

Cheers

...