- •6.050103 - «Програмна інженерія»
- •Списокскорочень
- •Семестровий модуль 1 Змістовний модуль 1 Системи підтримки ухвалення рішення лекція №1 Введення в бізнес-інтелект
- •Питання для самоперевірки
- •Лекція №2 Поняття сховища даних
- •Питання для самоперевірки
- •Змістовний модуль 2 olap-системи лекція №3 Аналітичні (olap) системи
- •Питання для самоперевірки
- •Лекція №4 Архітектура сховища даних
- •Питання для самоперевірки
- •Змістовний модуль 3 Багатомірні куби Лекція №5 Багатомірний куб. Основні поняття
- •Питання для самоперевірки
- •Лекція №6 Ієрархії вимірів. Схеми кубу «зірка» та «сніжинка»
- •Питання для самоперевірки
- •Лекція №7 Агрегація даних у багатомірному кубі
- •Лекція №8 Агреговані значення для різних видів вимірів
- •Питання для самоперевірки
- •Семестровий модуль 2 Змістовний модуль 4 Підготовка даних для сд лекція №9 Витяг, перетворення й завантаження даних
- •Питання для самоперевірки
- •Лекція №10 Очищення даних
- •Питання для самоперевірки
- •Лекція №11 Очищення даних (продовження)
- •Питання для самоперевірки
- •Змістовний модуль 5 Мова багатомірних виражень mdх лекція №12 Мова багатомірних виражень mdx. Основні поняття
- •Питання для самоперевірки
- •Лекція №13 Мова багатомірних виражень mdx. Запит до кубу
- •Питання для самоперевірки
- •Лекція №14 Функції мови багатомірних виражень mdx
- •Ці запити повертають різні результати.
- •Питання для самоперевірки
- •Змістовний модуль 6 Проблеми побудови сд лекція №15 Ключові показники ефективності
- •Питання для самоперевірки
- •Список літератури
Питання для самоперевірки
Перелічите речення оператора SELECT.
У чому відмінність між однаковими реченнями мов SQL і MDX?
Чим відрізняються контекст запиту й контекст сеансу?
Як створюється іменована множина?
Що таке член, що обчислюється?
Методичні вказівки до лекції: [3, с. 165–180]; [8, с. 94–100].
Вправи
Напишіть запит до куба К, створеному у вправах до попередньої лекції, що формує двовимірну таблицю з виводом членів одного з вимірів.
Одержати результати запитів до куба, створеному у вправі 5 лекції №10. Продемонструвати наступні можливості MDX (для кожного випадку окремий запит):
простий запит, що повертає двовимірну таблицю, на одній осі виводяться члени виміру, на іншій – міри куба;
запит, що повертає тривимірний куб, з використанням конструкції Where;
застосування операцій з множинами Unіon, Іntersect або Except;
застосування операцій з множинами Crossjoіn;
створення й використання іменованих множин з областю дії запиту;
створення й використання елементів, які обчислюються, з областю дії запиту.
При необхідності відредагувати дані в СД, щоб мати можливість побачити результати запитів.
Лекція №14 Функції мови багатомірних виражень mdx
Розглядаються наступні питання:
категорії функцій;
функції для навігації в ієрархіях;
фільтрація даних;
сортування даних.
Із синтаксичної точки зору функції МDХ можна розділити на методи й властивості.
Методи мають наступний синтаксис:
<function_name> ([<parameter> [, <parameter>...])
Наприклад:
CROSSJOIN({[2010],[2011]},{[Україна],[РФ], [Молдова]}), [Час])
А властивості мають наступний синтаксис:
<object_name>.<property_name>[ (<parameter>[,<parameter>...]
Наприклад:
[Час].DefaultMember
Обидві ці різновиди функцій повертають значення одного з наступних типів: Dimension (Вимір), Hierarchy (Ієрархія), Level (Рівень), Member (Член), Tuple (Кортеж), Set (Множина) і Scalar (Скалярне значення), які, у свою чергу, можуть бути передані як параметри в інші функції
Функції для навігації в ієрархіях
Функція Members застосовується до ієрархій або до рівнів.
При застосуванні до ієрархії функція повертає набір всіх членів ієрархії, незалежно від рівня.
Приклад:
[Дата].[Ієрархія1].Members – повертає повний перелік всіх років, місяців і днів.
При застосуванні до рівня функція повертає набір всіх членів виміру, що перебувають на даному рівні.
Приклад: [Місце].[Ієрархія_Місце].[Міста].Members – повертає повний перелік всіх міст.
Функція AllMembers працює аналогічно функції Members, але Members повертає всі елементи ієрархії, крім тих, що обчислюються, а AllMembers повертає також і елементи, що обчислюються.
Для переміщення в межах одного рівня, використовуються функції PrevMember і NextMember:
[Дата].[2009].[Березень].NextMember – повертає квітень 2009 року,
[Дата].[2009].[Березень].PrevMember – повертає лютий 2009 року,
[Дата].[2009].[Березень].PrevMember.PrevMember – повертає січень 2009 року.
Для більш компактного запису застосовуються функції Lag(.) і Lеad(.):
[Дата].[2009].[Березень]. Lag(2) – повертає січень 2009 року,
[Дата].[2009].[Березень]. Lеad(5) – повертає серпень 2009 року,
[Дата].[2009].[Березень]. Lag(-1) – повертає квітень 2009 року.
Розглянемо приклад ієрархії Магазини (Stores) виміру Магазин (Store).
У цій ієрархії елемент ALL – батько (parent) елементів наступного рівня ієрархії: Україна, РФ і Молдова. Області Одеська, Київська й Херсонська є дочірніми (children) для Україна, і т.д. Області Одеська, Київська й Херсонська також є нащадками (descendants) елемента ALL, а ALL – це предок (ancestor) членів, що представляють області.
Для переміщення нагору й униз по рівнях використовуються функції Children і Parent:
[Дата].[2009].[Березень].Children – повертає всі дні березня,
[Дата].[2009].[Березень].Parent – повертає [Дата].[2009],
[Дата].[2009].[Березень].[25].Parent.Parent – повертає [Дата].[2009] .
Функція Children створює множину елементів, які є дочірніми стосовно заданого елемента
SELECT [Україна].Children ON COLUMNS FROM [MyCube]
-
Київська
Херсонська
Одеська
12345
3456
345678
Функція Descendants небагато складніше, але вона більш гнучка, чим функція Children. Вона використовується для одержання нащадків члена.
Наприклад, необхідно проаналізувати продажі магазинів, розташованих у різних містах України
SELECT DESCENDANTS([Україна],[Місто магазина]) ON COLUMNS
FROM [MyCube]
Функція Descendants повертає множину членів, які є нащадками заданого члена на заданому рівні ієрархії.
Щоб побачити листові елементи (leaf memebers) – елементи, у яких немає нащадків, що є нащадками елемента Україна, використовується ключове слово LEAVES.
SELECT DESCENDANTS([Магазин.[Країна магазина].[Україна], LEAVES)
on COLUMNS
FROM [MyCube]
МDХ підтримує цілий ряд функцій, які підпадають під категорію функцій для навігації по ієрархії, наприклад, FirstChild, LastChild, функції для роботи з елементами одного рівня, і т.д.
Функція Filter має два параметри: множина і вираження МDХ, що задає критерій і повертає значення типу Boolean. Для обчислення результату функції Filter сервер проходить множину, що була передана як перший параметр функції. Потім для кожного кортежу в множині обчислює вираження, передане як другий параметр. Якщо це вираження приймає значення True, кортеж включається в результуючу множину.
Наприклад, нехай потрібно визначити магазини, продажі в які знизилися в 2010 р., у порівнянні з 2009 р.
SELECT Filter([Магазин].members,
([Кількість продажів], [2010]) < ([Кількість продажів],[2009])) ON COLUMNS,
{[2009], [2010]} ON ROWS
FROM [MyCube]
WHERE [Кількість продажів]
Для виконання функції Filter сервер обчислює вираження фільтра ([Кількість продажів],[2010]) < ([Кількість продажів],[2009]). Це вираження містить тільки члени вимірів Measure і Час. Всі інші члени визначаються по кроках, описаних у визначенні контексту запиту: сервер спочатку встановлює в поточну координату члени за замовчуванням всіх атрибутів, а потім перезаписує їхніми членами вимірів, зазначеними в реченні WHERE. Потім сервер перезаписує члени, зазначені у вираженні критерію. І, нарешті, перезаписуються члени, зазначені у множині,яка фільтрується.
Інший приклад
SELECT Filter([Клієнт]. [Країна].members,
[Measures].[Кількість продажів].Value>1000) ON COLUMNS
FROM [MyCube]
WHERE ([Час].[Рік].[2009])
У цьому запиті фільтруються магазини в міру Кількість продажів. Нехай мережа магазинів спочатку була тільки в Україні; так що в 2009 р. всі продажі були тільки в Україні. Але в 2010 р. товари продавалися також у Росії й Молдові. Якби вираження Filter обчислювалося в контексті вираження, а не в контексті всього запиту, у результаті були б отримані всі три країни: Україна, РФ і Молдова. Для виміру Час використовується член за замовчуванням ALL. У запиті із приклада буде отримана тільки одна країна: Україна, тому що поточний контекст для виконання вираження включає члени, зазначені в реченні WHERE
-
Україна
22786
Тобто речення WHERE впливає на обчислення вираження критерію й на результат функції Filter.
Щоб краще зрозуміти правила обчислення контексту у функції фільтрації, розглянемо, що відбудеться, якщо виміри, використовувані у вираженні критерію, були б тими ж самими, що й у реченні WHERE. Допустимо, що в запиті вимір Measure існує й у речнні WHERE, і у вираженні критерію. При виконанні вираження критерію сервер буде використовувати міру Кількість продажів, але для обчислення значень комірок буде використана міра Сума продажів.
SELECT Filter([Клієнт].[Країна].members,
[Measures].[Кількість продажів].Value>1000) ON COLUMNS
FROM [MyCube]
WHERE ([Час].[Рік].[2009], [Measures].[Сума продажів])
Функція Order сортує кортежі в множині у відповідності зі значенням вираження, що передається як другий параметр.
Приклад. Відсортувати магазини за значеннями міри Сума продажів.
SELECT Order( [Магазин].members, [Measures].[Сума продажів], BDESC)
ON COLUMNS
FROM [MyCube]
У цьому операторі результуюча множина відсортована в порядку убування. Але при цьому зігнорована ієрархічність множини.
Розглянемо приклад, що показує сортування зі збереженням ієрархічності. Наприклад, треба проаналізувати продуктивність магазинів, але потрібно зробити це в контексті країни, у якій розташований магазин. Тому необхідно не просто відсортувати магазини, порівнюючи їхній один з одним. Спочатку потрібно відсортувати значення для країн, у яких розташовані магазини. Потім будуть відсортовані області, міста й тільки після всього цього – магазини. Тепер можна порівнювати значення продажів в одному магазині зі значеннями продажів в інших магазинах того ж самого міста. Ключове слово DESC у функції Order указує системі, що при упорядкуваннімножини в убутному порядку треба зберегти ієрархічність, визанчену користувальницькою ієрархією.
SELECT Order(([Магазин].[Країна магазина].members,
[Магазин].[Область магазина].members),
[Measures].[Сума продажів], DESC) ON COLUMNS
FROM [MyCube]
Україна |
Одеська |
Херсонська |
Київська |
Молдова |
РФ |
Московська |
Брянська |
… |
6 |
3 |
2 |
1 |
5 |
4 |
3 |
1 |
|
Результати цього запиту показують, що найбільше продажів було зроблено в Україні, і серед областей в Україні найбільше продажів в Одеській області, потім ідуть магазини в Херсонській області й потім – у Київській.
Невизначені члени
Члени виміру, використані в MDX-Запиті, можуть не існувати в кубі (наприклад, вони можуть бути задані неправильно). Комірки багатомірного простору теж можуть виявитися порожніми.
Наприклад, в MDX-вираженні використовується член, що перебуває поза границями куба. Це може відбутися, наприклад, коли запит вибирає батьківський елемент елемента, що перебуває на верхньому рівні ієрархії. Для обробки таких випадків уведена концепція невизначених членів (Null Members) і невизначених кортежів (Null tuples):
сервер використовує невизначений член для посилання на координату, що перебуває поза простором куба;
якщо кортеж містить хоча б один невизначений член, він називається невизначеним кортежем.
У деяких випадках використання невизначених членів і кортежів дозволено, в інших– приводить до повідомлення про помилку. Деякі функції МDХ повертають помилку, якщо як параметр передається невизначений член або кортеж.
Якщо множина не містить кортежів або містить тільки невизначені кортежі, воно називається порожньою множиною (empty set). Якщо множина містить як звичайні, так і невизначені кортежі, користувачеві вертаються тільки звичайні кортежі. Наприклад, наступний запит поверне тільки один кортеж:
SELECT {[All], [All].Parent} ON COLUMNS
FROM [MyCube]
-
All
22786
Режим відсутності члена
В Analysis Services 2000 при посиланні на член по імені, що не відповідає ніякому елементу в кубі, видавалася помилка, що приводило до проблем у деяких клієнтських застосуаннях. Наприклад, клієнтські затосувння зберігають текст запитів МDХ, які використовувалися для формування звітів. Згодом, якщо члени видалялися із системи, запити, що посилаються на вилучені елементи, переставали працювати, і звіти переставали відкриватися. Analysis Services 2005 представлена нова можливість – Режим Відсутності члена (Missing Member Mode).
Цей режим дозволяє запиту або вираженню МDХ посилатися на члени, які не існують у кубі. Система перетворить такі члени в невизначені.
Наприклад, якщо потрібно вибрати деяких покупців, можна написати наступний запит SQL
SELECT Прізвище, Ім'я, По батькові, Посада
FROM Клієнт
WHERE Прізвище = 'Іванов' or Прізвище ='Петров'
Якщо в базі даних не існує покупця на прізвище Петров, запит поверне тільки один запис для клієнта Іванов і не викличе помилку.
Аналогічний МDХ-запит
SELECT {[Клієнт].[Іванов],[ Клієнт].[Петров]} ON COLUMNS
FROM [MyCube]
В Analysis Services 2000 відсутність елемента Петров у базі даних привело б до помилки. Analysis Services 2005 у режимі відсутності елемента виконає запит успішно й поверне результат зі значенням тільки для покупця Іванов.
-
Іванов
22786
Режим відсутності члена може бути включений і виключений у рамках виміру. Деякі виміри більш гнучкі, і дані в них міняються частіше, чим в інших. Наприклад, вимір покупців буде часто мінятися, а вимір часу, наприклад, досить постійно.
Для керування режимом відсутності члена вимір має властивість Режим Відсутності члена (MdxMissingMemberMode), що може бути встановлена в стан Помилки (Error) або Ігнорувати Помилку (IgnoreError). За замовчуванням режим відсутності члена встановлений в Ігнорувати Помилку (IgnoreError).
Режим відсутності елемента не поширюється на імена вимірів, і неправильно зазначене ім'я виміру приведе до помилки.
Кортежі, автоматична перевірка існування
Відомо, що простір куба визначається елементами ієрархій атрибутів. Але в дійсності багатомірний простір обмежений. Існують комбінації елементів з різних ієрархій членів вимірів, які просто не існують у таблиці виміру або в кубі. Наприклад, покупець Ірина Петрова – Жінка, і в таблиці виміру Покупець існує запис Ірина Петрова, Ж. Це значить, що кортеж ([Клієнт].[Стать].[Ж], [Ірина Петрова]) існує у вимірі Клієнт. Чоловіка з ім'ям Ірина Петрова у вимірі не задано, тому кортеж ([Клієнт].[Стать].[M], [Ірина Петрова]) не існує. Коли вираження МDХ посилається на кортеж, що не існує у вимірі, то система перетворить його до невизначеного кортежу. Наприклад, наступний запит поверне порожній результат:
SELECT {([Клієнт].[Стать].[M], [Ірина Петрова]) } on COLUMNS
FROM [MyCube]
Результатом виконання вираження МDХ не може бути неіснуючий кортеж. Тому система видаляє неіснуючі кортежі з результуючої множини спеціальною операцією, називаної автоматична перевірка існування (Auto-Exists). Результати застосування системою операції Auto-Exists можна побачити при виконанні наступної функції Crossjoin. Якщо множини, що беруть участь у функції Crossjoin, належать тому самому виміру, неіснуючі кортежі видаляються. Наприклад, якщо взяти множину із двох покупців –Ірина Петрова (жінка) і Василь Іванов (чоловік) – і використовувати функцію Crossjoin для об'єднання цієї множини з множиною, що складається з одного елемента, [Клієнт].[Стать].[M], що результуючамножина не буде містити повне перехресне з'єднання ([Ірина Петрова], [M]), ([Василь Іванов], [M]), а тільки один кортеж ([Василь Іванов, [M]).
SELECT { [Ірина Петрова], [Василь Іванов] } * [Клієнт].[Стать].[M] on COLUMNS
FROM [MyCube]
WHERE [Measures].[Кількість продажів]
-
Іванов
М
44
Сервер не виконує Auto-Exists між осями, але Auto-Exists виконується для множин, спроектованих на осі, з множиною, заданою в реченні WHERE. Наприклад, якщо помістити множину {[Ірина Петрова], [Василь Іванов]} на вісь, але елемент [Клієнт].[Стать].[M] у речення WHERE – кортеж [Ірина Петрова] буде вилучений з множини, спроектованої на вісь COLUMNS.
SELECT { [Ірина Петрова], [Василь Іванов] } ON COLUMNS
FROM [MyCube]
WHERE ([Measures].[ Кількість продажів],[Клієнт].[Стать].[M])
-
Іванов
44
Для того щоб визначити, які елементи існують із іншими елементами, на додаток до операції Auto-Exists, можна використовувати МDХ-Функцію Exists, уведену в Analysis Services 2005. Функція Exists приймає як параметри дві множини й повертає множину кортежів з першої множини, які існують хоча б для кортежу із другої множини. Наприклад,
SELECT Exists({[Ірина Петрова], [Василь Іванов]}, [Клієнт].[Стать].[M]) ON COLUMNS
FROM [MyCube]
WHERE [Measures].[Кількість продажів]
Приклад. Одержати відомості про продажі для покупців, які працюють менеджерами.
SELECT [Measures].[ Кількість продажів] on COLUMNS,
Exists([Клієнт].members,
[Клієнт].[Посада].[Менеджер]) ON ROWS
FROM [MyCube]
Невизначені значення й порожні комірки
Логічний простір куба, до якого можна звертатися із запиту МDХ, є дуже великим. Воно включає комбінації всіх елементів всіх ієрархій, незалежно від того, чи існують які-небудь дані для цих комбінацій.
Нехай організація почала працювати в Україні, а потім розширила своє діяльність на РФ і Молдову. Тому в 2009 р. продажі були тільки в магазинах в Україні, так що в багатомірному просторі не існує даних про продажі в РФ і Молдові. Нехай є запит для одержання інформації про продажі в 2009 р. і про посади покупців, які зробили покупки в магазинах різних країн:
SELECT [Клієнт].[Посада].members ON COLUMNS,
[Магазин]. [Країна магазина].members ON ROWS
FROM [MyCube]
where ([Measures].[Сума продажів],[Час].[Рік].[2009])
|
Директор |
Фахівець |
Менеджер |
|
Молдова |
(null) |
(null) |
(null) |
|
РФ |
(null) |
(null) |
(null) |
… |
Україна |
345 |
567 |
891 |
|
Не визначена |
(null) |
(null) |
(null) |
|
Для видалення подібних координат з результуючого багатомірного простору можна використовувати оператор NON EMPTY.
SELECT [Клієнт].[Посада].members ON COLUMNS,
NON EMPTY [Магазин].[Країна магазина].members ON ROWS
FROM [MyCube]
WHERE ([Measures].[Сума продажів],[Час].[Рік].[2009])
|
Директор |
Фахівець |
Менеджер |
|
Україна |
345 |
567 |
891 |
|
Однак навіть якщо використовується оператор NON EMPTY, результати запиту однаково можуть містити порожні комірки, тому що оператор NON EMPTY видаляє кортежі з множини, спроектованої на вісь, для яких всі комірки порожні.
Оператор NON EMPTY діє на верхньому рівні запиту. Це означає, що спочатку генеруються множини, що визначають осі, а потім видаляються кортежі, що приводять до порожніх комірок. Існують випадки, коли продуктивність застосування буде значно вище, якщо порожні кортежі були б вилучені раніше в логіці виконання запиту.
Якщо запит МDХ використовує функцію Filter для фільтрації дуже великої множини, на підставі вираження, що містить значення кортежу, і простір куба дуже розріджений, було б ефективніше видалити всі кортежі, що створюють порожні комірки, перед тим, як виконувати фільтрацію. МDХ надає функцію NonEmpty, що дозволяє видаляти такі кортежі з множини.
Наприклад, необхідно одержати всіх покупців з усіма магазинами, у яких покупець купив більше 10 одиниць товару. Для цього можна написати наступний запит:
SELECT Filter([Клієнт].members * [Магазин].[Країна магазина].members,
[Measures].[Кількість продажів] >10) ON COLUMNS
FROM [MyCube]
WHERE [Measures].[ Кількість продажів]
Перехресне з'єднання всіх клієнтів з усіма магазинами дає досить великумножину, але множина, що відповідає реальним покупкам у магазині, значно менше. Тому можна використовувати функцію NonEmpty для оптимізації цього запиту, так що вона видалить порожні кортежі до фільтрації множини:
SELECT Filter(NonEmpty([Клієнт]..members * [Магазин].[Країна Магазина],
[Measures].[Кількість продажів]), [Measures].[Кількість продажів]>10) ON COLUMNS
FROM [MyCube]
WHERE [Measures].[ Кількість продажів]
На перший погляд, функція NonEmpty і оператор NON EMPTY роблять те саме, але виконуються вони в різних контекстах. Запити, які виглядають схоже, можуть повертати різні результати. Нехай є два запити, один з функцією NonEmpty, інший– з оператором NON EMPTY:
SELECT [Час].[Рік].[2009] ON COLUMNS,
NONEMPTY ([Магазин].[Країна магазина].members) ON ROWS
FROM [MyCube]
и
SELECT [Час].[Рік].[2009] ON COLUMNS,
NON EMPTY [Магазин].[Країна магазина].members ON ROWS
FROM [MyCube]
