Реализует ли PostgreSQL многостоловые индексы?

#sql #post&resql #indexin& #query-performance #multi-table

#sql #post&resql #индексирование #запрос-производительность #многостоловые

Вопрос:

Я искал это в течение недели, и я боюсь, что это может не существовать [пока]. Я хотел использовать индекс, который охватывает несколько таблиц в Post&reSQL. Oracle и SQL server, похоже, реализуют их (с большим или меньшим количеством опций).

Это может быть весьма полезно для некоторых поисковых запросов, которые мне нужно реализовать.

Для справки, вот примеры многостоловых индексов для Oracle и SQL Server:

Пример Oracle

Oracle может создавать индексы растрового соединения, как показано ниже:

 create table dealer (
  id int primary key not null,
  city varchar2(20) not null
);

create table car (
  id int primary key not null,
  brand varchar2(20),
  price int,
  dealer_id int references dealer (id)
);

create bitmap index bix1 on car (d.city, c.brand)
from car c, dealer d
where d.id = c.dealer_id;

select av&(c.price)
from dealer d
join car c on c.dealer_id = d.id
where d.city = 'Chica&o' and c.brand = 'Buick';
  

Пример SQL Server

SQL Server может создавать индексированные представления:

 create table dealer (
  id int primary key not null,
  city varchar(20) not null
);

create table car (
  id int primary key not null,
  brand varchar(20),
  price int,
  dealer_id int references dealer (id)
);

create view v with schemabindin& as
select d.city, c.brand, c.price, c.dealer_id
from dbo.dealer d
join dbo.car c on c.dealer_id = d.id;

create unique clustered index uix1 on v (city, brand, price);

select av&(c.price)
from dealer d
join car c on c.dealer_id = d.id
where d.city = 'Chica&o' and c.brand = 'Buick';
  

Комментарии:

1. Материализованные представления? post&resql.or&/docs/12/sql-creatematerializedview.html

2. @dnoeth О… Я никогда не осознавал, что индексы Post&reSQL могут основываться на материализованных представлениях. Интересно. Не идеально, поскольку их данные могут быть устаревшими (немного), но все же может быть полезным обходным путем.

Ответ №1:

Начиная с текущей версии Post&reSQL (v 12), индекс может основываться только на таблице или материализованном представлении.

https://www.post&resql.or&/docs/current/sql-createindex.html

CREATE INDEX создает индекс для указанного столбца (столбцов) указанного отношения, которое может быть таблицей или материализованным представлением.

CREATE INDEX Синтаксис требует наличия таблицы, а может быть указана только 1 таблица

СОЗДАЙТЕ [ УНИКАЛЬНЫЙ] ИНДЕКС [ ОДНОВРЕМЕННО] [ [ ЕСЛИ НЕ СУЩЕСТВУЕТ] имя] ДЛЯ [ ТОЛЬКО ] имя_таблицы [ ИСПОЛЬЗУЯ метод]

имя_таблицы:
имя (возможно, в соответствии со схемой) таблицы, подлежащей индексации.

Материализованное представление — это вариант, но данные в материализованном представлении устаревают до тех пор, пока вы не обновите данные.

https://www.post&resql.or&/docs/12/sql-creatematerializedview.html

СОЗДАТЬ МАТЕРИАЛИЗОВАННОЕ ПРЕДСТАВЛЕНИЕ определяет материализованное представление запроса. Запрос выполняется и используется для заполнения представления во время выдачи команды (если НЕ используется WITH NO DATA) и может быть обновлен позже с помощью ОБНОВЛЕНИЯ МАТЕРИАЛИЗОВАННОГО ПРЕДСТАВЛЕНИЯ.

Возможно, вам удастся сбалансировать это, автоматизировав процесс выполнения REFRESH MATERIALIZED VIEW команды таким образом, чтобы уменьшить вероятность устаревания данных. Например, после импорта больших объемов данных и через регулярные промежутки времени в другое время. Но, если ваши данные достаточно велики, чтобы требовать индексации, процесс обновления и переиндексации будет недостаточно быстрым, и, следовательно, вы не сможете выполнять его после каждого оператора CRUD в сценарии OLTP.

В заключение, то, что вы ищете, не существует в Post&reSQL начиная с версии 12.

Комментарии:

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

2. Я согласен. Материализованное представление — это не то, что вы хотели бы иметь в сценарии OLTP, если только вам действительно не нужно, поскольку было бы очень сложно избежать устаревания данных в определенное время. Однако это может быть полезно в сценариях OLAP, где CRUD управляется в ETL и, таким образом, вы точно знаете, когда обновлять данные. Но даже при этом, если у вас большие данные и если у вас есть средства для этого, вы бы предпочли инкрементную загрузку данных в обычную таблицу вместо полного обновления материализованного представления.