Postgres - 获取多个表中所有行的最快方法

问题描述 投票:0回答:2
SELECT table_1.time, table_1.time, table_2.time FROM table_1 
INNER JOIN table_2 on table_1.time = table_2.time 
INNER JOIN table_3 on table_1.time = table_3.time
...;

我使用上面的查询语法来查询多个表中的所有行,连接来自不同表的列,然后返回。但是,随着表中行数的增加和表的数量的增加,性能会大幅下降。有没有办法优化查询性能?每个表大约有0.1到100万行。

我听过像索引,分区和SSD这样的术语,但我真的是Postgres的新手,并且不确定要查看哪一个。任何人都可以提供一些比我现在更好的查询命令语法,或者提供一些关于编辑数据库结构的详细建议吗?

编辑:加载页面时,只提取一次所有数据。所以我正在尝试加载DB中存在的所有数据以显示图形。生成初始绘图后,页面将仅查询每个表的最后一行以更新绘图。表结构非常简单。

Table 1: SPM1

        time         | spm1  |
------------------------------
 2018-09-05 22:23:52 | 43.21 |

Table 2: SPM2
        time         | spm2  |
------------------------------
 2018-09-05 22:23:52 | 43.21 |

......这些大约有30张桌子

谢谢,

sql postgresql indexing query-performance
2个回答
2
投票

根据您提到的内容,这里有一些想法可以改进。

可以将所有表格变成一个有三列的表格吗?

create table spm (
    id serial primary key,
    time datetime not null,
    spm numeric(5,2) not null,
    number smallint not null
);

insert into spm (time, spm, number)
    values ('2018-09-05 22:23:52', 43.21, 1),
           ('2018-09-05 22:23:52', 43.21, 2)

这将大大简化查询。连接是有效的,但20个连接有点多。

select time, spm, number from spm;

在加载页面时,只获取一次所有数据。所以我正在尝试加载DB中存在的所有数据以显示图形。生成初始绘图后,页面将仅查询每个表的最后一行以更新绘图。

如果这些图被缓存并定期重新生成或更新,那么这不仅对数据库查询而且对于生成图的所有时间都将是一个巨大的性能改进。


1
投票

你试过索引time字段吗?您可以创建这样的索引:

CREATE INDEX "table_1_time" ON "table_1" ("time");
CREATE INDEX "table_2_time" ON "table_2" ("time");
CREATE INDEX "table_3_time" ON "table_3" ("time");
... and so on ...

在数据库中运行一次以上查询。创建索引后,会自动添加新数据或删除旧数据。 Indexing makes queries much faster

建立索引后,再次尝试查询。但请注意,无论如何,你正在拉动整个table_1。索引可能有助于加入。

© www.soinside.com 2019 - 2024. All rights reserved.