Sql 关于为大型查询优化数据库的一般问题
我有一个数据库,存储工厂传感器的数据。DB每天每个传感器包含约160万行。我在DB上有以下索引Sql 关于为大型查询优化数据库的一般问题,sql,postgresql,aws-aurora-serverless,Sql,Postgresql,Aws Aurora Serverless,我有一个数据库,存储工厂传感器的数据。DB每天每个传感器包含约160万行。我在DB上有以下索引 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) OVE
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 serverless上运行PostgreSQL 10.12
问题:除了索引之外,我还可以对数据库执行其他优化以使查询运行更快吗?要以最佳方式支持查询,必须以其他方式定义索引:
CREATE INDEX ON sensor_data (sensor_name, time_stamp);
否则,PostgreSQL必须读取时间间隔内的所有索引值,然后丢弃错误传感器的索引值,然后从表中提取行
使用正确的列顺序,索引中只扫描所需的行
您要求进行其他优化:因为您必须对行进行排序,因此增加
work\u mem
可能是有益的。除此之外,更多的内存和更快的存储肯定不会有什么坏处。要以最佳方式支持查询,必须以另一种方式定义索引:
CREATE INDEX ON sensor_data (sensor_name, time_stamp);
否则,PostgreSQL必须读取时间间隔内的所有索引值,然后丢弃错误传感器的索引值,然后从表中提取行
使用正确的列顺序,索引中只扫描所需的行
您要求进行其他优化:因为您必须对行进行排序,因此增加
work\u mem
可能是有益的。除此之外,更多的内存和更快的存储肯定不会有什么坏处。我是必须删除旧索引还是只能有两个索引?你应该删除旧索引-它浪费空间和性能。原始索引可能是(自然的)主键。在这种情况下,它应该是独一无二的。(是的:键列的顺序当然很重要)我必须删除旧索引还是只能有两个索引?你应该删除旧索引-它浪费空间和性能。原始索引可能是(自然)主键。在这种情况下,它应该是独一无二的。(当然,关键列的顺序也很重要)