Grid съхранява голям обем данни (терабайтове)



страница3/4
Дата10.08.2017
Размер1.32 Mb.
#27578
1   2   3   4

Съхраняване на такива обекти: в поредица от блокове. Когато има възможност е за предпочитане да е върху един цилиндър. Понякога тези BLOBS трябва да се извличат бързо – за това се съхраняват върху повече от един диск.

Извличане на бинарни обекти. Нормалните записи се предават на клиента (СУБД не се грижи за това). Ако записът съдържа двоични обекти е много скъпоструваща операция да се прехвърли. Затова от тях се предават само полетата, които не са бинарни обекти, а клиентът трябва явно да изрази желанието си да изтегли този обект. В много приложения клиента иска да получи част от обекта тогава СУБД трябва да поддържа индексна структура.
Проблеми с модификацията на записите
Модификация – вмъкване, изтриване, обновяване Най-често проблемите са свързани с промяна в дължината на записа.
Вмъкване (може да е кортежна релация или разширение на обект от клас). Ако не се поддържа търсим блок, в който има свободно място и там вмъкваме новия запис. Когато записите трябва да се сортирани (например по първичен ключ) – първо се намира блока и в него точно мястото, където трябва да се вмъкне записът и ако няма свободно място трябва да се разместят записите след него. Тук помага таблицата на офсетите – в блока записваме записа, а позицията му в таблицата на офсетите само се размества. Ако няма място в блока – има два подхода:

  1. Търсене на близък блок. Може да се използват и прехвърлящи адреси (в таблицата на офсетите са слага указател като се намери празно място и указателя има прехвърлящ адрес към блока, къде е поставен).

  2. Създаване на блок на препълване – във всеки блок имаме верига (блок) на препълване

Управление на индекси при изменението на данните

Във времето данните се изменят, еволюират (чрез вмъкване, изтриване и т.н.). Данните за представянето също трябва да се изменят – при напълването на блока данните трябва да се преместят и регистрират. Създават се блокове на препълване при необходимост от допълнително пространство и се изтриват когато се изпразнят. При тази техника характерното за индекса е че не поддържа индекс за блоковете на препълване – само блок, който е разширен с блоковете на препълване. Другия подход е вместо да използваме блок на препълване вмъкване на нови блокове в последователната наредба, но това означава, че в индексния файл трябва да вмъкнем елемент чрез който да се индексира този нов блок. Вмъкването на този нов елемент в индекса може да породи същите проблеми като при вмъкване на нов елемент. Използва се и когато се вмъкне даден кортеж в блока, но няма място се търси място в съседните блокове. Тази техника се комбинира – когато съседните блокове станат “рехави”. Можем да ги комбинираме, освобождавайки някои блок. Настъпилите изменения трябва да се отразят в индекса. Независимо коя стратегия се използва силно зависи как ще действаме от вида на индекса – плътен или разреден. Индексния файл може да се разглежда като последователен файл. За него може да прилагаме същите три стратегии.

Действие Плътен индексРазреден индексСъздаване на празен блок на препълванеНе се прави нищоНе се прави нищоИзтриване на празен блок на препълванеНищо Нищо Създаване на празен последователен блокНищо Операция по вмъкване, индексираща този блокИзтриване на празен последователен блокНищо Изтриване на елементаВмъкване на записВмъкване на запис в индексаМоже да има обновяване (ако записът е с най-малък ключ)Изтриване на записИзтриване на двойката указател-блокМоже да има обновяванеПреместване на записОбновяване Може да има обновяване ако новия блок не съдържа по-малки ключове

Когато подготвяме даден файл и индекси ги подготвяме за еволюция на данните: не запълваме блоковете при първоначалното зареждане. Средно ги запълваме до 75%. Това помага да се отложи във времето промените. Записите нарастват. По отношение на еволюцията на данните е добре да не трябва да се създават блокове на препълване. За предпочитане е да се прилага стратегия, в която да имаме празно пространство, а ако поддържаме блокове на препълване да няма повече от един.

Пример:

10


20

30

40

10

20

30


40

50


60

70

80

50

60

70


80

Ако изтрием запис с номер 30: в индекса изтриваме елемента за запис с номер 40 и го преместваме. Ако изтрития запис е прикован се слага надгробен камък



10

20

40

///////////

10

20


//////////

40

При разреден индекс:



10

30

50

70

30


40
1020

5060изтриваме запис с номер 30 съответния елемент от 30 става 40


10

40

50

70

//////////



40

Ако изтрием и запис с номер 40 връзката се изтрива


10


50

70

Вмъкване


10


20

40

///////////

10

20

//////////



40


  1. вмъкваме запис с ключ 15

10


15

20

40

10

15

20


40
Тук може да има надгробен камък на 30,

Защото заема само 1 бит




  1. чрез блок на препълване

10


15

20

40

10

15


20

//////
Създаваме нов блок


//////



40

Проектиране на вторичен индекс

Основния файл е сортиран по индексния ключ. При вторичните индекси основния файл не е задължително да е сортиран по ключът на индекса. Първичния ключ е ключа, по който уникално се идентифицират кортежите. На физическо ниво вторичния ключ може де е различен от първичния. Най-често първичния и ключа на сортировка съвпадат. Ако не е така е правилно да сортираме релацията по този ключ, по който най-често се търси. Най-често става когато се ползват номенклатури. Вторичния индекс се пълни с много дубликати. Най-особената черта на вторичния индекс е, че той винаги е плътен. Нагоре в йерархията трябва да са разредени. Пример: при изграден вторичен индекс, записите са сортирани по ключ. Приложение на вторичен индекс: когато се създава вторичен индекс върху файлове от вида heap (един след друг; файлове, които не са сортирани). Клъстърен файл – в него се поддържат две релации в блоковете (една за филмите и за студията) studios - отношение 1 към много movies - операция-съединение

клъстърен файл

Studio1Film1Film2…Studio2Film1Film2…


10


10

20

20

20

40

10


20

20


30

40

50

50


30

10


50

50


65

//////

//////

60


20

Върху така организирания клъстърен файл се прилага вторичния индекс. Един индекс по студията и един по филмите. Първият индекс е организиран по атрибут/и на студията, а вторият – по атрибут/и на филмите. Те трябва да са плътни.

Трети подход – пренасочване при вторичните индекси. При пренасочването има преразход на памет. Смисъла е - би било хубаво индекса да участва само един път, а повторенията да са в отделна структура.

20

40

10


20

30

40

10


20

50


60

50


30

10


50


60



20


  1. помощна структура, нарича се файл с кофите (bucket) или с директориите.

SELECT title

FROM movie

WHERE StudioName=”Disney”

AND year=1995



1995



1996





Disney






заявката

1995


Disney

Извличане на документи и инвертирани индекси



  1. за целите на web приложенията

Следните видове заявки:



  1. документа се разглежда като кортеж, т.е. големи полета. При едно такова разглеждане може да има твърде много атрибути (за всяка дума да има по един атрибут [булев, т.е. дали дадената дума я има или не]). Върху всеки от тези атрибути се изгражда вторичен индекс (само за тези кортежи, в които стойността на атрибута е true).DOC (has Cat, has Dog, …) Вместо да се създават отделни индекси за всеки атрибут индексите са инвертирани в един, а именно инвертиран. Този индекс се пренасочва за да се спести дисково пространство

cat


dog

cat


cat

dog


dog


- инвертиран индекс ; - списъци с адреси ; - отделни документи

Самите документи могат да бъдат разположени в поредица от блокове, т.е. да са част от базата от данни. Някои бази от данни са статични – няма смисъл от блокове на препълване, достатъчно е да се остави 25% празно място.


  1. указателите могат да бъдат указатели към самия документ, но могат да бъдат и указатели които да сочат вътре в самите документи (къде точно се среща думата).

  2. когато се ползват указатели към думи се ползва допълнителна информация към всяка една поява (дали се среща в заглавие или подзаглавие или в основния текст)л във връзка с появата на документи които се маркирани във файла с кофите съдържа информация с кой език за маркиране е създаден

Тип на маркировкатаПозиция Самия указателcattitle5Doc1header10anchor3 Doc2text57 Doc3dogtitle100 Doc2title12 Doc3речникамаркери


Инвертирания индекс е речника, списъка с адресите са индексните файлове, това е при ПТБД.

Заявка1: да изкара всички документи, в които заглавието съдържа dog

Заявка2: да се намерят всички документи, в които в елемента title или в някои негови под-елементи се съдържа думата cat.

За заявка2 се използва XQuery - език, който прилича на SQL за СУБД.

По отношение на думите се използват най-различни методи:


  1. търсене по корен на думите – суфикс;

  2. стоп думи (по кои да не се индексира);

  3. организацията – хубаво е в отделни блокове да се съдържат индексите за дадена дума.

Аспекти на XML



  1. XML – ефективно средство за обмен на форматирана релация, заедно с това схемата на този файл върви (DTD+ XML-Scheme-по-точна информация).

  2. Освен това XML е за съхраняване на документи (форматиране на документи) при ПТБД – XQuery. Към релацията в СУБД могат да се направят XML интерфейси.

  3. XML е и средство, което служи за описание на семантиката на данните, т.е. данните идват като съдържание и това комбинирано с каскадните стилове и средствата за визуализация то те се визуализират.

Б – дървета


Тези индекси, които до сега разглеждахме се използват на едно-две нива, които ускоряват бързодействието. Но в съвременните СУБД се използват В – дървета. В – дърветата са една фамилия от данни. Най-характерно за тях е, че те поддържат толкова нива на индексация, колкото е необходимо отчитайки размера на дадения файл. Те управляват заетостта на блоковете си така, че поне на половината да са пълни. В – дървото организира блоковете си във вид на дърво, а В означава балансирано (Balanced). Има три вида нива в В-дървото:

  1. Корен

  2. Междинно ниво (може да са повече от едно)

  3. Листа (едно ниво).

С всеки индекс на дървото е свързан параметър n, който определя структурата на блока, т.е. в един блок има n стойности и n+1 указателя. И е толкова голям, че да се вместят n ключа и n+1 указателя. Ключовете най-често са с фиксирана дължина. Съдържание на блоковете на В-дърветата:

  1. ключовете в листата са копие на ключовете във файла с данни. На нивото на листата ключовете се поддържат в сортиран ред от ляво на дясно (в ляво – най-малката стойност).

  2. в корена има поне два използвани указателя, като всички указатели сочат в блокове от по-долното ниво (но има случаи и само с един използван указател [1корен-1листо]). Указател от корена към листото и от листото към записа с данни

  3. в листата последния указател сочи към следващия блок към листото намиращо се в дясно (т.е. сочи винаги в следващия блок с листа, там се намират листата с по-големи ключове от ключовете на разглеждания блок). Останалите указатели сочат в записи с данни и като бройка са , т.е. листата са поне наполовина пълни (в В+ дървото).

  4. в междинните възли всички указатели (n+1) сочат към по-долното ниво.в тях има поне указатели (отново междинните блокове да са наполовина пълни). Тук спрямо ключа двата съседни указателя сочат:

указателя в ляво от ключа сочи в В-дървото, където се намират всички записи с ключове по-малки от разглеждания, а десния – в частта от В-дървото, в която са по-големи или равни от разглеждания ключ. Ако разглеждаме един блок в който това означава, че в блока ще има 4 указателя и в блока ще има 3 ключа



578195

листо към следващия блок с листа

запис с ключ 57 запис с ключ 81 запис с ключ 95



5781

листо към следващия блок с листа

запис с ключ 57 запис с ключ 81



междинен възел - най-малко 2 ключа


578195

Стойности по-големи от 95

Всички записи Ключове със Стойности между

с ключ по-малък стойности между 81 и 95

от 57 57 и 81

В-дървото извършва търсене в интервални заявки.
Използване на В-дървета

Инструментариум за изграждане на индекси (нивата се изграждат автоматично)



  • указателите – може ключа на търсене да е първичния ключ на релацията, а самия индекс да е плътен, т.е. една двойка ключ-указател, тогава не е необходимо файла с данните да е сортиран, защото листата са сортирани.

  • Но ако файла с данните е сортиран тогава можем да използваме разреден индекс. Тогава в дървото ще участват най-малките ключове от съответните блокове от файла с данни.

  • Когато файла с данни е сортиран по атрибут който не е ключ на релацията, но този ключ се използва за ключ на търсене (или ключ на индексация) в В-дървото тогава възможностите са:

В-дървото може да бъде и плътен и разреден индекс. Има В-дървета, които поддържат дублиране на ключове, представя се със схема аналогична на разширените индекси (променя се смисъла на дефиницията в междинните възли – ако в един междинен възел има ключове тогава е най-малкия нов ключ, който се появява в частта от дървото намиращо се в която сочи i+1 указател. В корена определението е същото)

Търсене в В-дървета

(при случаите, когато не се поддържат дубликати и индекса е плътен)

търсенето не се свежда само до търсене в индекса, но и в блока данни в основния файл. При дубликати – попадаме в листо и трябва да продължим в дясно по листата.

Търсенето в В-дървета се реализира индукционно – във вид на рекурсивна програма. В основата на този индукция е, че ако сме в листо търсим сред ключовете му, ако i-тия ключ е търсения ключ к, то i-я указател ще ни заведе в търсения запис (файла с данните, където е записан).

Индукция – намираме се в междинен възел с ключове k …k тук трябва да решим към кое от децата ще се насочим. Има само едно дете, което може да ни заведе към възела, съдържащ к. Ако k>k то първото дете на междинния възел ще ни насочи към възела, който съдържа ключа к. Ако k <=k използваме второто дете и т.н. Т.е. в случая k <=k избираме детето k . Процедурата се прилага рекурсивно.

13 k=40 k

k k k следваме третата връзка


233143

313741

43


Приложения на В-дървета

  1. Интервални заявки (търси се по интервал). Ключът на търсене се сравнява (в WHERE) с дадена стойност/и (без “равно” и “различно”).

SELECT *

FROM R


WHERE R.k>40;

При интервалните заявки имаме търсене по даден ключ в затворения интервал а,b – стартираме търсене по ключа а – стигаме до листото, където се намира а, тръгваме надясно и обхождаме всички листа по-малки от b. Ако всички са по-малки преминаваме в следващото листо и така до срещане на ключ, по-голям от b или до края на списъка на листата.



Вмъкване в В-дървета
Вмъкването се реализира рекурсивно – първо търсим място за новия ключ в подходящото листо, ако има място го разполагаме, ако няма място – разделяме листото на две части (два нови възела). Всеки от тези възли е поне на половина пълен. Това влияе върху по-горното ниво – там трябва да вмъкнем ключ и указател към новия възел. Рекурсивно – ако няма място делим възела на две. Проблем – ако тази операция стигне до корена тогава разделяме корена на две създаваме следващо по-високо ниво – корен с две деца-двете части на стария корен (в В-дървото само корена може да има две деца). При това вмъкване трябва да отчитаме формулите за разделяне на възлите. Когато работим с листа ако N е листо с капацитет n ключа и в него се опитваме да вмъкнем n+1-я ключ, то спрямо този възел създаваме ново листо M в дясно от N. Първите ключа остават в първия възел, останалите – в M. Когато N е междинен възел и вмъкваме нов ключ отново създаваме възел M в дясно от N, но в N остават първите указателя, а в M останалите т.е. в N има ключа, а в M - ключа. Точно в средата има един излишен ключ. Той не отива нито в N, нито в M, той е достъпен чрез възела M, защото най-малкия ключ в M е по-голям от излишния.

Пример:


13

233143

131719


2329

313741


4347

Вмъкваме 40 – трябва да разделим третото листо .

233143

3137


4041

4347

В по-горния ред няма място трябва да го разделим на две:


2331

43

3137



4041

4347

И в корена:


4347


1343


Изтриване в В-дървета
Ако при изтриване не нарушаваме баланса няма проблеми, но ако ключа, който изтриваме е с най-малка стойност в листото в по-горното ниво се отразява. Ако е наполовина пълен възела ще се наруши изискването. Проверява се как са натоварени съседните му братя (само с общ родител). Ако съседите са наполовина запълнени се реализира сливане на два възела. Освобождаваме блока на първия от тях и коригираме информацията в родителя.

Пример:


13


7


235

711

Изтриваме ключ с номер 7:


5


511

23


Изтриваме ключ 11

23

13


235

131719


Ефективност на В-дърветата

За всяка операция, която те реализира са необходими много малки дискови операции. Необходимостта от реорганизация намалява при указатели и ключове 10 или повече. За повечето бази от данни няма повече от три нива на индексация в В-дървото. Необходими са не повече от пет дискови операции да се намери ключ. В някои В-дървета не се трие само се слага нулев указател. Повечето файлове обикновено растат.

ХЕШ” ФАЙЛОВЕТЕ

Базират се на хеш таблици, като структури от данни в паметта. Имаме хеш функция, която се прилага върху ключа на търсене. Организацията се базира върху ключ на хеширане. Хеш функцията връща някаква стойност, която е в интервала 0 до В-1. “В” е броя на кофите, които съхраняват индексните стойности. Кофите също са индексирани от 0 до В-1. Използваме вторична памет за хеш таблиците.

Всяка една кофа е един блок. Във всеки блок се разполагат записите с една и съща стойност, т.е. ако “k” е ключ, то всички записи със стойност h(k) са разположени в един блок.

Кофата ако се препълни – тогава се слагат блокове на препълване.


масив от блокове, който се

нарича масив на препълване

указател за организиране на верига на препълване
0
1 нов блок
2

.

.

.
В-1

Особености:

При хеширането, идеалната хеш функция трябва равномерно да може да разпределя (ключовете) записите между отделните кофи.

Идеалния случай е на база на статистика, но обикновено не разполагаме с такова статистическо изследване.


Хеш функцията се избира:

- когато ключовете са цели числа - например символен низ:

- сумираме двойки символи

символен низ


- сумираме символ по символ (най-лош вариант)
- когато ключа е реално число се постъпва по доста по-различен начин;
- когато броя на тези блокове е просто число,т.е. “В” да е просто число, което задава броя на кофите и при изчисляване на съответната хеш функция се получава добро разпределение;
- когато броя на кофите е степен на двойката се прилага само изместване на битове;
ВМЪКВАНЕ В “ХЕШ” ТАБЛИЦАТА
Искаме да вмъкнем в хеш таблицата нов запис с ключ на търсене k

1. Изчисляваме хеш функцията за този ключ

- ако в съответния блок има място – то го вмъкваме;

- ако няма място добавяме блок на препълване и поставяме записа;


ИЗТРИВАНЕ ОТ “ХЕШ” ТАБЛИЦАТА
Изтриването става по следния начин: Зададен ни е ключ и трябва да изтрием записа с този ключ. Изчисляваме цялата верига и търсим запис с този ключ (ако намерим много записи с този ключ, то ние ги изтриваме всичките).
Поддържат дубликати на ключове.

Ако искаме хеш файл, който да поддържа уникалност на ключове, тогава трябва да променим операцията по вмъкване (т.е. първо да проверим дали съществува такъв ключ и чак тогава да го вмъкнем), докато при изтриването при първото срещане трие.


Ефективност на индекси, които използват хеш таблици:

- много висока ефективност – затова защото при търсене по ключ за да намери необходимия запис са необходими 1 или 2 дискови достъпа (вВдърветата са 3 достъпа, но тъй като то е в оперативната памет достъпите се свеждат до два). В съвременните СУБД-та се използват хеш файлове.

- в хеш файловете не можем да сканираме в наредба; всички записи са разхвърляни съгласно хеш функцията. А повечето заявки са множествени заявки, а те налагат сканиране в интервал.
Тези таблици, които до сега разглеждахме се наричат статични, т.е. броя на кофите при реорганизация не се променя. Има и динамични.

Динамични хеш таблици:

1. Разширяемо хеширане – при установяване на препълване броя на кофите се удвоява;

2. Линейно хеширане – тук увеличението не е така драстично – увеличава се само с една кофа;


РАЗШИРЯЕМО ХЕШИРАНЕ

При разширяемо хеширане се прави просто допълнение към статичната хеш таблица, а именно:

- поддържа се едно допълнително ниво на пренасочване, т.е. използва се масив от указатели към блокове (този масив от указатели може да расте и винаги е степен на двойката) т.е. той се удвоява;

- не е необходимо всяка кофа да има блокове с данни, дори в определени случаи кофите могат да споделят блок (но само когато общия брой записи от двете кофи може да се събере само в един блок);

- хеш функцията за всеки един ключ пресмята една поредица от k на брой бита, като това k е достатъчно голямо (например 32 бита), обаче за номерация на кофите се използват само малка част от тези битове (например първите i бита от тази поредица);
Пример:

k = 4 (за всеки ключ ще ни върне 4 бита) и нека се използва само 1 бит за номерация на кофите, т.е. i = 1. Тогава хеш таблицата изглежда така:
масив от указатели

0001 1 = j

0

1 1001 1 = j



1100
Тогава всички записи пресметнати по хеш функцията ще се разположат в първия блок:
0001 1

1001 1


1100

резултат от изчислението на хеш функцията,



като се гледа само първия бит
На мястото на указателя в заглавната част е записана стойността на i по която са разпределени тези записи.


ВМЪКВАНЕ КЪМ РАЗШИРЕНА ХЕШ ТАБЛИЦА – става както в статичната.

Изчислява се хеш функцията. Имаме да вмъкнем запис с ключ m. Ще изчислим съответната функция h(m) и хеш функцията ще ни върне k бита, от тях взимаме първите i бита и влизаме в масива с указатели. Този масив с указатели може да сочи към блок, тогава влизаме в блока:

1) ако има място – вмъкваме записа и приключваме;

2) ако няма място – нашите действия зависят от едно число j, което показва колко бита са използвани за определяне на принадлежността към блока;



j винаги е i
Ако j < i , тогава с този масив на кофите разделяме блока на две (ако сме в блок В делим го на две), като в тези два блока ще разделим записите от оригиналния блок в зависимост от j + 1-я бит.

- в І-я блок всички записи в които в j + 1-я бит има стойност 0;

- в ІІ-я блок всички записи в които в j + 1-я бит има стойност 1;

(в І-я блок j си остава j )

(в ІІ-я блок j става j + 1 )
Указателите към масива на кофите го обновяваме така, че в В и в новия блок да сочат в зависимост от j + 1-я бит.

Разделянето на два блока не решава проблема щото може да се случи пак да нямаме празно място => тогава повтаряме тази процедура.


Когато j стане = i и още не сме вмъкнали този запис или още в самото начало j = i , и няма място в този блок, то тогава увеличаваме i с 1, т.е. удвояваме масива с указателите, (т.е. ако е бил 2i , то ще стане 2i+1 – масива с указателите). Този масив в първата си част се състои от

w0

w1

(wi бита; 0-този нов бит; ,1-този нов бит;)
Нека блок В с адрес w , тогава неговите записи трябва да разпределим увеличавайки i с 1.

Нека вмъкнем ключ, който се хешира до 1010

0001


Каталог: fmi -> fmi-ftp-upload-folder -> 3%20Semestur%202004%20&%202005 -> Predmeti -> DBMS -> Lekcii
fmi-ftp-upload-folder -> Бази от данни Упражнение 10
fmi-ftp-upload-folder -> Oracle e-business Suite Модул Financials, подмодул Fixed Assets
fmi-ftp-upload-folder -> Бази от данни Упражнение 9
fmi-ftp-upload-folder -> Basic structures напишете pl/sql блок, който въвежда номера в таблицата messages
Lekcii -> Извличане на документи и инвертирани индекси за целите на web приложенията
Lekcii -> Представяне на данни
Lekcii -> Третична памет
Lekcii -> Многобазово криптиране на големи релации Ако размера на блока е в байта, а в основната памет имаме М


Сподели с приятели:
1   2   3   4




©obuch.info 2024
отнасят до администрацията

    Начална страница