Тема 6. Многомерные индексы.
Проблема – как эффективно осуществлять поиск кортежей по двум и более условиям.
Пример. Ключ – комбинация полей F1 и F2. Пусть F1 – строка, F2 –число. Составной
ключ индекса – конкатенация полей с использованием разделителя, например, ‘#’. Тогда,
если F1=”abcd”, F2=23, то значение ключа индекса “abcd#23”.
Проблема 1. Сортировка в индексе по ключу – нет уверенности, что кортежи с
одинаковыми значениями F1 или F2 будут находиться рядом.
Проблема 2. При использовании хэш – структур требуется знать полный ключ.
В обоих случаях нет возможности эффективного поиска по одному из ключевых
атрибутов.
Решение – построение многомерных индексов.
Основные приложения – географические системы информации.
Типы запросов.
1. Запросы по одному из ключевых атрибутов.
2. Запросы с диапазоном значений.
3. Запросы на ближайшего соседа.
4. Запросы типа «Где я нахожусь?».
Как реализовать такие запросы на SQL?
1.
Требуется найти ближайшего соседа точки (10,20) в двумерном пространстве.
Точки представлены отношением:
Points (x,y).
SELECT * FROM Points p WHERE NOT EXIST
( SELECT * FROM Points q WHERE (q.x-10)*(q.x-10)+(q.y-20)*(q.y-20)<
(p.x-10)*(p.x-10)+(p.y-20)*(p.y-20) )
2. Выполнить запрос типа «Где я нахожусь?», если объекты хранения – прямоугольники.
Отношение – Rectangles(id, xl, yl, xr, yr).
Требуется найти прямоугольник(и), в котором(ых) находится точка (10,20).
SELECT id FROM Rectangles WHERE xl<=10 AND xr>=10 AND yl<=20 AND yr>=20
Использование обычных индексов.
1. Запросы с диапазоном значений.
Пусть есть два индекса типа В-дерева по каждому из атрибутов пространства x и y.
Пусть имеется набор 1 000 000 точек, распределенных случайным образом на множестве 0
 x  1 000, 0  y  1 000. Пусть 100 точек помещается в 1 блок, 200 пар «ключ указатель» помещаются в листовом блоке В-дерева.
В запросе указан диапазон: 450 < x  550, 450 < y  550.
Используя В-дерево по атрибуту x, получим около 100 000 точек по первому условию.
Используя В-дерево по атрибуту y, получим около 100 000 точек по второму условию.
Примерно 10 000 точек принадлежит пересечению этих множеств.
Заметим, что количество уровней В-дерева – 3. Допустим, что корень находится в
оперативной памяти.
Количество операций ввода/ вывода = 2*501 (для чтения блоков индексов: 500 листовых
узлов + 1 промежуточный узел) + 10 000 (блоков файла данных, если записи
распределены случайным образом) = 11 002 оп. вв/выв.
Для хранения всего файла требуется 1 000 000 / 100 = 10 000 блоков.
Количество операций ввода/вывода при простом сканировании файла = 10 000 оп. вв/выв.
Таким образом, использование индекса не дает никаких преимуществ.
2.
Запрос на ближайшего соседа.
Алгоритм – установка диапазона, выбор ближайшей точки внутри диапазона.
2 проблемы:
1. В диапазоне нет точек.
2. Ближайшая точка диапазона может оказаться не ближайшей точкой вообще.
Ближайшая точка
в диапазоне
Возможно
ближайшая точка
В обоих случаях требуется расширять диапазон и производить все действия заново.
Виды многомерных индексов.
1. Сеточные файлы.
Пространство точек (по двум атрибутам) разделяется сеткой. Сетка делит пространство на
части, под каждую из которых выделяется сегмент хэш – структуры.
i
25
e
d
a
h
b
20
n
l
10
f
o
j
k
m
40
c
g
50
В данном примере будет 9 сегментов хэш – структуры.
Хранение кортежей организовано по схеме:
Ключ 2 (key2)
X1 X2
……
Xn
V1
V2
Ключ 1
(key1)
Vn
К записям с ключами
V2<=key1<V3, X1<=key2<X2
Если в блоке данных нет места, требуется добавить новую линию разбиения, увеличив
хэш – структуру.
Проблема – быстрое увеличение количество сегментов хэш – структуры, причем многие
сегменты могут указывать на пустые блоки данных.
2. Хэш – разбиения.
010110 1110010
Ключ 1
h1
h2
Ключ 2
Пример.
h1(toy)=0
h1(sales)=1
h1(art)=1
000
001
<Fred>
010
h2(10k)=01
h2(20k)=11
h2(30k)=01
h2(40k)=00
011
100
101
<Joe><Sally>
110
111
<Sally,art,30k>
<Fred,toy,10k>,<Joe,sales,10k>
3. Многомерные индексы.
Индекс по первому атрибуту приводит к индексу по второму атрибуту, а уже тот
приводит к файлу данных.
10k
15k
17k
21k
Art
Sales
Toy
Name=Joe
DEPT=Sales
SAL=15k
12k
15k
15k
19k
4.
KD –дерево. – двоичное несбалансированное дерево, в котором внутренние узлы
дерева соответствуют последовательно то одному, то другому атрибуту.
Speed 1100
Ram 100
Ram 160
(866,128)
(1000,128)
(1500,128)
(1400,128)
(1300,256)
Speed 750
(700,64)
(733,64)
(866,64)
5.
Квадратичные деревья.
Каждый внутренний узел соответствует «кубической» области. Если число точек в «кубе»
меньше, чем помещается в блок, то этот «куб» трактуется как листовой блок. В противном
случае «куб» делится на 4 равные части.
400
Зар.
плата
0
Возраст
100
Дерево строится следующим образом:
50, 200
SW
NW
SE
NE
…
75, 100
…
25, 300
…
…
6.
R-деревья – деревья регионов – наиболее часто используются в географических
системах информации.
Во внутренних узлах некоторая прямоугольная область, которая может как содержать
данные, так и не содержать их. Далее эти области можно разбивать. Листовые блоки
хранят записи об объектах, находящихся в заданных регионах.
((0;0), (60;50))
дор1
дор2
дом1
((20,20), (100,80))
школа дом2
…