DB2 是不是实现了多表索引?
Posted
技术标签:
【中文标题】DB2 是不是实现了多表索引?【英文标题】:Does DB2 implement multi-table indexes?DB2 是否实现了多表索引? 【发布时间】:2020-08-25 15:08:57 【问题描述】:恐怕这个功能可能[还]不存在。我想使用一个跨越 DB2 中多个表的索引。我知道 Oracle 和 SQL Server 实现了它们(有或多或少的选项),而 PostreSQL 似乎还没有实现它们。
注意:几周前我问过一个关于 PosgreSQL 的类似问题。
多表索引可能对某些特定查询非常有益。
作为参考,以下是 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';
DB2 中有类似的东西吗?
【问题讨论】:
【参考方案1】:Db2(适用于 Linux、UNIX 和 Windows)支持 indexes on tables,即您只能索引单个表。
该表可以是基于视图的 MQT(物化查询表)。这与直接索引多个表不同。
【讨论】:
MQT 怎么样? 将其添加到我的答案中 @data_henrik 我喜欢这个选项。似乎使用REFRESH IMMEDIATE
可能会为我完成所有幕后工作(当然是以引擎资源为代价的)。谢谢。作为记录,本文 (ibm.com/developerworks/data/library/techarticle/dm-0708khatri) 解释了 Oracle 和 DB2 之间的区别。【参考方案2】:
是的,就像在 SQL Server 中一样,您可以在跨多个表的视图上创建索引。
注意——您必须以一种特殊的方式(称为具体化查询表)设置视图才能使其工作。
【讨论】:
MQT 是解决它的一种方法——所以我将这个问题回答为否,但有一个解决方法——首先构建一个表。所以@data_henrik 在他的声明中是绝对正确的 @MichaelTiefenbacher -- 好的,如果 OP 声称 SQL Server 执行此操作,那么它是相同的(在引擎盖下) -- 请注意他的示例中的关键字with schemabinding
。这是 MQT 的 SQL Server 语法
@Hogan 从您的回答中可以看出,只有 Oracle 具有真正的多表索引。 DB2、PostgreSQL、SQL Server 采用索引物化视图的策略; ...而且他们的数据刷新策略在机会和成本方面也不同。
@TheImpaler -- 你的陈述是有效的。但是,我相信 DB2 提供的刷新“策略”选项要比其他选项多得多。例如,您可以设置物化视图以刷新任何更改。以上是关于DB2 是不是实现了多表索引?的主要内容,如果未能解决你的问题,请参考以下文章