- •Основы современных баз данных
- •1.1. Файловые системы
- •1.1.1. Структуры файлов
- •1.1.2. Именование файлов
- •1.1.3. Защита файлов
- •1.1.4. Режим многопользовательского доступа
- •1.2. Области применения файлов
- •1.3. Потребности информационных систем
- •2.1. Основные функции субд
- •2.1.1. Непосредственное управление данными во внешней памяти
- •2.1.2. Управление буферами оперативной памяти
- •2.1.3. Управление транзакциями
- •2.1.4. Журнализация
- •2.1.5. Поддержка языков бд
- •2.2. Типовая организация современной субд
- •2.3. Пример: System r
- •3.1. Основные особенности систем, основанных на инвертированных списках
- •3.1.1. Структуры данных
- •3.1.2. Манипулирование данными
- •3.1.3. Ограничения целостности
- •3.2. Иерархические системы
- •3.2.1. Иерархические структуры данных
- •3.2.2. Манипулирование данными
- •3.2.3. Ограничения целостности
- •3.3. Сетевые системы
- •3.3.1. Сетевые структуры данных
- •3.3.2. Манипулирование данными
- •3.3.3. Ограничения целостности
- •3.4. Достоинства и недостатки
- •4.1. Базовые понятия реляционных баз данных
- •4.1.1. Тип данных
- •4.1.2. Домен
- •4.1.3. Схема отношения, схема базы данных
- •4.1.4. Кортеж, отношение
- •4.2. Фундаментальные свойства отношений
- •4.2.1. Отсутствие кортежей-дубликатов
- •4.2.2. Отсутствие упорядоченности кортежей
- •4.2.3. Отсутствие упорядоченности атрибутов
- •4.2.4. Атомарность значений атрибутов
- •4.3. Реляционная модель данных
- •4.3.1. Общая характеристика
- •4.3.2. Целостность сущности и ссылок
- •5.1. Реляционная алгебра
- •5.1.1. Общая интерпретация реляционных операций
- •5.1.2. Замкнутость реляционной алгебры и операция переименования
- •5.1.3. Особенности теоретико-множественных операций реляционной алгебры
- •5.1.4. Специальные реляционные операции
- •5.2. Реляционное исчисление
- •5.2.1. Кортежные переменные и правильно построенные формулы
- •5.2.2. Целевые списки и выражения реляционного исчисления
- •5.2.3. Реляционное исчисление доменов
- •6.1. Проектирование реляционных баз данных с использованием нормализации
- •6.1.1. Вторая нормальная форма
- •6.1.2. Третья нормальная форма
- •6.1.3. Нормальная форма Бойса-Кодда
- •6.1.4. Четвертая нормальная форма
- •6.1.5. Пятая нормальная форма
- •6.2. Семантическое моделирование данных, er-диаграммы
- •6.2.1. Семантические модели данных
- •6.2.2. Основные понятия модели Entity-Relationship (Сущность-Связи)
- •6.2.3. Нормальные формы er-схем
- •6.2.4. Более сложные элементы er-модели
- •6.2.5. Получение реляционной схемы из er-схемы
- •7.1. Используемая терминология
- •7.2. Основные цели System r и их связь с архитектурой системы
- •7.3. Организация внешней памяти в базах данных System r
- •7.4. Интерфейс rss
- •7.5. Синхронизация в System r
- •7.6. Журнализация и восстановление в System r
- •8.1. История субд Ingres
- •8.2. Ingres как unix-ориентированная субд. Динамическая структура системы: набор процессов
- •8.3. Структуры данных, методы доступа, интерфейсы доступа к данным
- •8.4. Общая характеристика языка quel. Язык программирования equel
- •8.5. Общий подход к организации представлений, ограничениям целостности и контролю доступа
- •9.1. Хранение отношений
- •9.2. Индексы
- •9.2.1. B-деревья
- •9.2.2. Хэширование
- •9.3. Журнальная информация
- •9.4. Служебная информация
- •10.1. Транзакции и целостность баз данных
- •10.2. Изолированность пользователей
- •10.3. Сериализация транзакций
- •11.1. Синхронизационные захваты
- •11.1.1. Гранулированные синхронизационные захваты
- •11.1.2. Предикатные синхронизационные захваты
- •11.1.3. Тупики, распознавание и разрушение
- •11.2. Метод временных меток
- •12.1. Журнализация и буферизация
- •12.2. Индивидуальный откат транзакции
- •12.3. Восстановление после мягкого сбоя
- •12.4. Физическая согласованность базы данных
- •12.5. Восстановление после жесткого сбоя
- •13.1. Sequel/sql субд System r
- •13.1.1. Запросы и операторы манипулирования данными
- •13.1.2. Операторы определения и манипулирования схемой бд
- •13.1.3. Определения ограничений целостности и триггеров
- •13.1.4. Представления базы данных
- •13.1.5. Определение управляющих структур
- •13.1.6. Авторизация доступа к отношениям и их полям
- •13.1.7. Точки сохранения и откаты транзакции
- •13.1.8. Встроенный sql
- •13.1.9. Динамический sql
- •13.2. Язык sql в коммерческих реализациях
- •13.3. Стандартизация sql
- •14.1. Типы данных
- •14.2. Средства определения схемы
- •14.2.1. Оператор определения схемы
- •14.2.2. Определение таблицы
- •14.2.3. Определение столбца
- •14.2.4. Определение ограничений целостности таблицы
- •14.2.5. Определение представлений
- •14.2.6. Определение привилегий
- •15.1. Структура запросов
- •15.1.1. Спецификация курсора
- •15.1.2. Оператор выборки
- •15.1.3. Подзапрос
- •15.2. Табличное выражение
- •15.2.1. Раздел from
- •15.2.2. Раздел where
- •15.2.3. Раздел group by
- •15.2.4. Раздел having
- •15.3. Агрегатные функции и результаты запросов
- •15.3.1. Семантика агрегатных функций
- •15.3.2. Результаты запросов
- •16.1. Язык модулей или встроенный sql?
- •16.2. Язык модулей
- •16.2.1. Определение процедуры
- •16.3. Встроенный sql
- •16.4. Набор операторов манипулирования данными
- •16.4.1. Операторы, связанные с курсором
- •16.4.2. Одиночные операторы манипулирования данными
- •16.5. Динамический sql в Oracle V.6
- •16.5.1. Оператор подготовки
- •16.5.2. Оператор получения описания подготовленного оператора
- •16.5.3. Оператор выполнения подготовленного оператора
- •16.5.4. Работа с динамическими операторами sql через курсоры
- •17.1. Оператор выделения памяти под дескриптор
- •17.2. Оператор освобождения памяти из-под дескриптора
- •17.3. Оператор получения информации из области дескриптора sql
- •17.4. Оператор установки дескриптора
- •17.5. Оператор подготовки
- •17.6. Оператор отказа от подготовленного оператора
- •17.7. Оператор запроса описания подготовленного оператора
- •17.8. Оператор выполнения подготовленного оператора
- •17.9. Оператор подготовки с немедленным выполнением
- •17.10. Оператор объявления курсора над динамически подготовленным оператором выборки
- •17.11. Оператор определения курсора над динамически подготовленным оператором выборки
- •17.12. Оператор открытия курсора, связанного с динамически подготовленным оператором выборки
- •17.18. Подготавливаемый оператор позиционной модификации
- •17.19. Сводка новых возможностей sql-3
- •17.19.1. Типы данных
- •17.19.2. Некоторые другие свойства sql-3
- •18.1. Общая схема обработки запроса
- •18.2. Синтаксическая оптимизация запросов
- •18.2.1. Простые логические преобразования запросов
- •18.2.2 Преобразования запросов с изменением порядка реляционных операций
- •18.2.3 Приведение запросов со вложенными подзапросами к запросам с соединениями
- •18.3. Семантическая оптимизация запросов
- •18.3.1. Преобразования запросов на основе семантической информации
- •18.3.2. Использование семантической информации при оптимизации запросов
- •18.4. Выбор и оценка альтернативных планов выполнения запросов
- •18.4.1. Генерация планов
- •18.4.2. Оценка стоимости плана запроса
- •18.4.3. Более точные оценки
- •19.1. Открытые системы
- •19.2. Клиенты и серверы локальных сетей
- •19.3. Системная архитектура "клиент-сервер"
- •19.4. Серверы баз данных
- •19.4.1. Принципы взаимодействия между клиентскими и серверными частями
- •19.4.2. Преимущества протоколов удаленного вызова процедур
- •19.4.3. Типичное разделение функций между клиентами и серверами
- •19.4.4. Требования к аппаратным возможностям и базовому программному обеспечению клиентов и серверов
- •20.1. Разновидности распределенных систем
- •20.2. Распределенная система управления базами данных System r*
- •20.2.1. Именование объектов и организация распределенного каталога
- •20.2.2. Распределенная компиляция запросов
- •20.2.3. Управление транзакциями и синхронизация
- •20.3. Интегрированные или федеративные системы и мультибазы данных
- •21.1. Ориентация на расширенную реляционную модель
- •21.2. Абстрактные типы данных
- •21.3. Генерация систем баз данных, ориентированных на приложения
- •21.4. Оптимизация запросов, управляемая правилами
- •21.5. Поддержка исторической информации и темпоральных запросов
- •22.1. Связь объектно-ориентированных субд с общими понятиями объектно-ориентированного подхода
- •22.2. Объектно-ориентированные модели данных
- •22.3. Языки программирования объектно-ориентированных баз данных
- •22.3.1. Потеря соответствия между языками программирования и языками запросов в реляционных субд
- •22.3.2. Языки программирования ообд как объектно-ориентированные языки с поддержкой стабильных (persistent) объектов
- •22.3.3. Примеры языков программирования ообд
- •22.4. Языки запросов объектно-ориентированных баз данных
- •22.4.1. Явная навигация как следствие преодоления потери соответствия
- •22.4.2. Ненавигационные языки запросов
- •22.4.3. Проблемы оптимизации запросов
- •22.5. Примеры объектно-ориентированных субд
- •22.5.1. Проект orion
- •22.5.2. Проект o2
- •23.1. Экстенсиональная и интенсиональная части базы данных
- •23.2. Активные базы данных
- •23.3. Дедуктивные базы данных
9.1. Хранение отношений
Существуют два принципиальных подхода к физическому хранению отношений. Наиболее распространенным является покортежное хранение отношений (кортеж является единицей физического хранения). Естественно, это обеспечивает быстрый доступ к целому кортежу, но при этом во внешней памяти дублируются общие значения разных кортежей одного отношения и, вообще говоря, могут потребоваться лишние обмены с внешней памятью, если нужна часть кортежа.
Альтернативным (менее распространенным) подходом является хранение отношения по столбцам, т.е. единицей хранения является столбец отношения с исключенными дубликатами. Естественно, что при такой организации суммарно в среднем тратится меньше внешней памяти, поскольку дубликаты значений не хранятся; за один обмен с внешней памятью в общем случае считывается больше полезной информации. Дополнительным преимуществом является возможность использования значений столбца отношения для оптимизации выполнения операций соединения. Но при этом требуются существенные дополнительные действия для сборки целого кортежа (или его части).
Поскольку гораздо более распространено хранение по строкам, мы рассмотрим немного более подробно этот способ хранения отношений. Типовой, унаследованной от System R, структурой страницы данных является следующая:
К основным характеристикам этой организации можно отнести следующие:
Каждый кортеж обладает уникальным идентификатором (tid), не изменяемым во все время существования кортежа. Структура tid следует из приведенного выше рисунка.
Обычно каждый кортеж хранится целиком в одной странице. Из этого следует, что максимальная длина кортежа любого отношения ограничена размерами страницы. Возникает вопрос: как быть с "длинными" данными, которые в принципе не помещаются в одной странице? Применяются несколько методов. Наиболее простым решением является хранение таких данных в отдельных (вне базы данных) файлах с заменой "длинного" данного в кортеже на имя соответствующего файла. В некоторых системах (например, в предпоследней версии СУБД Informix) такие данные хранились в отдельном наборе страниц внешней памяти, связанном физическими ссылками. Оба эти решения сильно ограничивают возможность работы с длинными данными (как, например, удалить несколько байтов из середины 2-мегабайтной строки?). В настоящее время все чаще используется метод, предложенный несколько лет тому назад в проекте Exodus, когда "длинные" данные организуются в виде B-деревьев последовательностей байтов.
Как правило, в одной странице данных хранятся кортежи только одного отношения. Существуют, однако, варианты с возможностью хранения в одной странице кортежей нескольких отношений. Это вызывает некоторые дополнительные расходы по части служебной информации (при каждом кортеже нужно хранить информацию о соответствующем отношении), но зато иногда позволяет резко сократить число обменов с внешней памятью при выполнении соединений.
Изменение схемы хранимого отношения с добавлением нового столбца не вызывает потребности в физической реорганизации отношения. Достаточно лишь изменить информацию в описателе отношения и расширять кортежи только при занесении информации в новый столбец.
Поскольку отношения могут содержать неопределенные значения, необходима соответствующая поддержка на уровне хранения. Обычно это достигается путем хранения соответствующей шкалы при каждом кортеже, который в принципе может содержать неопределенные значения.
Проблема распределения памяти в страницах данных связана с проблемами синхронизации и журнализации и не всегда тривиальна. Например, если в ходе выполнения транзакции некоторая страница данных опустошается, то ее нельзя перевести в статус свободных страниц до конца транзакции, поскольку при откате транзакции удаленные при прямом выполнении транзакции и восстановленные при ее откате кортежи должны получить те же самые идентификаторы.
Распространенным способом повышения эффективности СУБД является кластеризация отношения по значениям одного или нескольких столбцов. Полезным для оптимизации соединений является совместная кластеризация нескольких отношений.
С целью использования возможностей распараллеливания обменов с внешней памятью иногда применяют схему декластеризованного хранения отношений: кортежи с общим значением столбца декластеризации размещают на разных дисковых устройствах, обмены с которыми можно выполнять в параллель.
Что же касается хранения отношения по столбцам, то основная идея состоит в совместном хранении всех значений одного (или нескольких) столбцов. Для каждого кортежа отношения хранится кортеж той же степени, состоящий из ссылок на места расположения соответствующих значений столбцов. В последней лекции мы будем рассматривать особенности организации распределенных реляционных СУБД. Одним из приемов является так называемое вертикальное разделение отношений, когда в разных узлах сети хранятся разные проекции данного отношения. Хранение отношения по столбцам в некотором смысле является предельным случаем вертикального разделения отношений.