Notes05r

advertisement
Принципы построения и работы
баз данных
Тема 05: Хэширование и
другие вопросы.
Принципы
построения БД
Тема 5
1
Хэширование
<key>
key  h(key)
.
.
.
Принципы
построения БД
Тема 5
Ячейки
(обычно 1
диск.блок )
2
Две возможности
.
.
.
записи
(1) key  h(key)
Принципы
построения БД
.
.
.
Тема 5
3
Две возможности
(2) key  h(key)
ключ
запись
Индекс
(2) – для вторичного ключа поиска
Принципы
построения БД
Тема 5
4
Пример функции хэширования
• Ключ = ‘x1 x2 … xn’ строка символов длиной n байт
• Пусть имеется m ячеек
• h: сложить x1 + x2 + ….. хn как целые числа
– вычислить сумму по модулю b
Это может быть не лучшей хэш-функцией Д.Кнут.
Искусство программирования для ЭВМ. Т.3. (Если
хотите Узнать как выбрать хорошую хэш-функцию.)
Хорошая функция обладает свойством: среднее
ожидаемое количество ключей в ячейке одинаково для
всех ячеек
Принципы
построения БД
Тема 5
5
Внутри ячейки:
• Нужно ли держать ключи отсортированными?
• Да, если время обработки процессором критично
& Вставки.удаления не слишком часты
Далее: Пример для иллюстрации вставок,
переполнения, удалений
h(key)
Принципы
построения БД
Тема 5
6
Пример 2 записи на ячейку
Вставка:
h(a) = 1
h(b) = 2
h(c) = 1
h(d) = 0
0
d
1
a
c
2
b
e
3
h(e) = 1
Принципы
построения БД
Тема 5
7
Пример: удаление
Удалить:
e
f
c
0
a
1
b
c d
e
2
3
Принципы
построения БД
f
g
Тема 5
d
М.б. перенести
“g” в предыдущий
блок
8
Главное правило:
Использование пространства ячейки от 50% до 80%
Использование = число использованных мест
общее число мест в ячейке
• Если < 50%, теряем дисковое пространство
• Если > 80%, переполнение может быть
значительным, зависит от качества хэш-функции и
количества ключей в ячейке
Принципы
построения БД
Тема 5
9
Как бороться с ростом хэш-таблицы
(файла)?
• Переполнение и реорганизация
• Динамическое хэширование
• Расширяемая схема
• Линейная схема
Принципы
построения БД
Тема 5
10
Расширяемая схема: две идеи
(a) Использовать j из b битов значения хэш-функции
b
00110101
h(K) 
исп. j  может расти со временем...
(б) Использование оглавления
.
.
.
h(K)[j ]
к ячейке
.
.
.
Принципы
построения БД
Тема 5
11
Пример: h(k) дает 4 бита; 2 ключа/ячейку
j=2
1
0001
j= 1
00
01
10
1 2
1001
1010 1100
Вставить 1010
Принципы
построения БД
11
Новое оглавление
1 2
1100
Тема 5
12
Продолжение примера
j= 2
00
01
10
11
Вставить:
0111
2
0000
0001
1 2
0001 0111
0111
2
1001
1010
2
1100
0000
Принципы
построения БД
Тема 5
13
Продолжение примера
0000 2
i= 2
0001
00
0111 2
01
10
11
Вставить:
1001
Принципы
построения БД
1001 3
1001
1010 1001 2 3
1010
1100 2
Тема 5
j=3
000
001
010
011
100
101
110
111
14
Расширяемая схема: удаление
• Без слияния блоков
• Слияние блоков и сокращение оглавления
если возможно (процедура – обратная
вставке)
Пример удаления
•Рассмотрите вставку в обратном порядке
Принципы
построения БД
Тема 5
15
Итог
Расширяемая схема
+ Справляется с растущими файлами
- с меньшей потерей пространства
- без полной реорганизации
-
Косвенная адресация
(хорошо если оглавление в памяти)
-
Оглавление увеличивается в 2 раза
(То умещается, то нет)
Принципы
построения БД
Тема 5
16
Линейная схема
• Другая динамическая схема
Две идеи:
(a) Использование младших j
битов значения хэш-функции
b
01110101
растет
(б) Файл растет линейно
(в) Пороговое значение U = число записей
число ячеек
Принципы
построения БД
Тема 5
j
<= v (=1.6)
17
Пример b=4 bits, j =1, 2 ключа/ячейку
• вставка 0101
0000
1010
0101
1111
0
1
m = 01 (max номер блока)
Правило
Если h(k)[j ]  m, то проверять ячейку h(k)[ j ],
иначе проверять ячейку h(k)[j ] - 2j -1
Принципы
построения БД
Тема 5
18
Пример b=4 bits, j =2, 2 ключа/ячейку
0000
00
0101
1111
1010
01
10
Ячейки для
будущего
роста
11
m = 01 (max номер блока)
10
Правило
Если h(k)[j ]  m, то проверять ячейку h(k)[ j ]
иначе проверять ячейку h(k)[j ] - 2j -1
Принципы
построения БД
Тема 5
19
Пример b=4 bits, j =2, 2 ключа/ячейку
0101
0000
00
• вставка 0101
• может иметь цеп.переполнения!
0101
1111
1010
01
10
Ячейки для
будущего
роста
11
m = 01 (max номер блока)
10
Если h(k)[j ]  m, то проверять ячейку h(k)[ j ],
Правило
иначе проверять ячейку h(k)[j ] - 2j -1
Принципы
построения БД
Тема 5
20
Пример b=4 bits, j =2, 2 ключа/ячейку
0101
0000
1010
00
0101
0101
1111
• вставка 0101
1010
1111
Ячейки для
будущего
роста
01
10
11
m = 01 (max номер блока)
10
11
Принципы
построения БД
Тема 5
21
Продолжение примера: Как расти дальше?
j=23
0000
0 00
100
0101
0101
0 01
101
1010
0101
0101
1111
010
110
0 11
111
100
101
...
m = 11 (max номер блока)
100
101
Принципы
построения БД
Тема 5
22
Когда расширяется файл?
• Следите за:
кол-во записей
=U
общее кол-во ячеек
• Если U > порогового значения, то
увеличить m (и может быть j )
Принципы
построения БД
Тема 5
23
Итог
Линейная схема
+ Справляется с растущими файлами
- с меньшей потерей пространства
- без полной реорганизации
+ Нет необходимости в косвенной адресации
- Может иметь цепочки переполнения
Принципы
построения БД
Тема 5
24
Пример: «Плохой» частный случай
Очень полная ячейка
Очень пустые
Нужно увел.
m…
Приведет к
потере пространства...
Принципы
построения БД
Тема 5
25
Далее:
• Сравнение индексирования и хэширования
• Определение индекса в SQL
• Доступ с использованием нескольких ключей
Принципы
построения БД
Тема 5
26
Сравнение индексирования и хэширования
• Хеширование хорошо для выбора записей с
заданным значением ключа, например
SELECT …
FROM R WHERE R.A = 5
• Индексирование (включая B-Trees) хорошо для
поиска записей со значениями из (полу-)
интервала
SELECT ... FROM R WHERE R.A > 5
Принципы
построения БД
Тема 5
27
Определение индекса в SQL
• CREATE INDEX имя_индекса ON rel (attr)
• CREATE UNIQUE INDEX имя_индекса ON rel(attr)
Определяет возможный
ключ отношения
• DROP INDEX имя_индекса
Принципы
построения БД
Тема 5
28
Замечания
Нельзя задать тип индекса
( например, B-tree, хэширование, …)
или параметры
(заполненность, размер хэш-таблицы,...)
По крайней мере стандарт SQL этого не
позволяет...
Можно задавать список атрибутов в
качестве ключа  многомерный индекс
CREATE INDEX имя_индекса ON R(A,B,C)
Принципы
построения БД
Тема 5
29
Многомерный индекс
Мотивация: Найти все записи, у которых
DEPT = “Toy” AND SAL > 50k
Стратегия 1:
• Использовать один индекс, например Dept.
• Получить все записи с Dept = “Toy” и проверить
зарплату
I1
Принципы
построения БД
Тема 5
30
Стратегия 2: Использовать 2 индекса;
манипулировать указателями
Toy
Sal > 50k
Стратегия 3: Многомерный индекс
I2
I1
Принципы
построения БД
Тема 5
I2
31
Пример
Art
Sales
Toy
Dept
индекс
10k
15k
17k
21k
Пример
записи
Name=Joe
DEPT=Sales
SAL=15k
12k
15k
15k
19k
Salary
индекс
Принципы
построения БД
Тема 5
32
Для каких запросов хорош этот индекс?
Найти записи с Dept = “Sales” & SAL=20k
Найти записи с Dept = “Sales” & SAL > 20k
Найти записи с Dept = “Sales”
Найти записи с SAL = 20k
Принципы
построения БД
Тема 5
33
Интересное приложение:
• Географические(пространственные) данные
Данные:
<X1,Y1, атрибуты>
<X2,Y2, атрибуты>
...
y
x
Запросы:
• Какой город находится в <Xi,Yi>?
• Что находится в 5 милях от <Xi,Yi>?
• Что ближе всех к <Xi,Yi>?
Принципы
построения БД
Тема 5
34
40
Пример
10
25
20
20
10
e
h
30
20
15 35
i
n
o
j
k
m
10
5
h i
f
15
15
j k
g
l
Принципы
построения БД
m
d e
c
b
f
l
a
d
c
g
20
a b
• Поиск точек близких к f
• Поиск точек близких к b
n o
Тема 5
35
Запросы
•
•
•
•
Найти точки с Yi > 20
Найти точки с Xi < 5
Найти точки“близкие” к i = <12,38>
Найти точки“близкие” к b = <7,24>
• Используется несколько типов географических
индексов
• Q деревья
• R деревья
Принципы
построения БД
Тема 5
36
Еще два типа многомерных индексов
• Сеточный файл(индекс)
• Хэш-разбиение
Сеточный индекс
X1 X2
V1
V2
Key 1
Key 2
……
Xn
Vn
К записи с ключом key1=V3, key2=X2
Принципы
построения БД
Тема 5
37
Утверждение
• Может быстро находить записи с
– ключ 1 = Vi & ключ 2 = Xj
– ключ 1 = Vi
– ключ 2 = Xj
• А также записи с ключами из диапазона.
– ключ 1  Vi & ключ 2 < Xj
Принципы
построения БД
Тема 5
38
Имеется загвоздка в сеточном индексе!
V2
V3
X1
X2
X3
X4
X1
X2
X3
X4
Как
массив
V1
X1
X2
X3
X4
• Как сеточный индекс хранится на диске?
Проблема:
• Необходима регулярность данных для
вычисления позиции элемента <Vi,Xj>
Принципы
построения БД
Тема 5
39
Решение: Использовать косвенную адресацию
X1 X2 X3
Ячейки
----------
V1
V2
V3
V4
Ячейки
Принципы
построения БД
----
*сетка
содержит
указатели
на ячейки
---Тема 5
40
При косвенной адресации:
• Сетка может быть регулярной без потери
пространства
• Однако необходима дополнительные затраты
на обработку косвенной адресации
Принципы
построения БД
Тема 5
41
Можно индексировать сетку по интервалам
Зарплата
Сетка
1
2
50K-
3
8
0-20K
20K-50K
1
3
Toy Sales Personnel
Линейная шкала
Принципы
построения БД
2
Тема 5
42
Сеточные файлы
+ Удобны для поиска по многомерному ключу
- Дополнительные затраты памяти и
обработки (нет ничего бесплатного)
- Нуждается в равномерном разбиении
значений ключей
Принципы
построения БД
Тема 5
43
Хэш-разбиение
Идея:
ключ1
Принципы
построения БД
010110 1110010
h1
h2
Тема 5
ключ2
44
Пример:
h1(toy)
h1(sales)
h1(art)
.
.
h2(10k)
h2(20k)
h2(30k)
h2(40k)
.
.
Вставка
Принципы
построения БД
=0
=1
=1
=01
=11
=01
=00
000
001
010
011
100
101
110
111
<Fred>
<Joe><Sally>
<Fred,toy,10k>,<Joe,sales,10k>
<Sally,art,30k>
Тема 5
45
h1(toy)
=0
000
<Fred>
h1(sales) =1
001
<Joe><Jan>
h1(art)
=1
010
<Mary>
.
011
.
<Sally>
h2(10k)
=01
100
h2(20k)
=11
101
<Tom><Bill>
h2(30k)
=01
110
<Andy>
h2(40k)
=00
111
.
.
• Найти служащих с Dept. = Sales & Sal=40k
Принципы
построения БД
Тема 5
46
h1(toy)
=0
000
<Fred>
h1(sales) =1
001
<Joe><Jan>
h1(art)
=1
010
<Mary>
.
011
.
<Sally>
h2(10k)
=01
100
h2(20k)
=11
101
<Tom><Bill>
h2(30k)
=01
110
<Andy>
h2(40k)
=00
111
.
.
• Найти служащих с Sal=30k
Искать здесь
Принципы
построения БД
Тема 5
47
h1(toy)
=0
000
<Fred>
h1(sales) =1
001
<Joe><Jan>
h1(art)
=1
010
<Mary>
.
011
.
<Sally>
h2(10k)
=01
100
h2(20k)
=11
101
<Tom><Bill>
h2(30k)
=01
110
<Andy>
h2(40k)
=00
111
.
.
• Найти служ. с Dept. = Sales Искать здесь
Принципы
построения БД
Тема 5
48
Итоги
- Индексирование против хэширокания
- Определение индексов в SQL
- Доступ при многомерном ключе
- многомерный индекс
Вариации: Сетка, Географические
данные
- Хэш-разбиение
Принципы
построения БД
Тема 5
49
Download