我有一张表:
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