Введение в OLAP
Часть 8. Обзор MDX
Предыдущая часть данной статьи (КомпьютерПресс № 10’2001) была посвящена просмотру OLAP-данных с помощью компонента PivotTable List. Как вы помните, данный элемент управления ActiveX входит в состав Microsoft Office Web Components и позволяет создавать сводные таблицы, просматривать сечения OLAP-кубов, а также строить простейшие сечения многомерных кубов. Однако запросы к кубам не всегда могут быть представлены в виде простейших сечений.
На практике нередко требуется получить сведения о конкретном подмножестве данных (например, узнать о заказах только в одной стране или сравнить данные о продажах только в конкретном месяце, но в разные годы) и отобразить не просто суммарные значения, а какие-то другие статистические данные (например, среднеквадратичное отклонение). Далеко не всегда подобные срезы данных можно получить, просто манипулируя имеющимся кубом в рассмотренных нами OLAP-клиентах (равно как не всегда можно получить нужные сведения из реляционной базы данных, просто обратившись к одной таблице с помощью простейшей утилиты просмотра данных).
Практически во всех промышленных OLAP-средствах, включая и Analysis Services, для получения нестандартных срезов данных требуется отдельный непроцедурный язык для формулирования запросов к многомерным базам данных. Одному из таких языков, MDX, посвящена данная статья.
Язык MDX
Назначение языка MDX (Multidimensional Expressions) — предоставить в распоряжение разработчиков средство для более простого и эффективного доступа к многомерным структурам данных. В Microsoft SQL Server 2000 Analysis Services язык MDX используется для формирования запросов и описания алгоритмов получения вычисляемых значений.
Следует сказать, что язык MDX никак не связан с Microsoft SQL Server 2000 Analysis Services, а является частью спецификации OLE DB for OLAP и, таким образом, поддерживается на уровне провайдера доступа к данным (OLE DB-провайдера), а не самого OLAP-хранилища. Этот язык можно сравнить с языком SQL. Но если SQL используется для извлечения реляционных данных, то MDX служит для извлечения многомерных данных. Естественно, что, как и в случае с языком SQL, возможны некоторые отклонения от стандарта. В этой статье мы рассмотрим язык MDX применительно к Microsoft SQL Server 2000 Analysis Services.
Использование языка MDX
MDX Sample Application
Для выполнения запросов на языке MDX мы будем использовать утилиту MDX Sample Application, входящую в состав Microsoft SQL Server 2000 Analysis Services. При запуске этой утилиты появляется диалоговая панель Connect, в которой следует указать имя сервера (имя компьютера, на котором установлен Microsoft SQL Server 2000 Analysis Services) и тип провайдера для связи с этим сервером — в нашем примере это будет MSOLAP.
После этого можно нажать кнопку OК. Нажатие кнопки Cancel отменяет данную диалоговую панель — в этом случае для связи с сервером следует воспользоваться командой Connect из меню File.
После соединения с сервером можно начинать создание MDX-запросов к многомерной базе данных и их выполнение. Часто бывает полезно знать структуру куба, к которому вы собираетесь обратиться. Утилита MDX Sample Application позволяет просматривать метаданные куба. Для этого необходимо выбрать интересующий вас куб в списке Cube и изучить его размерности и меры в древовидном представлении содержимого куба.
Верхняя панель утилиты MDX Sample Application предназначена для задания MDX-запросов. Мы можем либо выбрать один из предопределенных запросов (список Query), либо создать собственный. По умолчанию утилита использует запросы, находящиеся в файле MDXQuery.mdx, расположенном в папке MDXSample. Для загрузки другого файла или сохранения текущего используются команды меню File.
Можно вводить MDX-команды непосредственно в панели запросов или конструировать запрос, перетаскивая измерения и меры куба в панель запросов. Помимо этого можно использовать примеры функций из панели Syntax Examples. В этом случае в панель переносится копия примера, в котором следует изменить аргументы функций и разделители на нужные значения.
Выполнить запрос можно одним из трех способов:
- выбрав команду Run в меню Query;
- нажав клавиши F5;
- нажав кнопку Run Query на панели инструментов.
Результат выполнения запроса отображается в нижней части экрана или, если выбрана опция View | Results, во весь экран.
Отметим, что MDX Sample Application не выполняет проверку корректности введенного MDX-запроса перед отсылкой его серверу на обработку.
Теперь вы готовы приступить к изучению языка MDX. Этой теме будет посвящена следующая часть данной статьи. В качестве исходных данных для выполнения примеров мы воспользуемся многомерной базой данных FoodMart, входящей в комплект поставки Microsoft SQL Server Analysis Services.
Синтаксис языка MDX
Запрос на языке MDX представляет собой набор команд, который выглядит следующим образом:
SELECT [<axis_specification> [, <axis_specification>...]] FROM [<cube_specification>] [WHERE [<slicer_specification>]]
где:
- axis_specification — содержит описание осей куба;
- cube_specification — содержит название куба;
- slicer_specification — содержит описание срезов куба.
В языке MDX выражение SELECT используется для задания набора данных, содержащего подмножество многомерных данных. Простейший SELECT-запрос может выглядеть так:
SELECT FROM Sales
В этом примере мы получили общее число продаж (Unit Sales) для всего куба. Поскольку в запросе мы не указали имена членов измерений, были выбраны члены по умолчанию из каждого измерения. Наш запрос эквивалентен следующему:
SELECT {([Measures].[Unit Sales])} ON COLUMNS FROM SALES
Более полный SELECT-запрос должен содержать следующую информацию:
- число осей (в одном запросе можно указать до 128 осей);
- список членов измерения, которые должны быть включены для каждой оси;
- имя куба, к которому производится запрос;
- список членов среза.
Рассмотрим более сложный пример, который позволит нам разобраться с различными элементами MDX-запроса:
SELECT { [Measures].[Unit Sales], [Measures].[Store Sales] } ON COLUMNS, { [Time].[1997], [Time].[1998] } ON ROWS FROM Sales WHERE ( [Store].[USA].[CA] )
SELECT определяет используемые оси. В нашем примере их две: одна — задает значения для колонок, другая — для рядов:
{ [Measures].[Unit Sales], [Measures].[Store Sales] } ON COLUMNS, { [Time].[1997], [Time].[1998] } ON ROWS
Выражение FROM определяет источник многомерных данных, к которому обращен наш запрос. В данном примере — это куб Sales.
Выражение WHERE задает размерности или члены, используемые в качестве среза. В нашем примере мы ограничили данные размерностью Store.
Рассмотрим еще несколько запросов. В первом запросе мы получаем данные по продажам всех товаров для всех лет:
SELECT[Product].[Product Category].Members ON COLUMNS FROM Sales
Данные для целого года (1997):
SELECT[Product].[Product Category].Members ON COLUMNS, {[Time].[1997]} ON ROWS FROM Sales
Данные по кварталам:
SELECT {([Measures].[Unit Sales])} ON COLUMNS, {[Time].[Quarter].Members} ON ROWS FROM Sales
Данные для первого квартала:
SELECT {([Measures].[Unit Sales])} ON COLUMNS, {[Time].[1997].[Q1]} ON ROWS FROM Sales
Данные для первого месяца первого квартала:
SELECT {([Measures].[Unit Sales])} ON COLUMNS, {[Time].[1997].[Q1].[1]} ON ROWS FROM Sales
Продажи для всех клиентов в США:
SELECT {([Measures].[Unit Sales])} ON COLUMNS, {[Customers].[All Customers].[USA]} ON ROWS FROM Sales
Продажи для всех клиентов в штате Калифорния:
SELECT {([Measures].[Unit Sales])} ON COLUMNS, {[Customers].[All Customers].[USA].[CA]} ON ROWS FROM Sales
Продажи товаров по категориям для всех клиентов в штате Калифорния:
SELECT {([Measures].[Unit Sales])} ON COLUMNS, {[Product].[Product Family].Members} ON ROWS FROM Sales WHERE [Customers].[All Customers].[USA].[CA]
Продажи товаров по категориям для всех клиентов в штате Калифорния в первом квартале 1997 года:
SELECT {([Measures].[Unit Sales])} ON COLUMNS, {[Product].[Product Family].Members} ON ROWS FROM Sales WHERE ([Customers].[All Customers].[USA].[CA], [Time].[1997].[Q1])
Продажи морепродуктов для всех клиентов в штате Калифорния в первом квартале 1997 года:
SELECT {([Measures].[Unit Sales])} ON COLUMNS, {[Product].[Product Department].[Seafood]} ON ROWS FROM Sales WHERE ([Customers].[All Customers].[USA].[CA], [Time].[1997].[Q1])
Функции языка MDX
Функции, реализованные в языке MDX, разделяются на несколько групп, как показано в таблице.
Кроме того, перечисленные функции языка MDX могут использоваться при вычислении различных выражений, в том числе при создании вычисляемых измерений. Кроме того, при необходимости для применения в MDX можно создавать функции, определенные пользователем (User Defined Functions, UDF), с помощью средств разработки, поддерживающих создание COM DLL.
Более подробные сведения о синтаксисе этого языка вы можете найти в Microsoft SQL Server Books Online, а примеры его практического применения — в статье «Введение в MDX», опубликованной в этом номере журнала.
В следующей части статьи мы рассмотрим создание OLAP-клиентов, использующих для доступа к многомерным данным механизмы ADO и ADOMD.
КомпьютерПресс 11'2001