SQL 服务器中 MIN/MAX 的更快替代方案

Faster alternative of MIN/MAX in SQL Server

我需要 lowest/highest 过去 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

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

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).

注意:这 returns 所有 行来自 PriceHistoryDaily 并且 - 根据 table 的大小 - 这可能成为推动绩效的因素。