He estado buscando esto durante una semana y me temo que puede que no exista [todavía]. Quería usar un índice que abarque varias tablas en PostgreSQL. Oracle y el servidor SQL parecen implementarlos (con más o menos opciones).
Podría ser bastante útil para algunas búsquedas que necesito implementar.
Como referencia, aquí están los ejemplos de índices de tablas múltiples para Oracle y SQL Server:
Ejemplo de oráculo
Oracle puede crear índices de combinación de mapa de bits , como se muestra a continuación:
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 avg(c.price) from dealer d join car c on c.dealer_id = d.id where d.city = 'Chicago' and c.brand = 'Buick';
Ejemplo de servidor SQL
SQL Server puede crear vistas indexadas :
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 schemabinding 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 avg(c.price) from dealer d join car c on c.dealer_id = d.id where d.city = 'Chicago' and c.brand = 'Buick';
A partir de la versión actual de PostgreSQL (v 12), un índice puede basarse únicamente en una tabla o vista materializada.
https://www.postgresql.org/docs/current/sql-createindex.html
CREATE INDEX construye un índice en las columnas especificadas de la relación especificada, que puede ser una tabla o una vista materializada.
La sintaxis CREATE INDEX
requiere una tabla y solo puede especificarse 1 tabla
CREAR [ÚNICO] ÍNDICE [CONCURRENTEMENTE] [[SI NO EXISTE] nombre] EN [SOLO] table_name [USING method]
nombre de la tabla:
El nombre (posiblemente calificado por esquema) de la tabla que se va a indexar.
La vista materializada es una opción, pero los datos en la vista materializada están obsoletos hasta que actualice los datos.
https://www.postgresql.org/docs/12/sql-creatematerializedview.html
CREAR VISTA MATERIALIZADA define una vista materializada de una consulta. La consulta se ejecuta y se usa para completar la vista en el momento en que se emite el comando (a menos que se use SIN DATOS) y se puede actualizar más tarde usando REFRESH MATERIALIZED VIEW.
Tal vez pueda equilibrarlo automatizando un proceso para ejecutar el comando REFRESH MATERIALIZED VIEW
de manera de reducir la probabilidad de datos obsoletos. Por ejemplo, después de grandes importaciones de datos y en intervalos regulares en otros momentos. Pero, si sus datos son lo suficientemente grandes como para requerir indexación, el proceso de actualización y reindexación no será lo suficientemente rápido y, por lo tanto, no podrá ejecutarlo después de cada instrucción CRUD en un escenario OLTP.
En conclusión, lo que busca no existe en PostgreSQL a partir de la v 12.