Введение в OLAP

Часть 8. Обзор MDX

Алексей Федоров, Наталия Елманова

Язык MDX

Использование языка MDX

   MDX Sample Application

   Функции языка 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