sql - 在主键字段中选择具有最大值的行的最快方法

标签 sql performance postgresql greatest-n-per-group

我有一张 table :

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 支持 window function ,理论上应该在处理行时增量计算,因此它应该在大型数据集上提供一些性能提升:

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

关于sql - 在主键字段中选择具有最大值的行的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26503947/

相关文章:

sql - 如何在 postgresql 中第 4 次出现字符之前切断字符串?

mysql - 如何在与sequ​​elize Node 的关系上使用having子句

database - 在优化数据库查询时,查询数量和查询大小之间到底有什么关系?

mysql - R Shiny 应用程序中的 SQL 查询语法 - CAST

python - 如何将字典中的二维数组转换为一个数组?

sql - 更新SQL表非常慢

postgresql - AWS DMS 流复制 : Logical Decoding Output Plugins(test_decoding) not accessible

database - 持久化docker容器的数据库

sql - 如何在非远程客户端系统中使用 bcp

MySQL排名计算失败,变量始终为空