postgresql实现了多表索引吗?

kg7wmglp  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(458)

我已经找了一个星期了,恐怕这个可能还不存在。我想在postgresql中使用一个跨多个表的索引。oracle和sqlserver似乎实现了它们(或多或少有一些选择)。
它对于我需要实现的一些搜索可能非常有用。
以下是针对oracle和sql server的多表索引示例,以供参考:
oracle示例
oracle可以创建位图连接索引,如下所示:

  1. create table dealer (
  2. id int primary key not null,
  3. city varchar2(20) not null
  4. );
  5. create table car (
  6. id int primary key not null,
  7. brand varchar2(20),
  8. price int,
  9. dealer_id int references dealer (id)
  10. );
  11. create bitmap index bix1 on car (d.city, c.brand)
  12. from car c, dealer d
  13. where d.id = c.dealer_id;
  14. select avg(c.price)
  15. from dealer d
  16. join car c on c.dealer_id = d.id
  17. where d.city = 'Chicago' and c.brand = 'Buick';

sql server示例
sql server可以创建索引视图:

  1. create table dealer (
  2. id int primary key not null,
  3. city varchar(20) not null
  4. );
  5. create table car (
  6. id int primary key not null,
  7. brand varchar(20),
  8. price int,
  9. dealer_id int references dealer (id)
  10. );
  11. create view v with schemabinding as
  12. select d.city, c.brand, c.price, c.dealer_id
  13. from dbo.dealer d
  14. join dbo.car c on c.dealer_id = d.id;
  15. create unique clustered index uix1 on v (city, brand, price);
  16. select avg(c.price)
  17. from dealer d
  18. join car c on c.dealer_id = d.id
  19. where d.city = 'Chicago' and c.brand = 'Buick';
wmtdaxz3

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中并不存在。

相关问题