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

17.6. Стратегия по принципу "разделяй и властвуй"

Как уже упоминалось выше, в конце раздела 17.4, реляционные выражения рекурсивно определяются в терминах подчиненных выражений, что позволяет оптимизатору применять различные стратегии оптимизации по принципу "разделяй и властвуй". Заметьте, что исполь- зование подобных стратегий особенно привлекательно в средах, поддерживающих парал- лельные вычисления, в частности в распределенных системах, в которых различные части за- проса могут вычисляться параллельно на разных процессорах [ 17.58]—[ 17.61 ]. В данном раз- деле рассматривается одна из подобных стратегий, получившая название декомпозиция за- просов. Впервые она была применена в прототипе системы INGRES [17.36], [17.37].

Замечание. Дополнительную информацию об оптимизации в СУБД INGRES (особенно в ее коммерческой версии, которая в данном контексте несколько отличается от прототипа системы INGRES) можно найти в работе Куи (Kooi) и Франкфорта (Frankforth) [17.2], а также в [17.38].

-3 Напомним, что язык запросов QUEL в системе INGRES использует средства реляционного исчисления.

Основная идея метода декомпозиции запросов строится на разбиении запроса со мно- гими переменными диапазона3 на последовательность запросов меньшего размера обыч- но с одной или двумя такими переменными диапазона. Требуемая декомпозиция дости- гается с помощью методов отделения и подстановки кортежей.

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

  • Подстановка кортежа — это процесс подстановки значения одной переменной в запросе (один кортеж за одну операцию).

Использование метода отделения всегда предпочтительней использования метода подстановки кортежей во всех случаях, когда существует возможность выбора (см. при- мер, приведенный ниже). Тем не менее рано или поздно декомпозиция методом отделе- ния обязательно приведет к разбиению запроса на множество компонентов, которые больше нельзя будет подвергнуть декомпозиции с помощью этого метода, после чего придется обратиться к методу подстановки кортежей.

Ниже рассмотрен пример декомпозиции (основанный на примере из [17.36]). Словес- ное выражение этого запроса имеет следующий вид: "Определить имена поставщиков из Лондона, поставляющих некоторые красные детали весом менее 25 фунтов в количестве более 200 штук". Приведем формулировку этого запроса на языке QUEL, на которую да- лее будем ссылаться, как на формулировку Q0.

QO: RETRIEVE ( S.SNAME)

WHERE

S.CITY

=

'London'

AND

S.SI

=

SP.Sf

AND

SP.QTY

>

200

AND

SP.Pt

=

P.PI

AND

P.COLOR

=

'Red'

AND

P.WEIGHT

<

25

Здесь подразумеваемый диапазон переменных S, Р и SP распространяется на всю од- ноименную переменную-отношение.

Исходя из последних двух сравнений в выражении запроса можно заключить, что нас интересуют только красные детали весом менее 25 фунтов. Следовательно, можно отде- лить подзапрос с одной переменной (на самом деле являющийся проекцией выборки), в котором используется переменная Р.

Dl: RETRIEVE INTO Р' (P.Pi) WHERE P.COLOR = 'Red'

AND P.WEIGHT < 25

Этот запрос с единственной переменной может быть отделен, так как в нем присутст- вует только одна переменная (а именно — переменная диапазона Р), совместно исполь- зуемая с оставшейся частью запроса. Так как запрос D1 связывается с остатком исходно- го запроса по атрибуту Р| (в условии SP.Pt = P.PI), атрибут Pi должен входить в "кортеж-прототип" (см. главу 7) отделенного запроса. Другими словами, отделенный за- прос предназначен для выборки номеров только тех красных деталей, которые весят ме- нее 25 фунтов. Отделенный запрос обозначим как запрос D1, результатом выполнения которого является временная переменная-отношение Р'. (Назначение предложения INTO состоит в том, чтобы создать новую переменную-отношение Р' с единственным атрибу- том Pt. Эта переменная-отношение создается автоматически и содержит результат вы- полнения операции RETRIEVE.) И наконец заменим ссылки на переменную-отношение Р в сокращенной версии запроса Q0 ссылками на переменную-отношение Р'. Эту новую со- кращенную версию исходного запроса обозначим как Q1.

Ql: RETRIEVE (S.SNAME) WHERE S.CITY = 'London'

AND S.Sf = SP.SI

AND SP.QTY > 200

AND SP.Pi = P'.P#

Еще раз применим аналогичный прием к запросу Q1, отделив от него запрос, в кото- ром используется единственная переменная диапазона SP. Присвоим отделенному запро- су имя D2, а оставшуюся после отделения часть запроса Q1 назовем Q2.

D2: RETRIEVE INTO SP' (SP.St, SP.Pf) WHERE SP.QTY > 200

Q2: RETRIEVE (S.SNAME) WHERE S.CITY = 'London'

AND S.St = SP'.Si AND SP'.Pt = P'.Pt

Далее тем же методом отделим запрос с единственной переменной S.

D3: RETRIEVE INTO S' (S.Sf, S.SNAME) WHERE S.CITY = 'London'

Q3: RETRIEVE jS'.SNAME) WHERE S'.St = SP'.St

AND SP'.Pi = P'.Pf

И наконец отделим еще один запрос, в котором используются переменные SP' и Р'. D4: RETRIEVE INTO SP" (SP'.St) WHERE SP'.Pt = P'.Pt Q4: RETRIEVE (S'.SNAME) WHERE S'.St = SP".St

В результате исходный запрос Q0 оказался разбитым на три запроса с одной переменной, Dl, D2 и D3 (каждый из которых является проекцией выборки), и два запроса с двумя перемен- ными, D4 и Q4 (каждый из которых является проекцией соединения). Сложившуюся в резуль- тате ситуацию можно схематично представить в виде структуры, показанной на рис. 17.3.

Окончательный результат

Т

S'

-> Q4 <- SP"

Т

т

D3

Р" -» D4 <- SP*

т

Т Т

s

Dl D2

т т

Р SP

Рис. 17.3. Дерево декомпозиции запро- са Q0

Эту схему можно интерпретировать следующим образом.

■ В запросах Dl, D2 и D3 в качестве входных данных используются переменные- отношения Р, SP и S (а точнее, те отношения, которые являются текущими значе- ниями переменных-отношений Р, SP и S) соответственно, которые и помещают ре- зультат своего выполнения во временные переменные-отношения Р', SP' и S' со- ответственно.

  • Далее выполняется запрос D4, использующий в качестве входных данных времен- ные переменные-отношения Р' и SP' и помещающий результат своего выполне- ния во временную переменную-отношение SP''.

  • Наконец выполняется запрос Q4, использующий в качестве выходных данных пе- ременные-отношения S и SP", результат выполнения которого и является резуль- татом выполнения исходного запроса.

Обратите внимание, что запросы Dl, D2 и D3 полностью независимы и их можно об- рабатывать в любом порядке (предположительно даже параллельно). Запросы D3 и D4 также можно обрабатывать в любом порядке, но только после получения результатов выполнения запросов D1 и D2. Запросы D4 и Q4 нельзя подвергнуть дальнейшей декомпо- зиции, поэтому их следует обрабатывать с помощью метода подстановки кортежей (что обычно обозначает применение поиска последовательным перебором (или метода "грубой силы"), поиска по индексу или поиска в хешированием файле). В качестве при- мера рассмотрим выполнение запроса Q4. Обратившись к обычному набору данных, ис- пользуемых в этой книге для примеров, можно определить, что множество номеров по- ставщиков в атрибуте SP" .St будет выглядеть так: {'SI', 'S2', 'S4'}. Каждое из этих трех значений по очереди должно быть подставлено в атрибут SP" .St. В результате за- прос Q4 примет следующий вид.

RETRIEVE (S'.SNAME j WHERE S'.St = 'SI' OR S'.Si = 'S2' OR S'.St = 'S4'

В [17.36] рассматриваются алгоритм разбиения исходного запроса на запросы с не- приводимыми компонентами и алгоритм выбора переменных для подстановки кортежей. Именно от этого последнего из двух указанных алгоритмов во многом зависит общий успех оптимизации. Кроме того, в данной работе предложены эвристические подходы для оценки стоимости того или иного варианта (в системе INGRES обычно, но не всегда, для подстановки используется отношение с наименьшей кардинальностью). Основная задача процесса оптимизации — избежать выполнения декартовых произведений и ми- нимизировать количество сканируемых кортежей на каждом этапе вычислений.

В [17.36] не представлены алгоритмы оптимизации запросов с одной переменной. Од- нако информация об этом уровне оптимизации присутствует в общем обзоре системы INGRES [17.11]. Для оптимизации запросов с одной переменной в СУБД INGRES, в ос- новном, используются функции, аналогичные подобным функциям в других системах. Они применяют хранящиеся в каталоге статистические данные, на основе которых выбирают конкретный путь доступа к требуемым данным (например, индекс или хеш-таблицу).

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

  1. Метод отделения — это лучшая из методик, которую можно применять на первом этапе оптимизации.

  2. Если на первом этапе нужно выполнять подстановку кортежей, то для этого лучше всего использовать переменную, по которой выполняется соединение.

3. Если к одной из переменных в запросе с двумя переменными применялась подста- новка кортежей, то оптимальная тактика заключается в построении временного ра- бочего индекса или хеш-таблицы (если это еще не сделано) для того атрибута в другом отношении, по которому выполняется соединение. В СУБД INGRES эта тактика активно применяется.

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