首页 > 解决方案 > SQL Server 中 MIN/MAX 的更快替代方案

问题描述

我需要过去 n 天的最低/最高股票价格。以下查询的工作速度非常慢。我将不胜感激更快的选择:

SELECT 
    *, 
    MIN(Close) OVER (PARTITION BY Ticker ORDER BY PriceDate ROWS BETWEEN 14 PRECEDING AND 1 PRECEDING) AS MinPrice14d,
    MAX(Close) OVER (PARTITION BY Ticker ORDER BY PriceDate ROWS BETWEEN 14 PRECEDING AND 1 PRECEDING) AS MaxPrice14d
FROM
    (SELECT CompanyID, Ticker, PriceDate, Close            
     FROM price.PriceHistoryDaily) a

标签: sqlsql-serverwindow-functionspartitioning

解决方案


虽然不影响性能,但不需要子查询。所以从更简单的版本开始:

SELECT phd.CompanyID, phd.Ticker, phd.PriceDate, phd.Close,
       min(Close) over (partition by Ticker
                        order by PriceDate
                        rows between 14 preceding and 1 preceding
                       ) as MinPrice14d,
       max(Close) over (partition by Ticker
                        order by PriceDate
                        rows between 14 preceding and 1 preceding
                       ) as MaxPrice14d
FROM price.PriceHistoryDaily phd;

然后尝试添加索引: PriceHistoryDaily(Ticker, PriceDate)

注意:这将返回所有行,PriceHistoryDaily并且 - 取决于表的大小 - 这可能是推动性能的原因。


推荐阅读