Postgres - самый быстрый способ получить все строки в нескольких таблицах - PullRequest
0 голосов
/ 06 сентября 2018
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 *

Спасибо

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Вы пробовали индексировать поля 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 ...

Запустите указанный выше запрос в базе данных один раз. После создания индексов добавление новых или удаление старых данных индексируется автоматически. Индексирование делает запросы намного быстрее .

После индексации повторите запрос. Но помните, что вы все равно вытягиваете table_1. Индексация может помочь с объединением.

0 голосов
/ 06 сентября 2018

Вот несколько идей по улучшению вещей на основе того, что вы упомянули.

Можно ли превратить все таблицы в одну с тремя столбцами?

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;

Извлечение всех данных происходит только один раз при загрузке страницы. Поэтому я пытаюсь загрузить все данные, которые есть в БД, для визуализации графиков. После создания начального графика страница будет запрашивать только последние строки каждой таблицы для обновления графиков.

Если бы эти графики кэшировались и периодически обновлялись или обновлялись, это было бы огромным улучшением производительности не только для запроса к базе данных, но и за все это время создания графиков.

...