选择主键字段中具有最大值的行的最快捷方式



我有一张表:

CREATE TABLE spots(
    datetime TIMESTAMP,
    market VARCHAR(15),
    spot NUMERIC(10, 5),
    PRIMARY KEY (market, datetime)
);

我需要为p_market选择一行,其中datetime字段的最大值小于或等于p_datetime,所以我有两个选择:

SELECT * FROM spots WHERE market = p_market AND datetime = (
    SELECT MAX(datetime) FROM spots WHERE market = p_market AND datetime <= p_datetime
);

SELECT * FROM spots WHERE market = p_market AND datetime <= p_datetime
ORDER BY datetime DESCENDING LIMIT 1;

因此,问题是——从性能的角度来看,哪种变体更好。

Postgres支持窗口函数,理论上应该随着行的处理而递增计算,因此它应该在大数据集上提供一些性能提升:

SELECT * 
FROM   (SELECT *,
               RANK() OVER (ORDER BY datetime DESC) AS rk
        FROM   spots
        WHERE  market = p_market AND datetime <= p_datetime) t
FROM   spots 
WHERE  rk = 1