关于为大型查询优化数据库的一般问题

General question on optimising a database for a large query

我有一个数据库,用于存储来自工厂传感器的数据。数据库中每个传感器每天包含大约 160 万行。我在数据库上有以下索引。

CREATE INDEX sensor_name_time_stamp_index ON sensor_data (time_stamp, sensor_name);

我将运行每天执行一次以下查询。

SELECT
    time_stamp, value
FROM
    (SELECT
        time_stamp,
        value,
        lead(value) OVER (ORDER BY value DESC) as prev_result
     FROM
        sensor_data WHERE time_stamp between '2021-02-24' and '2021-02-25' and sensor_name = 'sensor8'
     ORDER BY
        time_stamp DESC) as result
WHERE
    result.value IS DISTINCT FROM result.prev_result
ORDER BY
    result.time_stamp DESC;

查询 returns 值与前一行不同的行的列表。

此查询需要大约 23 秒才能 运行。

运行 在 Aurora 无服务器上的 PostgreSQL 10.12 上。

问题:除了索引之外,我可以在数据库上执行任何其他优化以使查询 运行 更快吗?

为了以最佳方式支持查询,必须以相反的方式定义索引:

CREATE INDEX ON sensor_data (sensor_name, time_stamp);

否则,PostgreSQL 将不得不读取时间间隔内的所有索引值,然后丢弃错误传感器的索引值,然后从 table.

中获取行

通过正确的列顺序,索引中只扫描所需的行。

您要求其他优化:由于您必须对行进行排序,因此增加 work_mem 可能会有所帮助。除此之外,更大的内存和更快的存储绝对没有坏处。