- •Глава 13. Семантическое моделирование
- •Часть III Проектирование базы данных
- •Часть IV
- •14.1. Введение
- •14.2. Транзакции
- •14.3. Восстановление транзакции
- •14.4. Восстановление системы
- •14.5. Восстановление носителей
- •14.6. Двухфазная фиксация
- •14.7. Поддержка языка sql
- •14.8. Резюме
- •15.1. Введение
- •15.2. Три проблемы параллельности
- •15.3. Блокировка
- •15.4. Устранение трех проблем параллельности
- •15.5. Взаимная блокировка
- •15.6. Упорядочиваемость
- •15.7. Уровни изоляции
- •15.8. Блокировка намерения
- •15.9. Средства языка sql
- •15.10. Резюме
- •Часть V
- •16.1. Введение
- •16.2. Избирательная схема управления доступом
- •16.3. Мандатная схема управления доступом
- •16.4. Статистические базы данных
- •16.5. Шифрование данных
- •16.6. Средства языка sql
- •16.7. Резюме
- •17.1. Введение
- •17.2. Пример выполнения оптимизации
- •17.3. Оптимизация запросов
- •17.4. Преобразование выражений
- •17.5. Статистические показатели базы данных
- •17.6. Стратегия по принципу "разделяй и властвуй"
- •17.7. Реализация реляционных операторов
- •17.8. Резюме
- •18.1. Введение
- •18.2. Обзор концепции трехзначной логики
- •18.3. Некоторые следствия изложенной схемы
- •18.4. Отсутствующие значения и ключи
- •18.5. Внешнее соединение
- •18.6. Специальные значения
- •18.7. Поддержка неопределенных значений в языке sql
- •18.8. Резюме
- •Глава 19
- •19.1. Введение
- •19.2. Иерархия типов
- •19.3. Полиморфизм и заменимость
- •19.4. Переменные и операция присвоения
- •19.5. Специализация по ограничениям
- •19.6. Операции сравнения
- •19.7. Операторы, версии и сигнатуры
- •19.8. Является ли окружность эллипсом
- •19.9. Пересмотр специализации ограничением
- •19.10. Резюме
- •20.1. Введение
- •20.2. Предварительные сведения
- •20.3. Двенадцать основных целей
- •1. Локальная независимость
- •2. Отсутствие опоры на центральный узел
- •3. Непрерывное функционирование
- •4. Независимость от расположения
- •5. Независимость от фрагментации
- •6. Независимость от репликации
- •7. Обработка распределенных запросов
- •8. Управление распределенными транзакциями
- •9. Аппаратная независимость
- •10. Независимость от операционной системы
- •11. Независимость от сети
- •12. Независимость от типа субд
- •20.4. Проблемы распределенных систем
- •Транзакция т1х
- •20.5. Системы "клиент/сервер"
- •20.6. Независимость от субд
17.2. Пример выполнения оптимизации
Начнем изложение с простого примера (он уже кратко рассматривался в разделе 6.6), дающего представление о поразительных результатах, которых можно достичь с помо- щью оптимизации. Рассмотрим следующий запрос: "Определить имена поставщиков де- тали с номером 'Р2'". Алгебраическая запись этого запроса такова.
( ( SP JOIN S ) WHERE Pi = Pi ( 'Р2' ) ) { SNAME }
Предположим, что в базе данных содержится информация о 100 поставщиках и 10 ООО поставках деталей, из которых только 50 включают партии деталей с номером ' Р2'. Пред- положим для простоты, что переменные-отношения S и SP сохраняются на диске, как два отдельно хранимых файла, в каждой записи которых помещается по одному кортежу дан- ных. В этом случае, если система будет вычислять данное выражение "прямо" (т.е. вообще без оптимизации), последовательность выполняемых операций будет такой.
Соединение переменных-отношений SP и S (по атрибуту Sf). При выполнении этой операции потребуется считать информацию о 10 000 поставках партий дета- лей и 10 000 раз считать информацию о 100 поставщиках (один раз для каждой по- ставки деталей). В результате будет получен промежуточный набор данных, со- держащий 10 000 соединенных кортежей. Этот набор данных записывается на диск (предположим, что для размещения промежуточного результата в основной (оперативной) памяти не хватает места).
Выборка из полученного на этапе 1 результата кортежей с данными о детали с номером 'Р2'. На этом этапе выполняется чтение 10 000 соединенных кортежей обратно в оперативную память, причем полученный результат состоит только из 50 кортежей, которые, по нашему предположению, вполне могут поместиться в опе- ративной памяти.
Выполнение проекции по атрибуту SNAME результата, полученного на эта- пе 2. На этом этапе формируется результирующий набор исходного запроса (со- стоящий максимум из 50 кортежей, которые вполне могут быть размещены в оперативной памяти).
Представленная ниже процедура полностью эквивалентна описанной выше в том смысле, что она обязательно приведет к тому же конечному результату, но он будет по- лучен более эффективным способом.
Выборка из переменной-отношения SP кортежей с данными только о детали с номером 'Р2'. На этом этапе выполняется чтение 10 000 кортежей и создается ре- зультирующий набор, состоящий только из 50 кортежей, который, как мы предпо- лагаем, может поместиться в оперативной памяти.
Соединение полученного на этапе 1 результата с переменной-отношением S (по атрибуту SI). На этом этапе выполняется считывание данных обо всех 100 по- ставщиках (но только один раз, а не по одному разу для каждой поставки партии деталей, так как данные обо всех поставленных партиях деталей с номером 'Р2' уже находятся в оперативной памяти). Результат содержит 50 соединенных корте- жей (которые также помещаются в оперативной памяти).
3. Выполнение проекции по атрибуту SNAME результата, полученного на этапе 2
(аналогично этапу 3 предыдущей последовательности действий). Требуемый ре- зультат (не более 50 кортежей) помещается в оперативной памяти.
В первой из показанных процедур в целом выполняется 1 030 ООО операций ввода- вывода кортежей, в то время как во второй процедуре выполняется только 10 100 опера- ций ввода-вывода. Следовательно, совершенно очевидно, что если принять в качестве меры оценки производительности количество выполненных операций ввода-вывода кор- тежей, то вторая процедура в 100 раз эффективнее первой. (На практике мерой оценки производительности служит количество операций ввода-вывода страниц, а не отдельных кортежей, но для данного примера это уточнение можно игнорировать.) Кроме того, вполне понятно, что предпочтительнее реализовать данный запрос именно с помощью второй процедуры, а не первой!
Приведенный пример показывает, что следствием даже незначительных изменений в алгоритме реализации (выполнения выборки, а затем соединения вместо соединения и последующей выборки) может быть существенное увеличение производительности. Производительность повысится еще больше, если переменная-отношение SP будет ин- дексирована или хеширована по атрибуту Р|. В этом случае количество кортежей, счи- тываемых на этапе 1 второй процедуры, уменьшится с 10 000 до всего лишь 50, в резуль- тате чего вся процедура окажется в 7 000 раз эффективнее ее исходного варианта. Ана- логично этому наличие индекса или хеш-таблицы для атрибута S.Sf позволит уменьшить количество операций ввода-вывода кортежей на этапе 2 со 100 до 50, в результате чего процедура вычисления запроса окажется более чем в 10 000 раз эффективнее исходного варианта. Это означает, что если на вычисление исходного варианта реализации запроса потребуется 3 часа, то оптимизированная версия этого же запроса будет выполнена за одну секунду. К тому же, безусловно, возможны и многие другие улучшения.
Несмотря на то что приведенный выше пример достаточно прост, он весьма наглядно демонстрирует необходимость использования оптимизации. Кроме того, он демонстри- рует вероятные типы улучшений, которые могут применяться на практике. В следующем разделе используется более систематический подход к решению проблемы оптимизации. В частности, в нем показано, как общая проблема может быть разделена на последова- тельность из нескольких более или менее независимых подзадач. Это позволит нам пе- рейти к рассмотрению отдельных стратегий и приемов оптимизации, обсуждаемых в по- следующих разделах.