Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Чичкань.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2.15 Mб
Скачать
          1. Організація таблиць та індексів

Таблиці і індекси зберігаються у вигляді колекції сторінок розміром 8 Кб.

Сторінки таблиць та індексів містяться в одній або декількох секціях. Секція – це призначена для користувача одиниця організації даних. За замовчуванням таблиця або індекс має єдину секцію, яка містить всі сторінки таблиці або індексу. Секція розташовується в одній файловій групі. Таблиця або індекс, що мають одну секцію, еквівалентні організаційній структурі таблиць і індексів попередніх версій SQL Server.

Якщо таблиця або індекс використовують декілька секцій, дані секціонуються горизонтально, так що групи рядків зіставляються окремим секціям, ґрунтуючись на вказаному стовпці. Секції можуть зберігатися в одній або декількох файлових групах в базі даних. Таблиця або індекс розглядаються як єдина логічна сутність при виконанні над даними запитів або оновлень. Секція складається з фрагментів одного або декількох файлів. Дані усередині фрагменту файлу представляються у вигляді купи (рядки даних зберігаються без певного порядку – послідовне розміщення) або збалансованого дерева. Фрагмент файлу може приймати один із трьох виглядів: дані з типами невеликих розмірів (дані IN_ROW_DATA), дані з типами великих розмірів (LOB_DATA), дані змінної довжини (переповнювання рядка ROW_OVERFLOW_DATA).

У кожній секції купи або індексу міститься принаймні одна одиниця розподілу IN_ROW_DATA. Крім того, залежно від схеми купи або індексу, там можуть міститися одиниці розподілу LOB_DATA або ROW_OVERFLOW_DATA.

Наступна ілюстрація показує організацію таблиці (мал. 10.4).

Мал. 10.4.  Фізична структура таблиці в базі даних SQL Server

Кожна секція містить рядки даних або в купі, або в структурі кластеризованого індексу. Кластеризований індекс реалізується у вигляді структури індексу збалансованого дерева, який підтримує швидкий пошук рядків по їх ключових значеннях. Сторінки в кожному рівні індексу, включаючи сторінки даних на кінцевому рівні, зв'язані у двонаправлений список. Проте переміщення з одного рівня на іншій виконується за допомогою ключових значень.

Купа – це послідовність рядків таблиці, які не мають кластеризованого індексу. Рядки даних зберігаються без певного порядку, і який-небудь порядок в послідовності сторінок даних відсутній. Сторінки даних не зв'язані у зв'язний список.

          1. Управління роботою з екстентами і вільним місцем

Структури даних SQL Server, що керують використанням екстенту і відслідковуванням вільного місця, мають відносно просту структуру. Відомості про вільне місце щільно упаковані, тому ці дані містять відносно невелику кількість сторінок. Це призводить до збільшення швидкості із-за зменшення необхідних операцій читання диску для здобуття відомостей про розміщення. Також збільшується вірогідність того, що сторінки розміщення залишатимуться в пам'яті і повторної операції читання не буде потрібно. Велика частина відомостей про розміщення не зв'язана по ланцюжку одна з одною. Це спрощує управління відомостями про розміщення. Кожна дія з розміщення або звільнення сторінки може виконуватися швидко. Це скорочує конфлікти між одночасними завданнями використання і звільнення сторінок.

SQL Server використовує два типи карт для запису відомостей про використання екстентів:

  • Глобальна карта розподілу (GAM)

На GAM-сторінках записано, які екстенти були задіяні. У кожній карті GAM містяться відомості про використання 64 000 екстентів або про розміщення майже 4 Гб даних. У карті GAM доводиться по одному біту на кожен екстент в інтервалі, що покривається цим екстентом. Якщо біт дорівнює 1, то екстент вільний; якщо біт дорівнює 0, то екстент задіяний.

  • Загальна глобальна карта розподілу (SGAM)

На SGAM-сторінках записано, які екстенти в поточний момент використовуються в ролі змішаних екстентів і мають як мінімум одну невживану (незадіяну) сторінку. У кожній карті SGAM містяться відомості про використання 64 000 екстентів або про розміщення майже 4 Гб даних. У карті SGAM доводиться по одному біту на кожен екстент в інтервалі, що покривається цим екстентом. Якщо біт дорівнює 1, то екстент використовується як змішаний екстент і має вільну сторінку. Якщо біт дорівнює 0, то екстент не використовується як змішаний екстент, або він є змішаним екстентом, але всі його сторінки використовуються.

Це дає прості алгоритми управління екстентами сторінок. Для використання для зберігання об'єкту однорідного екстенту компонент СУБД Database Engine проводить на карті GAM пошук біта 1 і замінює його на біт 0. Для пошуку змішаного екстенту з вільними сторінками компонент Database Engine проводить пошук на карті SGAM біта 1. Для розміщення змішаного екстенту компонент Database Engine проводить на карті GAM пошук біта 1 і замінює його на біт 0, а потім встановлює значення відповідного біта на карті SGAM рівним 1. Для звільнення екстенту компонент Database Engine встановлює біт GAM рівним 1, а відповідний біт SGAM рівним 0. Внутрішні алгоритми, які насправді використовуються компонентом Database Engine, складніші, ніж ми описуємо в цій лекції, оскільки компонент Database Engine розповсюджує дані в базі даних рівномірно. Проте навіть ці алгоритми спрощуються через те, що відпадає необхідність управління ланцюжками відомостей про розміщення екстентів.