Выполним запрос:
Select
sum(amount)
from sales, regions
where
regions.region_id = sales.region_id
and regions.region_name = 'Центр'
|
Рассмотрим план выполнения этого запроса (это не
единственно возможный, но вполне вероятный план). В плане, естественно, присутствует просмотр обеих таблиц и операция их соединения:
SELECT
STATEMENT Optimizer=ALL_ROWS
SORT (AGGREGATE)
NESTED LOOPS
TABLE ACCESS (FULL) OF 'SALES'
TABLE ACCESS (BY INDEX ROWID) OF 'REGIONS'
INDEX (UNIQUE SCAN) OF 'REGIONS_PK'
(UNIQUE)
|
Если же это соединение выполнить один раз при
построении индекса, и в индексе хранить указатели на строки таблицы Sales
вместе с соответствующими названиями регионов из таблицы Regions, то для
выполнения вышеописанного запроса таблица Regions вообще не понадобится, и
можно избежать очень дорогостоящей операции соединения.
Создадим индекс:
create
bitmap index Sales_reg_bji
on Sales(regions.region_name)
from Sales, Regions
where sales.region_id=regions.region_id
|
Чтобы побудить оптимизатор использовать этот индекс, применим подсказку (hint). В реальности, если таблицы будут достаточно
большими, подсказки скорее всего не понадобятся, т.к. стоимость выполнения
этого запроса с использованием индекса будет существенно меньше, чем без него: