Оператор горизонта является объектом задачи оптимизации и вычисляет оптимум Парето для кортежей с несколькими измерениями.
Этот оператор является расширением SQL, предложенным Börzsönyi et al. [1] для фильтрации результатов из базы данных с целью сохранения только тех объектов, которые не хуже по нескольким измерениям, чем любые другие. Название skyline происходит от вида на Манхэттен с реки Гудзон , где видны те здания, которые не скрыты никакими другими. Здание видно, если оно не загорожено зданием, которое выше или ближе к реке (два измерения, расстояние до реки минимизировано, высота максимизирована). Другое применение оператора skyline включает выбор отеля для отпуска. Пользователь хочет, чтобы отель был и дешевым, и близко к пляжу. Однако отели, которые находятся близко к пляжу, также могут быть дорогими. В этом случае оператор skyline будет представлять только те отели, которые не хуже любого другого отеля как по цене, так и по расстоянию до пляжа.
Оператор skyline возвращает кортежи, которые не доминируются никаким другим кортежем. Кортеж доминирует над другим, если он по крайней мере так же хорош во всех измерениях и лучше по крайней мере в одном измерении. Формально мы можем думать о каждом кортеже как о векторе . доминирует (пишется: ), если по крайней мере так же хорош, как во всех измерениях, и превосходит по крайней мере в одном: [2] Доминирование ( ) можно определить как любое строгое частичное упорядочение , например больше (с и ) или меньше (с и ).
Предположив два измерения и определив доминирование в обоих измерениях как большее, мы можем вычислить линию горизонта в SQL-92 следующим образом:
WITH tuples ( id , i , j ) as ( values ( 1 , 1 , 1 ), ( 1 , 2 , 1 ), ( 1 , 1 , 2 )) SELECT * FROM tuples t1 WHERE NOT EXISTS ( -- который не доминируется SELECT * FROM tuples t2 -- кортеж, который WHERE t2 . i >= t1 . i и t2 . j >= t1 . j -- по крайней мере так же хорош во всех измерениях AND ( t2 . i > t1 . i или t2 . j > t1 . j ) -- и лучше по крайней мере в одном измерении );
В качестве расширения SQL Бёржёньи и др. [1] предложили следующий синтаксис для оператора skyline:
ВЫБРАТЬ ... ИЗ ... ГДЕ ... ГРУППИРОВАТЬ ПО ... ИМЕЮЩИМ ... ЛИНИЮ ГОРИЗОНТАЛЬНОГО ИЗОБРАЖЕНИЯ [ ОТЛИЧАЕТСЯ ] d1 [ МИН | МАКС | РАЗНИЦА ], ..., dm [ МИН | МАКС | РАЗНИЦА ] УПОРЯДОЧИТЬ ПО ...
где d 1 , ... d m обозначают размеры линии горизонта, а MIN, MAX и DIFF указывают, должно ли значение в этом измерении быть минимизировано, максимизировано или просто отличаться.
Без расширения SQL запрос SQL требует антисоединения с not exists
:
ВЫБЕРИТЕ ... ИЗ (...) q ГДЕ НЕ СУЩЕСТВУЕТ ( ВЫБЕРИТЕ * ИЗ (...) p ГДЕ p . d1 [ <= | >= ] q . d1 И ... И p . dm [ <= | >= ] q . dm И ( p . d1 [ < | > ] q . d1 ИЛИ ... ИЛИ p . dm [ < | > ] q . dm ))
Оператор skyline может быть реализован непосредственно в SQL с использованием текущих конструкций SQL, но было показано, что это очень медленно в дисковых системах баз данных. [1] Были предложены другие алгоритмы, которые используют разделяй и властвуй, индексы, [1] MapReduce [3] и вычисления общего назначения на графических картах . [4] Запросы skyline к потокам данных (т. е. непрерывные запросы skyline) были изучены в контексте параллельной обработки запросов на многоядерных процессорах из-за их широкого распространения в задачах принятия решений в реальном времени и потоковой аналитике данных. [5]
{{cite book}}
: CS1 maint: несколько имен: список авторов ( ссылка )