Повышение производительности PostgreSQL SELECT в родительской таблице (наследование) - PullRequest
0 голосов
/ 26 мая 2020

У меня есть база данных PostgreSQL 9.2, где каждая учетная запись имеет схему, как показано ниже:

My_Database
 |-> Schemas
    |-> AccountA
    |-> AccountB
    |-> AccountC
    |-> AccountD
    |-> AccountE
           .
           .
           .
    |-> AccountZ
    |-> MasterAccount

Все схемы имеют таблицу с именем imovel, в которой есть столбец с именем id, структура это:

CREATE SEQUENCE MasterAccount.imovel_id_seq;

CREATE TABLE MasterAccount.imovel (
    id integer DEFAULT nextval('MasterAccount.imovel_id_seq') NOT NULL PRIMARY KEY,
    title varchar(80) NOT NULL
);

CREATE TABLE AccountA.imovel (
    id integer DEFAULT nextval('MasterAccount.imovel_id_seq') PRIMARY KEY
)
INHERITS (MasterAccount.imovel);

.
.
.

CREATE TABLE AccountZ.imovel (
    id integer DEFAULT nextval('MasterAccount.imovel_id_seq') PRIMARY KEY
)
INHERITS (MasterAccount.imovel);

Сегодня у меня 127 учетных записей, и когда я запускаю SELECT в дочерней таблице, ответ происходит быстро. Но когда я запускаю тот же SELECT в таблице отца, он работает медленно. Я видел EXPLAIN и кажется, что PostgreSQL использует ИНДЕКС каждого ребенка вместо использования только ИНДЕКС отца.

Можно ли улучшить это поведение? Ниже приведены EXPLAIN.

Мне нужно использовать SELECT в главной таблице для глобального поиска.

SELECT в дочерней таблице

enter image description here

ВЫБРАТЬ в родительской таблице

enter image description here

1 Ответ

2 голосов
/ 26 мая 2020

Выбор из MasterAccount.imovel приведет к выбору из всех дочерних таблиц, поэтому неудивительно, что это займет намного больше времени. В запросе не будет использоваться индекс для MasterAccount.imovel, потому что сама эта таблица не содержит данных, поэтому нет смысла использовать индекс. Я предполагаю, что ваше заблуждение состоит в том, что индекс в родительской таблице будет индексировать все дочерние таблицы, но это не так.

Вы также не можете воспользоваться параллельным запросом, потому что вы используете очень старый, устаревший PostgreSQL версия. Обновление до v12 поможет, но только в отношении времени ответа на запрос: параллельная обработка не снижает используемых ресурсов.

...