关于为大型查询优化数据库的一般问题
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
可能会有所帮助。除此之外,更大的内存和更快的存储绝对没有坏处。
我有一个数据库,用于存储来自工厂传感器的数据。数据库中每个传感器每天包含大约 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
可能会有所帮助。除此之外,更大的内存和更快的存储绝对没有坏处。