2011-05-20 128 views
0

我现在的版本是:优化选择查询(内选择+组)

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 

,但它的工作原理很慢。

基本上在内部选择我选择最大的时间附近的时间,然后按最近的时间组。

有没有可能优化?也许我可以以某种方式加入它,但麻烦我不知道如何在最近的日期分组。

谢谢

+0

你有没有加入任何BACS_MinuteFlow_1指标?如果您希望加快内部查询速度,则可能值得在DT列中添加索引。 – 2011-05-20 14:11:26

回答

1

你可以尝试重新安排它使用下面使用交叉应用的代码。我不确定这是否会提高性能,但通常我会尽量避免在特定列上使用查询,并且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 

干杯

+0

这对我来说是非常好的优化,谢谢! – Cynede 2011-05-23 17:32:59