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

#sql #indexing #db2 #query-performance #multi-table

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

Вопрос:

Я боюсь, что эта функциональность может не существовать [пока]. Я хотел использовать индекс, который охватывает несколько таблиц в 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) поддерживает индексы в таблицах, то есть вы можете индексировать только одну таблицу.

Таблица может быть MQT (materialized query table), которая может быть основана на представлении. Это отличается от прямого индексирования нескольких таблиц.

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

1. Как насчет MQT?

2. добавил это в мой ответ

3. @data_henrik Мне нравится этот вариант. Кажется, что использование REFRESH IMMEDIATE может сделать для меня все сложные слова за кулисами (конечно, за счет ресурсов движка). Спасибо. Для справки, эта статья ( ibm.com/developerworks/data/library/techarticle/dm-0708khatri ) объясняет различия между Oracle и DB2.

Ответ №2:

Да, как и в SQL Server, вы можете создавать индексы для представлений, охватывающих несколько таблиц.

Примечание — для его работы необходимо настроить представление особым образом (называемым materialized query table).

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

1. MQT — это способ обойти это — поэтому я бы ответил на вопрос как «Нет», но есть обходной путь — сначала создается одна таблица. Итак, @data_henrik абсолютно прав в своем утверждении

2. @MichaelTiefenbacher — хорошо, если OP утверждает, что SQL Server делает это, тогда это то же самое (под капотом) — обратите внимание на ключевые слова with schemabinding в его примере. Это синтаксис SQL Server для MQT

3. @Hogan Из вашего ответа выясняется, что только Oracle имеет настоящие многостоловые индексы. DB2, PostgreSQL и SQL Server используют стратегию индексирования материализованных представлений; … и их стратегии обновления данных также отличаются с точки зрения возможностей и стоимости.

4. @TheImpaler — ваше утверждение верно. Однако я считаю, что DB2 предоставляет значительно больше возможностей для обновления «стратегий», чем другие. Например, вы можете настроить материализованные представления на обновление при любом изменении.