Скачиваний:
82
Добавлен:
02.05.2014
Размер:
2.28 Mб
Скачать

17.2. Пример выполнения оптимизации

Начнем изложение с простого примера (он уже кратко рассматривался в разделе 6.6), дающего представление о поразительных результатах, которых можно достичь с помо- щью оптимизации. Рассмотрим следующий запрос: "Определить имена поставщиков де- тали с номером 'Р2'". Алгебраическая запись этого запроса такова.

( ( SP JOIN S ) WHERE Pi = Pi ( 'Р2' ) ) { SNAME }

Предположим, что в базе данных содержится информация о 100 поставщиках и 10 ООО поставках деталей, из которых только 50 включают партии деталей с номером ' Р2'. Пред- положим для простоты, что переменные-отношения S и SP сохраняются на диске, как два отдельно хранимых файла, в каждой записи которых помещается по одному кортежу дан- ных. В этом случае, если система будет вычислять данное выражение "прямо" (т.е. вообще без оптимизации), последовательность выполняемых операций будет такой.

  1. Соединение переменных-отношений SP и S (по атрибуту Sf). При выполнении этой операции потребуется считать информацию о 10 000 поставках партий дета- лей и 10 000 раз считать информацию о 100 поставщиках (один раз для каждой по- ставки деталей). В результате будет получен промежуточный набор данных, со- держащий 10 000 соединенных кортежей. Этот набор данных записывается на диск (предположим, что для размещения промежуточного результата в основной (оперативной) памяти не хватает места).

  2. Выборка из полученного на этапе 1 результата кортежей с данными о детали с номером 'Р2'. На этом этапе выполняется чтение 10 000 соединенных кортежей обратно в оперативную память, причем полученный результат состоит только из 50 кортежей, которые, по нашему предположению, вполне могут поместиться в опе- ративной памяти.

  3. Выполнение проекции по атрибуту SNAME результата, полученного на эта- пе 2. На этом этапе формируется результирующий набор исходного запроса (со- стоящий максимум из 50 кортежей, которые вполне могут быть размещены в оперативной памяти).

Представленная ниже процедура полностью эквивалентна описанной выше в том смысле, что она обязательно приведет к тому же конечному результату, но он будет по- лучен более эффективным способом.

  1. Выборка из переменной-отношения SP кортежей с данными только о детали с номером 'Р2'. На этом этапе выполняется чтение 10 000 кортежей и создается ре- зультирующий набор, состоящий только из 50 кортежей, который, как мы предпо- лагаем, может поместиться в оперативной памяти.

  2. Соединение полученного на этапе 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 часа, то оптимизированная версия этого же запроса будет выполнена за одну секунду. К тому же, безусловно, возможны и многие другие улучшения.

Несмотря на то что приведенный выше пример достаточно прост, он весьма наглядно демонстрирует необходимость использования оптимизации. Кроме того, он демонстри- рует вероятные типы улучшений, которые могут применяться на практике. В следующем разделе используется более систематический подход к решению проблемы оптимизации. В частности, в нем показано, как общая проблема может быть разделена на последова- тельность из нескольких более или менее независимых подзадач. Это позволит нам пе- рейти к рассмотрению отдельных стратегий и приемов оптимизации, обсуждаемых в по- следующих разделах.

Соседние файлы в папке Дейт К. Дж. Введение в системы баз данных [7 издание]