Примеры двухмерного представления данных из многомерного куба +--------+----------+-------------+------------+ | |Украина |Молдова |Венгрия | +--------+----------+-------------+------------+ |Январь |20000<-- К-во прод. штук| | +--------+----------+-------------+------------+ |Февраль | | | | +--------+----------+-------------+------------+ |Март | | | | +--------+----------+-------------+------------+ Место продажи, время измер. /-----------------------------------\ +---------+----------+-------------+------------+ | |Украина |Молдова |Венгрия | +---------+----------+-------------+------------+ {|К-во штук|20000 | | | меры-{+---------+----------+-------------+------------+ {|Стоимость|450000 | | | +---------+----------+-------------+------------+ +---------+-------------------------------------+-------------------------------------+\ | | Янв. | Февр. || +---------+----------+-------------+------------+----------+-------------+------------+|2 измерения | |Украина |Молдова |Венгрия |Украина |Молдова |Венгрия || +---------+----------+-------------+------------+----------+-------------+------------+/ {|К-во штук|20000 | | | | | | меры-{+---------+----------+-------------+------------+----------+-------------+------------+ {|Стоимость|450000 | | | | | | +---------+----------+-------------+------------+----------+-------------+------------+ Операции, выполняемые над кубом: 1) срез (Slice'n'Dice): формируется подмножество многомерного массива данных, соответствующее одному значению измерения, не входящего в это подмножество; 2) вращение: изменение расположения измерений; 3) консолидация (roll-up) и детализация (drill-down): определяют переход от детального представления к агрегированному и наоборот; 4) слияние (drill-across): комбинирует кубы, имеющие одно или несколько общих измерений; 5) ранжирование: возвращает только те ячейки, которые находятся в верхней или нижней части упорядоченного определённым образом списка (например, 10 самых продаваемых продуктов). Агрегация данных в кубах Пусть у нас есть следующие фактические данные: +------+-----+-----+-------+ |Регион|Товар|Сезон|Продажа| +------+-----+-----+-------+ |Р1 |Книги|Весна| 9 | |Р1 |Еда |Осень| 3 | |Р2 |Книги|Осень| 6 | Т-ца с агрег. д-ми (Avg) +------+-----+-----+-------+ |Регион|Товар|Сезон|Продажа| +------+-----+-----+-------+ |Р1 |Книги|Весна| 9 | |Р1 |Еда |Ос | 3 | |Р2 |Книги|Ос | 6 | |Р1 |Книги|All | 9 | |All |Книги|Весна| 9 | | | ... | | | |Р2 |All |All | 6 | |All |Еда |All | 3 | |All |All |Весна| 9 | |All |All |All | 6 | Размер куба определяется формулой: (PI)^dv(i=1)(nvi+1), где d -- количество измерений, а nvi -- количество значений в соответствующем измерении Для каждого измерения можно задать одну или несколько агрегирующих функций. С т. з. сложности распараллеливания агрегирующие функции делятся на три типа: дистрибутивные функции (можно разбить входные данные, посчитать отдельные итоги и потом объединить эти итоги): sum, count, min, max; алгебраические функции (можно представить комбинацией из дистрибутивных функций): avg=sum/count; холистические функции (нельзя вычислять на частичных функций и никак нельзя представить): ранжирование. Виды запросов к кубам: 1) точечные кубы: возвращается агрегирующее значение меры в какой-либо ячейке куба, координаты которой задаются в запросе: select sum(Продажа) from ТаблицаФактов where Регион='Р1' and Сезон='Весна' and Товар='Книги'; 2) интервальные запросы: возвращают некоторый набор точек куба, удовлетворяющий заданным условиям: select регион,товар,Sum(Продажа) from ТаблицаФактов where (Регион='Р1' or Регион='Р2') and (Товар='Книги' or Товар='Еда') group by Регион,Товар; 3) обратные запросы (iceberg): возвращает все ячейки куба, удовлетворяющие ограничениям, наложенным на значения меры: select регион,товар,sum(Продажа) from ТаблицаФактов group by регион,товар having sum(Продажа)>10. При добавлении исходных данных в куб объём куба и время вычисления куба растут экспоненциально, т. к. нужно рассчитывать агрегаты по каждому измерению. Например, 10-мерный куб без иерархии внутри измерений по 100 значений для каждого измерения приведёт к созданию куба с 101^(20) степени ячеек. Даже если будет заполнена 0.000001 ячейка. Представление куба в виде графа >[all,all,all]< |детализация ^ / ^ \ | | [Регион,all,all] [All,Товар,All] [All,All,Сезон] | | ^ ^--\ /-^ ^-------\ ^ ^ | | | X X | | | [Регион,Товар,all] [Регион,All,Сезон]\[All,Товар,Сезон] | | ^ ^ ^ | | [Регион,Товар,Сезон] v консолидация| В данной структуре материализуется набор представлений, содержащих агрегированные данные, но не все могут быть материализованы. Поэтому отмечаем, что выбор кубов для материализации определяет будущую производительность системы. Степень агрегации куба определяется как (alpha)=a/(a*), где a -- количество реальных агрегированных значений, а a* -- максимальное количество агрегированных значений. Пусть есть 3 простых измерения для учёта объёма продаж товаров, т. е. мера -- число проданных единиц товара, а измерения -- продавец, товар и месяц продажи. ^oТ ||(2) ++-----------+ /|| /| / || / | / |v / | +---+--------+ | | <-+--------+(1)| | O--------+---+---->oP | / | / | / | / |/ |/ +------------+ / voП Пусть P, П и Т -- множества членов соответствующих измерений, соответственно, nvP=|P|, nvП=|П|, nvТ=|Т|; mvP, mvП, mvТ -- члены множества. Чтобы получить агрегированное значение в разрезе продавцов и месяцев, (1) нужно просуммировать исходные значения количества продаж по всем видам товаров для каждой комбинации (mvТ, mvП). (2) Количество агрегатов в разрезе одного измерения a*=nvPnvТ+nvPnvП+nvПnvТ+nvP+nvП+nvТ+1 Пусть у нас m измерений и у каждого свой порядковый номер i=1...m. Пусть Av(lv1...lvj...lvm) -- это множество агрегатов, где lvi=0, если по i-му измерению выполняется агрегирование. Av(11...1) Av(00...0) Упорядоченная последовательность lv1...lvj...lvm называется состоянием агрегации. Уровнем детализации называется сумма l=lv1+...+lvj+...lvm. Первый уровень детализации может получаться из разных состояний агрегации. av(lv1...lvi...lvm) -- это количество элементов во множестве A. Для трёхмерного куба, где oP i=1 oТ i=2 oП i=3 a*=av(110)+av(101)+av(001)+av(100)+av(001)+av(010)+av(000). av(lv1...lvi...lvm)=(PI)^mv(i=1)nvilvi a*=(SIGMA)^mv(k=1)(SIGMA)v(C^kvm)(PI)^(m-k)v(i=1)nvilvi Cvm^k -- количество вариантов размещения k нулей в m позициях a*=(PI)^mv(i=1)(nvi+1)-(PI)^mv(i=1)nvi