Исполнение запросов
Как показывает рис. 1, план выполнения любого запроса XQuery , произведенный
  компилятором и оптимизатором, передается на дальнейшую обработку исполнителю.
  Исполнитель интерпретирует план выполнения запроса, представляющий собой дерево
  физических операций над системой хранения, которые взаимодействуют по данным
  в конвейерном режиме. Набор поддерживаемых в СУБД Sedna физических операций
  покрывает функциональность XQuery library [3] и XQuery Core . Однако этот базовый
  набор операций, соответствующий модели данных XQuery , не обеспечивает возможность
  поддержки всех разумных планов выполнения запросов. В дополнение к физическим
  эквивалентам понятий модели данных XQuery на физическом уровне в СУБД Sedna
  используются кортежи , упорядоченные наборы атомарных значений или
  указателей на дескрипторы узлов. Использование кортежей позволило расширить
  используемый набор физическими операциями, подобными операциям соединения и
  группировки SQL . 
Конечно, набор физических операций обеспечивает и поддержку логических операций
  обновления базы данных. Оператор подъязыка XUpdate представляется в виде плана
  выполнения, состоящего из двух частей: в первой части выбираются узлы, подлежащие
  обновлению, а во второй части происходит обновление этих узлов. Во время выполнения
  операции обновления отобранные узлы, равно как и промежуточные результаты любого
  выражения запроса, представляются прямыми указателями. Во второй части операции
  для представления обновленных узлов используются косвенные указатели – идентификаторы
  узлов. Это решение вызвано тем, что обновление выбранных узлов может повлечь
  их перемещение в памяти, что делает недействительными ведущие к ним прямые
  указатели. 
Конструкторы элементов
	
Кроме аналогов известных тяжеловесных операций соединения, сортировки и группировки,
  в XQuery имеется специфическая ресурсоемкая операция – конструктор XML -элемента.
  Для конструирования XML -элемента требуется глубокое копирование существующих
  данных, вызывающее накладные расходы, которые особенно существенны при наличии
  в запросе вложенных конструкторов элементов. Для оптимизации в СУБД Sedna введена
  операция отложенного конструирования элемента , не выполняющая глубокое
  копирование содержимого конструируемого элемента, а всего лишь сохраняющая
  требуемый для этого набор указателей. Реальное копирование происходит в тот
  момент, когда некоторая операция пытается воспользоваться содержимым сконструированного
  элемента. 
Проведенные исследования [8] показали, что для представительного класса XQuery
  -запросов глубокое копирование вообще не требуется. Большинство XQuery -запросов
  можно перезаписать таким образом, что в плане выполнения запроса выше конструкторов
  элементов не будут присутствовать операции, анализирующие содержимое элементов. 
Различные стратегии выполнения XPath-запросов
Использование описывающей схемы в качестве индексной структуры позволяет избежать
  обхода дерева и ускорить выполнение запроса. Например, рассмотрим XPath -запрос
  // title к XML -документу, представленному на рис. 1. Мы называем подобные
  запросы структурными путевыми запросами , потому что в них используется
  только информация о структуре XML -документа, и для выполнения запроса не требуется
  производить какие-либо проверки, связанные с данными. Для выполнения структурных
  запросов идеально подходит описывающая схема. 
Выполнение запроса начнется с обхода описывающей схемы (см. рис. 1). В результате
  обхода будут получены два узла схемы, содержащие указатели на списки блоков
  с искомыми данными. Если просто пройти сначала по первому списку блоков, а
  затем – по второму, можно нарушить порядок документа. Поэтому до выдачи результата
  требуется выполнение операции слияния. Операция слияния получает на входе несколько
  списков блоков и производит список дескрипторов узлов, упорядоченный в соответствии
  с порядком документа. Для восстановления порядка документа в операции слияния
  используются метки нумерующей схемы. 
В качестве еще одного примера, рассмотрим возможные стратегии выполнения запроса
  / library / book [ issue / year =2004]/ title . Как и в случае предыдущего
  запроса, можно выбрать элементы / library / book с использованием описывающей
  схемы, а затем применить предикат и выполнить оставшуюся часть запроса с использованием
  указателей на данные. Но более эффективным является следующий алгоритм. Сначала
  вычисляется структурная часть запроса: / library / book / issue / year / text
  () . Затем применяется предикат (выбираются только те узлы, для которых text
  =2004 ). И, наконец, к результату этого шага применяется запрос ../../../ title
  . 
Сочетание ленивой и строгой семантики
Все запросы к базам данных обладают одной общей чертой: они обычно оперируют
  большими объемами данных, даже если размеры результатов являются небольшими.
  Поэтому процессоры запросов должны эффективно обрабатывать огромные промежуточные
  наборы данных. В реляционных СУБД была разработана модель итеративного исполнения
  запросов, позволяющая избежать излишней материализации данных. По причине общности
  подхода, модель можно применять и для других моделей данных. В [15] была предложена
  адаптация итеративной модели для исполнения XQuery -запросов. 
Принимая во внимание функциональную природу языка XQuery , можно относиться
  к итеративной модели, как к реализации ленивой ( lazy ) семантики.
  Если же относиться к XQuery и как к языку программирования общего назначения,
  который может применяться для выражения логики приложений, реализация только
  ленивой семантики может отрицательно сказаться на общей эффективности исполнителя.
  Для обеспечения реализации XQuery , достаточно эффективной при обработке и
  запросов, и логики приложений, в исполнителе СУБД Sedna сочетаются две модели
  исполнения. 
В исполнителе XQuery отслеживается объем обрабатываемых данных, и может происходить
автоматическое переключение из ленивого режима исполнения в строгий ( strict ) режим
(и наоборот) во время исполнения. Исполнение запроса в соответствии с имеющимся
планом запроса начинается в ленивом режиме. Накладные расходы ленивой модели
сильно коррелируют с числом вызовов функций, производимых в процессе исполнения.
Чем больше выполняется вызовов функций, тем больше производится копий тел этих
функций. Цель применяемого подхода состоит в нахождении компромисса между копированием
тел функций и материализацией результатов вызовов функций. В разработанном механизме
каждый вызов функции побуждает к переключению на строгую модель, если размеры
аргументов относительно невелики. И наоборот, наличие большой входной последовательности
любой физической операции является поводом для выполнения этой операции в ленивом
режиме.
содержание       назад       вперед