Главная » SQL, Базы данных » ПРИМЕР ВЫПОЛНЕНИЯ ОПТИМИЗАЦИИ

0

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

( ( SP JOIN S ) WHERE P# = Р# (‘Р2′) ) { SNAME }

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

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

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

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

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

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

2.  Соединение полученного на этапе 1 результата с переменной отношения S (по атрибу ту s#). На этом этапе выполняется считывание данных обо всех 100 поставщиках (но только один раз, а не по одному разу для каждой поставки партии деталей Р2, так как данные обо всех поставленных партиях деталей с номером Р2 уже находят ся в оперативной памяти). Результат содержит 50 соединенных кортежей (которые также помещаются в оперативной памяти).

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

В первой из показанных процедур в целом выполняется 1 030 000 операций вводавывода кортежей, в то время как во второй процедуре выполняется только 10 100 операций ввода-вывода. Итак, совершенно очевидно, что если принять в качестве меры оценки производительности количество выполненных операций ввода—вывода кортежей, то вторая процедура больше чем в 100 раз эффективнее первой. Кроме того, вполне понятно, что предпочтительнее реализовать данный запрос именно с помощью второй процедуры, а не первой!

Примечание. На практике мерой оценки производительности служит количество операций ввода—вывода страниц, а не отдельных кортежей, но для упрощения предположим, что каждый кортеж занимает отдельную страницу.

Приведенный пример показывает, что следствием даже незначительных изменений в алгоритме реализации (выполнения выборки, а затем соединения, вместо соединения

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

позволит уменьшить количество операций ввода—вывода кортежей на этапе 2 со 100 до 50,

в результате чего процедура вычисления запроса окажется более чем в 10 000 раз эффективнее исходного варианта. Это означает, что если на вычисление  исходного варианта реализации запроса потребуется три часа, то оптимизированная версия этого же запроса будет выполнена примерно за одну секунду. К тому же, безусловно, возможны и многие другие улучшения.

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

Источник: Дейт К. Дж., Введение в системы баз данных, 8-е издание.: Пер. с англ. — М.: Издательский дом «Вильямс», 2005. — 1328 с.: ил. — Парал. тит. англ.

По теме:

  • Комментарии