Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 关于为大型查询优化数据库的一般问题_Sql_Postgresql_Aws Aurora Serverless - Fatal编程技术网

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

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

我有一个数据库,存储工厂传感器的数据。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) 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
可能是有益的。除此之外,更多的内存和更快的存储肯定不会有什么坏处。

我是必须删除旧索引还是只能有两个索引?你应该删除旧索引-它浪费空间和性能。原始索引可能是(自然的)主键。在这种情况下,它应该是独一无二的。(是的:键列的顺序当然很重要)我必须删除旧索引还是只能有两个索引?你应该删除旧索引-它浪费空间和性能。原始索引可能是(自然)主键。在这种情况下,它应该是独一无二的。(当然,关键列的顺序也很重要)