- •20.7. Средства sql
- •20.8. Резюме
- •21.1. Введение
- •21.2. Некоторые аспекты технологам поддержки принятия решений
- •21.3. Проектирование базы данных поддержки принятия решений
- •21.5. Хранилища данных и магазины данных
- •21.6. Оперативная аналитическая обработка
- •21.7. Разработка данных
- •21.8. Резюме
- •22.1. Введение
- •22.2. Хронологические данные
- •22.3. Основная проблема хронологических баз данных
- •22.4. Интервалы
- •22.5. Интервальные типы
- •22.6. Скалярные операторы для интервалов
- •22.7. Операторы обобщения для интервалов
- •22.8. Реляционные операторы для обработки интервалов
- •22.9. Ограничения, включающие интервалы
- •22.10. Операторы обновления, включающие интервалы
- •22.11. Проектирование базы данных
- •22.12. Резюме
- •23.1. Введение
- •23.2. Обзор основных концепций
- •23.3. Исчисление высказываний
- •23.4. Исчисление предикатов
- •23.5. Базы данных с точки зрения доказательно-теоретического подхода
- •23.6. Дедуктивные субд
- •23.7. Обработка рекурсивных запросов
- •23.8. Резюме
- •Часть VI
- •24.1. Введение
- •24.2. Объекты, классы, методы и сообщения
- •24.3. Еще раз об объектах и объектных классах
- •Cdo для класса set (ref(emp))
- •24.4. Простой пример
- •1 | Course с001 , с001 0ffs , с001 ny offs |
- •24.5. Дополнительные аспекты
- •24.6. Резюме
- •25.1. Введение
- •X2 rational, y2 rational ) ... ;
- •25.2. Первая грубейшая ошибка
- •25.3. Вторая грубейшая ошибка
- •25.4. Вопросы реализации
- •25.5. Преимущества реального сближения двух технологий
- •25.6. Резюме
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
РХ |
PY |
Р1 |
Р2 |
Р1 |
РЗ |
Р2 |
РЗ |
Р2 |
Р4 |
РЗ |
Р5 |
Р4 |
Р5 |
Р5 |
Р6 |
Унификация и резолюция
Одним из возможных подходов, конечно, является использование стандартных для языка Prolog методов унификации и резолюции, описанных в разделе 23.4. В данном примере этот подход будет реализован следующим образом. Прежде всего следует указать первичные предпосылки, которые являются дедуктивными аксиомами и в конъюнктивной нормальной форме выглядят так, как показано ниже.
NOT PS ( рх, ру ) OR СОМР ( рх, ру )
NOT PS ( рх, pz ) OR NOT СОМР ( pz, py } OR COMP ( px, py ) Еще одна предпосылка создана на основе искомого заключения.
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
РХ |
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],