Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Методы и средства интеграции независимых баз данных в распределенных телекоммуникационных сетях. Монография

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
☆
То, что выполнение подобных программ приводит к построению верного ответа на запрос, следует из способа построения программы: выполнение подобной программы полностью эмулирует итеративный обход графа CIG, что, как показано в [45] (и видно из способа построения графа), приводит к постепенному формированию ответа на запрос, которому соответствует граф.
_A1=(b[x,y] WHERE (y = 7) RENAME y AS y%0,x AS x ADD 7 AS x1__0{x,x1__0} RENAME x AS x ADD 7 AS z{x,z}) JOIN (c[x,y] WHERE (y = 6) RENAME y AS y%1,x AS z) ADD 6 AS x1__1{x,x1__1} a%0=_A1 WHERE 1=0 INTEGER i=0 while(i<100 AND _A1 MINUS a%0 IS NOT NULL) begin i=i+1; a%0=_A1 _A1=((a%0[x,x1] RENAME x1 AS z,x AS x) UNION ((b[x,y] WHERE (y = 7) RENAME y AS y%0,x AS x ADD 7 AS x1__0{x,x1__0} RENAME x AS x ADD 7 AS z{x,z}) UNION (a%0[x,x1] WHERE (x1 = 6) RENAME x1 AS x1%1,x AS x ADD 5 AS x1__1{x,x1__1} RENAME x AS x ADD 5 EXPR AS z{x,z}))) JOIN (c[ INT x, INT y] WHERE (y = 6) RENAME y AS y%2,x AS z) ADD 6 AS x1__2{x,x1__2} UNION a%0 end
Рис. 3.15. Программа РИ для программы на рис. 3.13
То, что рассматриваемые программы РИ завершаются за конечное число шагов, вытекает из следующих рассуждений. Пусть в БД определены отношения и пусть эффективный домен j-го атрибута отношения (то есть множество значений, которое данный атрибут принимает) - . Это множество — конечное.
a%0[x,x1] WHERE (x1 = 6) RENAME x1 AS x1%0,x AS x ADD 6 AS x1__0 {x,x1__0} RENAME x AS b ADD 6 AS x1__1 {b}
Рис 3.16. Выражение РА для программы на рис. 3.13
Расширение DISGO QL не поддерживает операций генерации новых значений на основе существующих, то есть правил вида типа
101
n(x):-m(f(x)), где m(Y) - предикат в хвосте правила, n(x) — неявный предикат, определяемый через m(Y), а x не присутствует непосредственно в аргументах m(Y). Следовательно, и при выполнении шага перехода цикла программы РИ могут генерироваться только константы, участвующие в определении неявных предикатов, но их число тоже конечное. Пусть множество констант, используемых в определении неявных предикатов - C. Тогда множество D, определяемое как , тоже
конечное, как и множество , определяемое как, для любого натурального m. Размер отношения с числом атрибутов
m, получаемого в результате выполнения цикла РИ, ограничен размером множества . За каждый шаг цикла РИ генерируется конечное множество значений атрибутов из D, следовательно, алгоритм, используемый для явного создания отношений, соответствующих рекурсивно определенным предикатам пользовательской программы, конечен.
Рассматриваемые алгоритмы налагают следующие ограничения на обрабатываемые программы, которые содержат несколько групп циклов. Если из группы циклов A есть путь, ведущий в группу циклов B, то из группы циклов B не должно быть пути, ведущего в группу циклов A, что позволяет постепенно обрабатывать различные группы циклов в определенном порядке (то есть вначале необходимо обработать группу циклов B, а затем группу циклов A).
Предложенные алгоритмы обработки Datalog-подобных запросов в значительной степени отличаются от известных алгоритмов. В большинстве современных реализаций Datalog­подобных языков используется метод магических множеств (magic sets) [47] и его адаптации (например, описываемая в работе [48] адаптация метода магических множеств для обработки запросов, выраженных на дизъюнктивном Datalog'е). Альтернативными методами являются методы обратной цепной итерации (backchain
102
iteration) [49], метод компиляции рекурсивных программ [50], наивная интерпретация запросов и некоторые другие методы.
Привлекательно выглядит идея компиляции Datalog-программ [50]. Различие между этим методом и предложенным нами алгоритмом обработки рекурсивных программ состоит в используемой процедуре унификации предикатов и в том, что СИД выполняет трансляцию запросов в выражения РА и программы РИ и более не управляет выполнением данных программ. Последующая обработка рекурсивных программ выполняется внутри центральной СУБД с использованием средств самой СУБД (посредством программы, разработанной на процедурном языке СУБД) и без внешнего управления со стороны СИД, что позволяет снизить накладные расходы на взаимодействие с СУБД.
3.3. Алгоритм генерации SQL по выражениям РА
Стандартным ЯЗ к реляционным СУБД является SQL. Однако различные реализации SQL в значительной степени отклоняются от стандарта или трактуют его по-разному. Поэтому в качестве промежуточного языка для представления запросов к СУБД в рассматриваемых алгоритмах выбран язык РА в варианте, описываемом в работе [51]. Это позволяет упростить и унифицировать процедуры оптимизации, применяемые в СИД. Однако, перед исполнением данных запросов в СУБД, их необходимо перевести в SQL.
В ходе обработки запросов пользователя на 3 шаге алгоритма, приведенного в параграфе 2.3.1, дважды происходит преобразование из выражений РА в SQL-запрос. В начале — для извлечения данных из ИД и их сохранения в центральной СУБД, затем — для формирования окончательного ответа на пользовательский запрос.
В ходе работы над СИД DISGO был создан транслятор для преобразования выражений РА и программ РИ в SQL-запросы. Абстрактный класс транслятора реализует преобразование из
103
выражений РА в стандартный SQL. Данный класс может быть легко
выражение РА
соответствующий запрос на языке SQL
<X> ADD <A1> AS
SELECT R.*, <A1> AS <B1>,...,<An> AS <
Bn>
<R1> JOIN <R2>
SELECT tmp1.<Attrs(R1)>,
<R1> MINUS <R2>
SELECT * FROM <R1>
расширен (путем наследования и изменения некоторых констант) для перевода в другой диалект SQL (подобным образом были созданы трансляторы для преобразования выражений РА в диалекты SQL, используемые СУБД PostgreSQL и Oracle).
Выражения РА обычно напрямую преобразуются в SQL в
соответствии со строками табл. 3.1.
В данной таблице Attrs(R) — имена атрибутов отношения R, Attrs(R1)\Attrs(R2) — имена атрибутов отношения R1 за исключением имен атрибутов отношения R2, Query(R) — SQL­запрос, на который отображается отношение R, R.<A> - выражение вида «R.a1,R.a2,...,R.an», где ai — имя i-го атрибута во множестве имен атрибутов <A>.
Таблица 3.1
Перевод выражений РА в запросы SQL
<B1>,...,<An> AS <Bn>
FROM ( <X> ) R
tmp2.<Attrs(R2)\Attrs(R1)> FROM (SELECT * FROM <R1>) tmp1, (SELECT * FROM <R2>) tmp2 WHERE tmp1. =
tmp2.
EXCEPT SELECT * FROM <R2>
104
<R> /*
отношение
*/ SELECT Attrs(R) FROM (Query(<R>)) tmp
<R> RENAME <A1>
Формируется список выбираемых атрибутов :S,
<R1> UNION <R2>
SELECT * FROM (<R1>) tmp1
AS <B1>, ...,<An> AS <Bn>
если нужно переименование, оно применяется SELECT :S FROM <R>
UNION ALL SELECT * FROM (<R2>) tmp2
Стоит отметить, что по соображениям эффективности выполнения запросов операция РА UNION переводится в не эквивалентную ей операцию SQL UNION ALL, что приводит к появлению неуникальных кортежей при выполнении запроса. Чтобы избавиться от дубликатов, запрос Q, полученный в результате трансляции выражения РА, переписывается в виде SELECT DISTINCT * FROM (Q) T. Подобная стратегия позволяет как можно дольше откладывать операцию получения уникального набора кортежей. Так как в генерируемых запросах обычно встречается множество операций РА UNION, замена этих операций на операции SQL UNION ALL и использование SELECT DISTINCT лишь в конце обработки запроса дает значительный прирост производительности.
Обработка программ РИ отличается от обработки выражений РА тем, что она выполняется только в центральной СУБД. Для ее выполнения может использоваться хранимая процедура на процедурном языке СУБД. (В частности, в СИД DISGO для ее выполнения используется хранимая процедура, написанная на языке PL/SQL). В качестве аргументов данная процедура должна принимать SQL запрос init, соответствующий выражению инициализации программы РИ, SQL запрос step, соответствующий шагу перехода цикла, имя таблицы t1name, которую нужно создать и заполнить в результате работы данной процедуры и максимальное число шагов выполнения цикла — mln. Процедура, используемая в
105
СИД DISGO также принимает имя временной таблицы t2name, которая используется для накопления промежуточных результатов.
3.4. Алгоритмы оптимизации запросов
Языки, основанные на РА, являются ЯЗ высокого уровня и используются подавляющим большинством современных СУБД. Так как формулировка одного и того же запроса на языке РА может осуществляться множеством способов, то СУБД пытается выбрать способ обработки запросов, который является оптимальным с какой­то точки зрения (позволяет быстро начать получение первых результатов запроса, минимизировать время исполнения запроса и т.д.). Выбор способа обработки запроса может происходить согласно некоторым заранее заданным правилам, реализованным алгоритмически, и не зависеть от данных, находящихся в опрашиваемых отношениях БД (такая оптимизация, например, может включать распространение условий). Дополнительно к упоминаемым выше правилам может быть использована некоторая статистическая информация для оценки стоимости различных планов исполнения запросов.
Оптимизация запроса в интегрированной системе независимых баз данных отличается от задачи оптимизации запроса в СУБД. Отличия состоят в том, что обращение к данным становится намного более дорогой операцией, а элементарные операции по доступу к данным (например, использование какого-либо индекса) не могут контролироваться СИД. Указанные различия усугубляются при объединении данных множества ИД, не располагающихся в одной локальной сети. В этом случае при проведении оптимизации должны учитываться не только свойства данных, но и свойства ИД, подсоединенных к СИД, а также характеристики и загруженность каналов доступа к ИД.
Методы оптимизации запросов, используемые при непосредственной их обработке, описывались в главе 2 (пункты 2.3.1,
106
2.3.2). В настоящем пункте рассматриваются алгоритмы оптимизации запросов на основе правил (считается, что подобные правила определяются алгоритмом программы и не могут изменяться администратором СИД), а также алгоритмы сбора статистики.
3.4.1. Алгоритм оптимизации запросов на основе
правил
В нераспределенных СУБД основные цели оптимизатора заключаются в выборе пути доступа к данным: то есть в определении правильного порядка и алгоритмов соединения таблиц, принятии решений о необходимости использования какого-либо индекса, созданного по таблице. Дополнительно оптимизатор может учитывать ограничения, накладываемые на таблицы или их поля, а также проводить некоторую трансформацию запросов, например, слияние представлений [33].
В случае СИД основными направлениями оптимизации являются уменьшение объема извлекаемой из ИД информации и определение ИД, от опроса которых можно отказаться при обработке текущего запроса. В предлагаемой архитектуре СИД основные операции по соединению таблиц выполняет центральная СУБД, и СИД не имеет контроля над используемыми ею алгоритмами соединения. Построение индексов по временно создаваемым таблицам является затратной операцией. Сведения об индексах и ограничениях в подсоединенных ИД, в принципе, могут использоваться СИД для исключения некоторых ИД при выполнении запроса. Но для этого необходима достаточно сильная интеграция ИД в СИД (например, доступ со стороны СИД к словарю данных СУБД для получения сведений об индексах и ограничениях, что, как правило, оказывается невозможным). В этом случае при изменении схемы подсоединенного ИД администратор ИД должен
107
принимать во внимание влияние этих изменений на СИД, что на практике невозможно.
Основное назначение рассматриваемого алгоритма оптимизации запросов на основе правил заключается в распространении условий, используемых в запросе, на как можно большее количество отношений. Данный алгоритм состоит из двух шагов, что необходимо, например, для того, чтобы распространить условия, встречающиеся в одной части операции JOIN, на другую часть и спустить условия вплотную к простым выражениям, содержащим операции над единственным отношением. Это позволяет при обращении к конкретному ИД извлекать из него меньше излишней информации и тем самым ускорять обработку запроса.
Укрупненное описание алгоритма оптимизации, представленное в псевдокодоподобной записи, имеет следующий вид.
1) Произвести постфиксный обход дерева запроса. На каждом шаге обхода
а) извлечь условия из операций WHERE и ADD; б) добавить извлеченные условия к текущему множеству
условий;
в) провести логические выводы из текущего множества условий, инкрементально добавляя результаты выводов в текущее множество условий;
г) для каждого условия текущего множества условий проверить, если текущая операция — PROJECT и она отсекает атрибуты, использующиеся в условии или операция UNION и MINUS или корень дерева операций, пометить обрабатываемую вершину данным условием, удалить условие из текущего множества условий.
2) Провести префексный обход дерева запроса. На каждом шаге обхода:
108
а) извлечь условия из метки текущей вершины и объединить
с текущим множеством условий;
б) провести логические выводы из текущего множества условий, инкрементально добавляя результаты выводов в текущее множество условий;
в) все условия, которые используют атрибуты только левой части поддерева, добавить в множество L, продолжить обход левого поддерева, используя L в качестве текущего множества условий;
г) все условия, которые используют атрибуты только правой части поддерева, добавить в множество R, продолжить обход правого поддерева, используя R в качестве текущего множества условий;
д) условия текущего множества, не вошедшие в L или R, добавить к метке текущей вершины.
На первом шаге алгоритма условия, накладываемые на атрибуты отношений, распространяются как можно выше, к корню дерева операций, расширяя область действия этих условий. Условия извлекаются из конъюнктивных логических выражений, участвующих в операции выборки WHERE (условия, соединенные операциями AND), из операций ADD (R[x1,x2] ADD «Some Value» AS x3). При распространении условий проводятся логические выводы, например, обработка условия (a=b) AND (b<5) приведет к генерации условий (a=b) AND (b<5) AND (a<5). На втором шаге сужается область действия условий, они распространяются сверху вниз по дереву операций (от корня к листьям). Условия распространяются, пока не встречается выражение, состоящее только из операций РА, примененных к единственному отношению.
Например, выражение РА (A[a1,a2] RENAME a1 AS x1, a2 AS x2) JOIN (B[b1,b2,b3] RENAME b1 AS x2, b2 AS x3, b3 AS x4 WHERE x2='Some Value') {x1,x3,x4} после первого шага обработки будет преобразовано в выражение (A[a1,a2] RENAME a1 AS x1, a2 AS x2) JOIN (B[b1,b2,b3] RENAME b1 AS x2, b2 AS x3, b3 AS x4 WHERE x2='Some Value') WHERE x2='Some Value' {x1,x3,x4}
109
. После второго
шага обработки оно будет выглядеть следующим образом: (A[a1,a2] RENAME a1 AS x1, a2 AS x2 WHERE x2=«Some Value») JOIN (B[b1,b2,b3] RENAME b1 AS x2, b2 AS x3, b3 AS x4 WHERE x2=«Some Value» AND x2=«Some Value») WHERE x2=«Some Value» {x1,x3,x4}.
3.4.2. Алгоритмы сбора и обработки статистической
информации
В описанных в главе 2 (пункты 2.3.2, 2.3.3) методах обработки запросов статистическая информация (статистика) используется при генерации плана доступа к данным (ПДД), для определения целесообразности переноса ограничений на данные из одного ИД в другой и непосредственно во время выполнения запроса для определения медленных ИД.
Выделим три типа поддерживаемой статистики - статистика ИД, статистика отношения и статистика атрибутов отношения. К статистикам ИД относятся время отклика ИД - L(DS), пропускная способность канала до ИД - V(DS), доступность ИД при последнем обращении к нему. Статистики уровня отношения включают размер отношения в байтах size(R) и количество кортежей в отношении - сount(R). Статистики атрибутов отношения - это количество различных значений атрибута numdist(A), минимальное и максимальное представления значения атрибута (min(A) и max(A)), удельный размер представления значения атрибута в формировании размера представления отношения colsize(A).
Зная эти статистики, можно оценить время получения ответа от ИД при предположении, что значения атрибутов отношений равномерно распределены, и их значения независимы. Учитывая, что к ИД посылаются запросы, являющиеся комбинацией операций выборки и проекции (на самом деле к ИД посылаются запросы произвольного типа, но особенности процедуры построения статистики позволяют учитывать лишь указанные операции), основной задачей, которую надо решить для получения требуемой
110
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]