【问题标题】:Optimize select query (inner select + group)优化select查询(内select+group)
【发布时间】:2011-05-20 12:19:58
【问题描述】:

我目前的版本是:

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

但运行速度很慢。

基本上在内部选择中,我选择最接近我的时间,然后按这个最近时间分组。

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

谢谢

【问题讨论】:

  • 您是否向 BACS_MinuteFlow_1 添加了任何索引?如果您希望加快内部查询,可能值得在 DT 列上添加索引。

标签: sql-server-2005 tsql sql-optimization


【解决方案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

干杯

【讨论】:

    猜你喜欢
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-27
    • 1970-01-01
    相关资源
    最近更新 更多