【问题标题】:General question on optimising a database for a large query关于为大型查询优化数据库的一般问题
【发布时间】:2021-02-25 10:04:47
【问题描述】:

我有一个数据库,用于存储来自工厂传感器的数据。该数据库每天每个传感器包含大约 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;

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

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

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

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

【问题讨论】:

    标签: sql postgresql aws-aurora-serverless


    【解决方案1】:

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

    CREATE INDEX ON sensor_data (sensor_name, time_stamp);
    

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

    使用正确的列顺序,仅在索引中扫描所需的行。

    您要求进行其他优化:由于您必须对行进行排序,因此增加 work_mem 可能是有益的。除此之外,更多的内存和更快的存储肯定不会有害。

    【讨论】:

    • 我必须删除旧索引还是只有 2 个索引?
    • 你应该删除旧索引 - 它浪费空间和性能。
    • 原始索引可能是(自然)主键。在这种情况下,它应该是唯一的。 (是的:键列的顺序当然很重要)
    猜你喜欢
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 2011-10-31
    • 2021-12-15
    • 1970-01-01
    相关资源
    最近更新 更多