我已经找了一个星期了,恐怕这个可能还不存在。我想在postgresql中使用一个跨多个表的索引。oracle和sqlserver似乎实现了它们(或多或少有一些选择)。
它对于我需要实现的一些搜索可能非常有用。
以下是针对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 avg(c.price)
from dealer d
join car c on c.dealer_id = d.id
where d.city = 'Chicago' 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 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';
1条答案
按热度按时间wmtdaxz31#
在当前版本的postgresql(v12)中,索引只能基于表或物化视图。
https://www.postgresql.org/docs/current/sql-createindex.html
create index在指定关系的指定列上构造索引,该列可以是表或物化视图。
这个
CREATE INDEX
语法需要一个表,并且只能指定一个表在[only]表\u name[using method]上创建[unique]索引[concurrently][[if not exists]name]
表格名称:
要编制索引的表的名称(可能是架构限定的)。
物化视图是一个选项,但是,在刷新数据之前,物化视图中的数据是过时的。
https://www.postgresql.org/docs/12/sql-creatematerializedview.html
创建物化视图定义查询的物化视图。执行查询并用于在发出命令时填充视图(除非使用with no data),以后可以使用refresh materialized view进行刷新。
你也许可以通过自动化一个进程来平衡它
REFRESH MATERIALIZED VIEW
命令以减少过时数据的可能性。例如,在导入大量数据之后,以及在其他时间以固定的间隔。但是,如果您的数据足够大,需要建立索引,那么刷新和重新建立索引的过程将不够快,因此您将无法在oltp场景中的每个crud语句之后执行它。总之,您要查找的内容在12版后的postgresql中并不存在。