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-1百万行。
我听说过诸如索引,分区和SSD之类的术语,但是我确实是Postgres的新手,并且不确定要看哪个。谁能提供比我现在更好的查询命令语法,或者在编辑数据库结构时提供一些详细建议?
编辑:加载页面时,仅提取一次所有数据。因此,我正在尝试加载数据库中存在的所有数据以可视化绘图。生成初始图后,页面将仅查询每个表的最后一行以更新图。表的结构非常简单。
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张桌子
谢谢
答案 0 :(得分: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;
获取所有数据仅在加载页面时发生一次。因此,我正在尝试加载数据库中存在的所有数据以可视化绘图。生成初始图后,页面将仅查询每个表的最后一行以更新图。
如果这些图被缓存并定期重新生成或更新,那将是巨大的性能改进,不仅对于数据库查询,而且对于所有生成图的时间都是如此。
答案 1 :(得分: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
。索引可能有助于连接。