PostgreSQL 中对大表的简单平均查询比 SQL Server 慢得多

Sta*_*eff 5 postgresql performance group-by postgresql-performance

我有一个包含三个表的数据库itemsparameters并且measurements在两个服务器中都想查询该measuerment表。但是在 PostgeSQL (9.4) 和 SQL Server (2012) 中查询要慢得多。

measurements

column         | type                 | attributes
---------------+----------------------+-----------------------------------------------------------
id             | int/serial           | (identity) primary key
measuretime    | datetime/timestamp   | not null
parameter_id   | int                  | not null (foreign key) references parameters(id)
item_id        | int                  | not null (foreign key) references items(id)
value          | float                | not null
Run Code Online (Sandbox Code Playgroud)

和两个nonclustered indexmeasuretimeparameter_id

我插入了 2.609.280 行items(半年,每行间隔 5 秒)和 31.311.360 行measurements(每个项目有 12 个参数)。

当我现在尝试查询每个参数每天的平均值时,它在 SQL Server (00:00:02) 上表现得非常好,但在 PostgreSQL (00:00:53) 上表现很差。

SQL Server 查询:

select parameter_id, convert(date, measuretime), avg(value)
from measurements
group by parameter_id, convert(date, measuretime)
Run Code Online (Sandbox Code Playgroud)

PostgreSQL 查询:

select parameter_id, date(measuretime), avg("value")
from measurements
group by parameter_id, date(measuretime)
Run Code Online (Sandbox Code Playgroud)

我能做些什么吗?创建索引?一些服务器设置?更改查询?

Eva*_*oll 2

在 PostgreSQL 9.6 中,日期构造函数已修复。

提高时间戳、时间和日期数据类型的输出函数的速度(David Rowley、Andres Freund)

您可以在此处查看此内容的提交盛宴。大约快了 20 倍。此外9.6还支持并行顺序扫描。因此,在单核上这可能会快 20 倍。而且,整个扫描可能能够使用系统上的所有核心。

  1. 下载9.6
  2. 再试一次。
  3. 返回结果。