Analysis Services, Oracle и желание заказчиков

в 10:48, , рубрики: .net, oracle

В этой статье я хочу написать о том, как я пришел к использованию кубов на Microsoft Analysis Services и описать проблемы, которые пришлось решить для успешного их применения.

В компании, где я работаю, используют в качестве отчетной базы Oracle. В качестве основного средства отображения отчетов был выбран Microsoft Reporting Services 2008, интегрированный в Sharepoint 2010. При эксплуатации SSRS 2008 возникла проблема с отчетами, в которых агрегировали большие объемы данных и выводили их на экран в виде матрицы с группировками.
image
Такие отчеты строились очень медленно, и группы в них раскрывались так же не быстро. При выгрузке в эксель, с ними становилось невозможно работать, так как ждать, пока раскроется группа, приходилось очень долго. Пока я ломал голову, над решением этой задачи, руководство захотело увидеть отчеты в которых, произвольно можно было выбирать колонки для отображения, путем перетаскивания. Эта задача частично решалась в SSRS 2008, я добавил параметры, в зависимости от значения которых, показывалась та или иная колонка, но вопрос с перетаскиванием всё равно оставался открытым. Да и выглядело это не очень презентабельно, на мой взгляд.
В поисках решения поставленной задачи, я, случайно, наткнулся на Web компонент ASPxPivotGrid, компании DevExpress. Он позволял перетаскивать строки и колонки, настраивать фильтры и многое другое, получая на вход либо селект из Базы данных, либо куб из Analysis Services. Я настроил его на селект для своего отчета и продемонстрировал перетаскивание колонок начальству.
image
Задача была решена, но скорость работы этого решения оставляла желать лучшего, особенно момент инициализации. Тогда я заинтересовался нюансами его работы с Analysis Services и в качестве эксперимента решил создать куб. При попытке настроить источник данных в проекте Visual Studio 2008, возникла ошибка соединения с БД Oracle. Я разворачивал решение на 64-битном сервере под ОС Windows 2008 Server, а VS2008 была 32 битной.

Для корректной работы 32 битного и 64 битного провайдеров Oracle я сделал следующее:

  1. Скачал 32-битный и 64-битный драйвера Oracle c официального сайта.
  2. Поставил в отдельную папку Client32 Runtime.
  3. Перезагрузил компьютер.
  4. Поставил в отдельную папку Client64 Runtime.
  5. В реестре Windows в раздел HKEY_LOCAL_MACHINESOFTWAREWow6432NodeORACLE добавил значение
    TNS_ADMIN и задал ему путь к папке для Clinet32 — …networkadmin
  6. Перезагрузил компьютер

Про перезагрузку между установками хочу уточнить. Первый раз я установил оба компонента без перезагрузки между установками. В итоге, долго и мучительно удалял драйвера с сервера, предварительно потратив время на попытку их оживить. Поэтому перезагрузка в моем случае была обязательной.
Итак, ошибка была устранена.

Далее я стал создавать куб. Для куба таблицы фактов и таблицы измерений должны иметь топологию звезда. В измерениях не должно быть повторяющихся наборов значений. Если же они есть, то для таких значений нужно использовать составной ключ (поле KeyCloumns в свойствах сущности измерения). Примером повторяющегося значения может быть ул. Ленина в измерении Адрес, для различных городов. Чтобы куб не ругался, при сборке я сделал составной ключ Город + Улица для сущности Улица. Так же, если использовать строковые значения для KeyCloumns, по умолчанию над ними будет выполняться команда TrimRight, что в некоторых случаях, так же приводит к дубликатам.
В кубе я создал роли и назначил пользователям доступ, согласно их учетным записям в Active Directory. С доступом есть свои тонкости, я раздавал доступ следующим образом:
При разграничении доступа на закладке Cubes выставил Read, далее выбрал значения измерения в кубе, выбрал среди значений те, к которым роль имеет доступ, и, переключившись на закладку Advanced, включил галочку Enable Visual Totals, она по умолчанию отключена. Если её не включить, то в моем случае, в итогах по этому измерению отображался итог не только по тем измерениям, к котором роль имела доступ, но в него так же входили значения измерений к которым доступа не было.
Если количество строк в таблице фактов огромно, то факты в кубе можно бить на партиции и обновлять только последнюю. К сожалению, механизма для автоматического создания партиций в проекте Visual Studio для Analysis Services не предусмотрено, но можно написать программу, которая будет это делать, либо создать пакет на Microsoft Integration Services.

Возвращаясь к проблеме быстродействия отчета, по причине которого я создал куб, то после привязывания, созданного мною куба к ASPxPivotGrid, он стал работать намного быстрее. Помимо использования в качестве Data Source куба Analysis Services я, так же, для больших измерений в ASPxPivotGrid отключил сортировку значений, которая включена по умолчанию. Кроме отображения куба в Web, к нему можно обращаться через Excel. В организации используют Excel 2010. В Excel работать с кубом приятней, но с точки зрения удобства хранения списка кубов, и поиска нужного, Web, на мой взгляд, предпочтительней. На данный момент, в компании, где я работаю, активно используют оба перечисленных выше варианта.

Автор: alex_29

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js