Классика баз данных - статьи

       

Графовая модель запросов в Starburst


Запросы внутри системы представляются в графовой модели (Query Graph Model, QGM). Задача QGM состоит в обеспечении более мощного и концептуально более управляемого представления запросов для уменьшения сложности компиляции и оптимизации запросов. В QGM поддерживаются произвольные операции над таблицами, операндами и результатами которых являются таблицы. Примерами операций являются SELECT, GROUP BY, UNION, INTERSECT и EXCEPT. Операция SELECT является частью Starburst SQL, обрабатывающей ограничение, проецирование и соединение.

Мы представляем граф QGM на примере. Предположим, что имеется следующий SQL-запрос: SELECT DISTINCT q1.partno, q1.descr, q2.suppno FROM inventory q1, quotations q2 WHERE q1.partno = q2.partno AND q1.descr='engine' AND q2.price ≤ ALL (SELECT q3.price FROM quotations q3 WHERE q2.partno=q3.partno);

Рис. 1. Пример QGM-графа

Этот запрос выдает информацию о поставщиках и деталях, для которых цена данного поставщика меньше, чем у всех других поставщиков. На рис. 1 показана QGM для этого запроса. Граф состоит из четырех блоков. Блоки 1 и 2 ассоциированы с базовыми таблицами inventory и quotations. Блок 3 является блоком SELECT, ассоциированным с основной частью запроса, и блок 4 – это блок SELECT, ассоциированный с подзапросом. У каждого блока имеется заголовок и тело. Заголовок описывает результирующую таблицу, производимую блоком, а тело специфицирует операцию, требуемую для вычисления результирующей таблицы. Можно считать, что для базовых таблиц имеются пустые блоки, или что блоки для них не существуют.

Исследуем блок 3. В заголовке указаны столбцы результата partno, descr и suppno в соответствии со списком выборки запроса. Спецификация этих столбцов включает имена столбцов, типы и информацию об упорядоченности результата. В заголовке имеется булевский атрибут, называемый distinct, который указывает, содержит ли соответствующая таблица только различные кортежи (head.distinct = TRUE), или в ней содержатся дубликаты (head.distinct = FALSE).



Содержание  Назад  Вперед