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

23.7. Обработка рекурсивных запросов

Как отмечалось в предыдущем разделе, одна из наиболее замечательных особенно­стей дедуктивных СУБД — способность поддерживать рекурсию. Именно поэтому изу­чению технологий реализации рекурсии в последние годы уделялось значительное вни­мание. Действительно, с 1986 года на каждой научной конференции по базам данных один или несколько докладов обязательно посвящаются этой теме. Ниже кратко обсуж­дается поддержка рекурсивных запросов — функция, которая обычно не характерна для традиционных СУБД.

В качестве примера повторим приведенное в разделе 23.6 рекурсивное определение переменной-отношения COMPONENT OF в терминах структуры состава деталей PART_STROCTURE (для краткости вместо полного названия PART_STRUCTURE используется сокращение PS, а вместо C0MP0NENT_0F — СОМР; кроме того, используется запись, приня­тая в языке Datalog).

СОМР ( рх, ру ) <= PS ( рх, ру )

СОМР ( рх, ру ) <= PS ( рх, pz ) AND СОМР ( pz, ру )

А вот пример типичного рекурсивного запроса к базе данных ("Найти все компонен­ты, из которых состоит деталь с номером 'Р1"').

? <= СОМР ( 'РГ, ру )

Второе правило в приведенном выше рекурсивном определении является линейно рекурсивным, поскольку предикат из заголовка правила встречается в теле правила толь­ко один раз. На самом деле можно переопределить это правило таким образом, чтобы рекурсия не была линейной.

Q0MP ( рх, ру ) <= PS ( рх, ру )

СОМР ( рх, ру ) <= СОМР ( рх, pz ) AND СОМР ( pz, ру }

Однако с практической точки зрения линейная рекурсия представляет гораздо боль­ший интерес, потому что чаще встречается на практике и для ее применения разработано несколько известных и эффективных методов [23.16]. Поэтому далее речь пойдет ис­ключительно о линейной рекурсии.

Замечание. Для полноты изложения следует подчеркнуть, что понятие "рекурсивное правило" необходимо обобщить для решения более сложных случаев следующего типа.

Р ( х, у ) <= Q ( х, г ) AND R ( г, у ) Q ( х, у ) <= Р ( х, г ) AND S ( г, у )

Для краткости изложения эти особенности будут опущены. Более подробную инфор­мацию о них можно найти в [23.16].

PS

Так же, как при обработке классических (нерекурсивных) запросов, в целом, пробле­ма реализации заданного рекурсивного запроса может быть разбита на две отдельные части, а именно: преобразование исходного запроса в эквивалентную, но более эффек­тивную форму и собственно выполнение преобразованного таким образом запроса. В литературе содержатся описания различных подходов к решению этих проблем. Ниже кратко описаны некоторые простейшие из предложенных технологий. Они будут проил­люстрированы на примере запроса "Найти все компоненты детали с номером 'Р1'" с ис­пользованием приведенного ниже набора значений в переменной-отношении PS.

РХ

PY

Р1

Р2

Р1

РЗ

Р2

РЗ

Р2

Р4

РЗ

Р5

Р4

Р5

Р5

Р6

Унификация и резолюция

Одним из возможных подходов, конечно, является использование стандартных для языка Prolog методов унификации и резолюции, описанных в разделе 23.4. В данном примере этот подход будет реализован следующим образом. Прежде всего следует ука­зать первичные предпосылки, которые являются дедуктивными аксиомами и в конъюнк­тивной нормальной форме выглядят так, как показано ниже.

  1. NOT PS ( рх, ру ) OR СОМР ( рх, ру )

  2. NOT PS ( рх, pz ) OR NOT СОМР ( pz, py } OR COMP ( px, py ) Еще одна предпосылка создана на основе искомого заключения.

  3. NOT СОМР ( 'РГ, ру ) OR RESULT { ру )

Основные аксиомы образуют оставшиеся предпосылки. Ниже приведен пример од­ной из таких аксиом.

4. PS ( 'РГ, 'Р2' )

Подставив 'РГ вместо рх и 'Р2' вместо ру в строке из п. 1 и совместив строки из пп. 1 и 4, получим следующий результат.

5. СОМР ( 'РГ, 'Р2' )

Теперь, подставив значение 'Р2' вместо ру в строке из п. 3 и совместив строки из пп. 3 и 5, получим окончательный результат.

6. RESULT ( 'Р2' )

Таким образом, деталь с номером 'Р2' является компонентом детали с номером ' РГ. Аналогично можно показать, что деталь с номером 'РЗ' также является компонентом детали с номером 'РГ. Теперь, обладая дополнительными аксиомами СОМР( 'РГ , 'Р2') и С0МР('РГ ,'РЗ'), можно рекурсивно выполнить поиск всех остальных компонентов. Эта задача предлагается читателю в качестве упражнения.

Однако на практике применение унификации и резолюции может в значительной сте­пени снизить производительность системы. Поэтому желательно найти и использовать более эффективную стратегию. Несколько таких стратегий описано ниже.

Наивное оценивание

Наивное оценивание [23.25], судя по названию, является, вероятно, простейшим подходом. Его можно продемонстрировать (на основе рассматриваемого примера запро­са) с помощью приведенного ниже псевдокода.

СОМР := PS ;

do until СОМР reaches a "fixpoint" ; /* Выполнять, пока СОМР не достигнет СОМР ;= СОМР UNION ( СОМР » PS ) ; end ;

DISPLAY := СОМР WHERE РХ = Р# ГРГ)

"точки неизменности" */

Каждая из переменных-отношений СОМР и DISPLAY (подобно переменной-отношению PS) имеет по два атрибута: РХ и PY. Попросту говоря, выполнение этого алгоритма с по­лучением промежуточного результата, состоящего из объединения соединения отноше­ния PS и предыдущего промежуточного результата, повторяется до тех пор, пока проме­жуточный результат не достигнет точки неизменности, т.е. пока не прекратится рост (изменение) промежуточного результата.

Замечание. Выражение СОМР й PS является сокращенной формой записи выражения "соединить СОМР и PS по атрибутам СОМР. PY и PS. РХ с выводом результатов по атрибутам СОМР.РХ и PS.PY". Для краткости здесь игнорируются операции переименования атрибу­та, соответствующие рассматриваемому диалекту данной алгебры (подробности приво­дятся в главе 6).

СОМР » PS

Теперь попробуем применить этот алгоритм к рассматриваемому набору данных. Ниже показаны результаты выполнения первой итерации цикла: слева приведены значе­ния выражения сомр й PS, а справа — значения величины СОМР (кортежи, добавленные в ходе этой итерации, отмечены звездочкой).

РХ

PY

СОМР

РХ

PY

Р1

РЗ

Р1

Р2

Р1

Р4

Р1

РЗ

Р1

Р5

Р2

РЗ

Р2

Р5

Р2

Р4

РЗ

Р6

РЗ

Р5

Р4

Р6

Р4

Р5

Р5

Р6

Р1

Р4

Р1

Р5

Р2

Р5

РЗ

Р6

Р4

Р6

Далее приведены результаты, полученные после второй итерации.

РХ

PY

COMP

PX

PY

PI

P3

PI

P2

PI

P4

PI

P3

PI

P5

P2

P3

P2

P5

P2

P4

P3

P6

P3

P5

P4

P6

P4

P5

PI

P6

P5

P6

P2

P6

PI

P4

PI

P5

P2

P5

P3

P6

P4

P6

PI

P6

P2

P6

Внимательно их просмотрев, можно заметить, что на второй итерации повторяется вычисление кортежей СОМР s PS, полученных во время первой итерации, а также вычис­ляется несколько дополнительных кортежей (в данном случае— два кортежа: ('Р1', 'Рб') и ('Р2', 'Р6')). Это делает методику наивного оценивания не очень при­влекательной.

После третьей итерации и повторения всех необходимых вычислений извлекаемые значения выражения СОМР s PS остаются теми же, что и в предыдущей итерации. Таким образом, точка неизменности для СОМР достигается и выполнение цикла завершается. Выполнив выборку СОМР по всем РХ, равным ' Р1', получим окончательный результат.

РХ

PY

Р1

Р2

Р1

РЗ

Р1

Р4

Р1

Р5

Р1

Р6

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

В заключение следует отметить, что наивное оценивание можно рассматривать как применение метода прямого формирования цепочки. В самом деле, оно начинается с ис­пользования экстенсиональной базы данных (т.е. с действительных значений данных), а за­тем продолжается в виде повторного использования предпосылок определения (т.е. основы правила) вплоть до получения желаемого результата. Фактически этот алгоритм позволяет вычислить минимальную модель для программы на языке Datalog (см. разделы 23.5 и 23.6).

Полунаивное оценивание

Первым очевидным усовершенствованием алгоритма наивного оценивания является возможность избежать повторных вычислений результатов, полученных во время пре­дыдущей итерации. Такой усовершенствованный алгоритм называется полунаивным оцениванием [23.28]. Иначе говоря, на каждом шаге итерации вычисляются только но­вые кортежи, которые добавляются к полученным ранее результатам. Эта идея вновь бу­дет проиллюстрирована на примере запроса "Найти все компоненты детали с номером 'Р1"\ Ниже показана реализация соответствующей процедуры на псевдокоде.

NEW := PS ;

СОМР := NEW ;

do until NEW is empty ;

/* Выполнять, пока отношение NEW не окажется пустым */

NEW := ( NEW » PS ) MINUS СОМР ;

СОМР := СОМР UNION NEW ; end ;

DISPLAY := COMP WHERE PX = Pi ('PI') ;

Теперь стоит просмотреть, как выполняется этот алгоритм на примере использован­ных ранее данных. Перед выполнением цикла переменные-отношения NEW и СОМР иден­тичны переменной-отношению PS.

РХ

PY

СОМР

РХ

PY

Р1

Р2

Р1

Р2

Р1

РЗ

Р1

РЗ

Р2

РЗ

Р2

РЗ

Р2

Р4

Р2

Р4

РЗ

Р5

РЗ

Р5

Р4

Р5

Р4

Р5

Р5

Р6

Р5

Р6

NEW

После выполнения первой итерации эти переменные-отношения будут выглядеть следующим образом.

РХ

PY

СОМР

РХ

PY

Р1

Р4

Р1

Р2

Р1

Р5

Р1

РЗ

Р2

Р5

Р2

РЗ

РЗ

Р6

Р2

Р4

Р4

Р6

РЗ

Р5

Р4

Р5

Р5

Р6

Р1

Р4

Р1

Р5

Р2

Р5

РЗ

Р6

Р4

Р6

Данные в переменной-отношении СОМР такие же, как при использовании алгоритма наивного оценивания, а данные в переменной-отношении NEW содержат только те корте­жи, которые были добавлены в СОМР на этой итерации. Обратите внимание, что данные в переменной-отношении NEW не содержат кортеж ('Р1', 'РЗ') (сравните с данными, по­лученными при наивном оценивании).

NEW

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

РХ

PY

СОМР

РХ

PY

Р1

Р6

Р1

Р2

Р2

Р6

Р1

РЗ

Р2

РЗ

Р2

Р4

РЗ

Р5

Р4

Р5

Р5

Р6

Р1

Р4

Р1

Р5

Р2,

Р5

РЗ

Р6

Р4

Р6

Р1

Р6

Р2

Р6

На следующей итерации для переменной-отношения NEW никаких данных получено не будет и цикл завершится.

Статическое фильтрование

Статическое фильтрование базируется на основной идее классической теории оптимизации — налагать ограничения на самых ранних этапах вычислений. Его мож­но рассматривать как приложение метода прямого формирования цепочки, поскольку в нем информация запроса (заключения) фактически используется для модификации правил (предпосылок). Иногда этот способ называется сокращением набора необходи­мых фактов, так как в нем информация запроса используется (вновь) для исключения ненужных кортежей из экстенсиональной базы данных непосредственно на выходе [23.29]. Эффективность этого способа мы продемонстрируем с помощью следующей процедуры на псевдокоде.

NEW ;= PS WHERE РХ = PI ( 'PI' ) ;

СОМР := NEW ;

do until NEW is empty ;

/* Выполнять, пока отношение NEW не окажется пустым */

NEW := (NEW й PS) MINUS СОМР ;

СОМР := СОМР UNION NEW ; end ;

DISPLAY := СОМР ;

Далее приводится последовательное описание этого алгоритма. Перед началом вы­полнения цикла переменные-отношения NEW и СОМР выглядят так, как показано ниже.

NEW

РХ

PY

СОМР

РХ

PY

Р1

Р2

Р1

Р2

Р1

РЗ

Р1

РЗ

На следующей итерации переменная-отношение NEW окажется пустой и выполнение цикла завершится.

На этом заканчивается краткий обзор стратегий рекурсивного выполнения запросов. В опубликованной литературе можно найти множество более сложных подходов, однако их описание явно выходит за рамки этой книги, в которой преследуется совсем другая цель. Более детально изучить эти подходы и получить все необходимые для их понима­ния основные сведения можно, обратившись к [23.16]-[23.43],

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