#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 для MQT3. @Hogan Из вашего ответа выясняется, что только Oracle имеет настоящие многостоловые индексы. DB2, PostgreSQL и SQL Server используют стратегию индексирования материализованных представлений; … и их стратегии обновления данных также отличаются с точки зрения возможностей и стоимости.
4. @TheImpaler — ваше утверждение верно. Однако я считаю, что DB2 предоставляет значительно больше возможностей для обновления «стратегий», чем другие. Например, вы можете настроить материализованные представления на обновление при любом изменении.