Как Отобразить 350 Миллионов Строк Из Базы Данных В Веб-Форме

Название этой статьи представляет собой краткое изложение того, что просил клиент. Я в это время был в отпуске, и мой менеджер, не вдаваясь в подробности, дал добро на реализацию.

Хорошо отдохнув и отправившись на работу, я почувствовал себя на месте ёжика, попавшего в туман в одном известном мультфильме.

И ситуация требовала Волшебника Изумрудного города.

Итак, все по порядку:



Постановка

Заказчиком выступил отдел по борьбе с проблемной задолженностью.

Для успешного решения своих проблем им нужно было

  1. Отслеживайте историю проблемного кредита: смотрите, когда по нему возникла просрочка и как она была погашена.

    Также проверьте, есть ли у заемщика, имеющего просрочку, другие кредиты.

  2. Получайте информацию о кредитном портфеле, отслеживайте тенденции и изменения портфеля за любой произвольный период.
  3. Возможность «провалиться» по агрегированным показателям, таким как «Дата выдачи кредита», «Регион выдачи», «Просроченные кредиты» и т.д. непосредственно к самим кредитным договорам.

  4. Контролируйте работу кредитных менеджеров: проверяйте, насколько успешно они выдают кредиты.

Заказчики наверняка видели решение в виде веб-формы, это объяснялось тем, что отдел был головным, а его подразделения располагались в разных городах нашей необъятной Родины и все сотрудники должны были видеть одну и ту же картинку, дифференцированную.

по правам доступа.

Задача немного облегчалась тем, что ежедневный обзор кредитного портфеля требовался только за последние три месяца.

Более поздняя информация должна была быть в первый день каждого прошедшего месяца.

Помимо этого условия, была еще одна проблема: под кредитом подразумевались все виды кредитования, включая кредитные карты, которые хранились отдельно и различались по размерам.



Решение

На момент внедрения в базе данных Oracle существовал репозиторий, в котором хранилась вся информация по картам и кредитам, в том виде, в котором она поступала туда из оперативных источников.

Информация пришла с задержкой в 1 день.

В среднем каждый день появлялось 3 миллиона новых записей, часть из которых была кредитами, часть картами.

Для решения этой задачи был выбран следующий алгоритм:

  1. Была построена витрина данных, объединившая кредиты и карты.

    Витрина построена по схеме «Звезда».

  2. Каждый вчерашний день добавлялся в него с помощью планировщика задач.

  3. Для расчета агрегатов был создан куб OLAP.
  4. После завершения обновления витрины было запущено обновление куба OLAP.
  5. OLAP предоставил данные в веб-форму через средство просмотра OLAP.
Помимо реализации алгоритма, необходимо было минимизировать или устранить все риски и препятствия, которые могли свести на нет работу этой системы.



Подготовительная работа:

  1. В витрине был создан общий ключ для объединения кредитов и карт, который однозначно идентифицировал и кредит, и карту.

    Ключ хранился в таблице, каждая строка которой однозначно идентифицировала либо кредит, либо карту.

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

    Это делалось на случай каких-либо изменений или ошибок в базе данных «Вчера».

    Возникла ситуация, когда информация по кредитам и картам появляется в базе с некоторой задержкой, и нам пришлось с ней бороться.

    Проверялись последние 15 дней со вчерашнего дня.

  3. Куб был создан для возможностей веб-приложения.

    Всего кредитов и карт было около 3 миллионов, и отобразить их все в браузере сразу было либо очень сложно, либо невозможно.

    Для решения этой проблемы помимо стандартного разделения кредитов и карт по дате открытия, региону привязки, менеджеру-эмитенту и т.д. были придуманы дополнительные измерения.

    В описанном случае градации кредитов были добавлены по Сумме, по Сумме просрочки, по количеству дней просрочки и по тому, был ли кредит хотя бы один раз просрочен.

    Также были построены иерархии типа год-квартал-месяц-день по дате открытия и закрытия кредита.

    В итоге все кредиты были объединены в группы, самая крупная из которых составляла не более 10 000 строк.

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

    Доступ к ним был ограничен Просмотрщиком и мог быть открыт в любой момент. В текущей версии пользователь видел только информацию, агрегированную по стандартным измерениям.

    Но часть этих кредитов еще можно было увидеть - это были кредиты от должника, у которого просрочен был только один кредит, но несколько были взяты.

  4. Обновление куба должно было начаться сразу после обновления витрины.

    Для этого был создан сервис, проверяющий состояние планировщика задач Oracle. Для него также была написана утилита, с помощью которой можно было срочно запустить/прервать обновление куба или отслеживать текущий статус.

  5. Необходимо было найти OLAP Viewer, который мог бы обеспечить весь необходимый функционал, нормальный внешний вид и гибкость настроек.

    Задача эта была непростой: потому что.

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

    Даже с той, что нашлась, пришлось помучиться.

Фактическая реализация основывалась на знаниях и технологиях, которыми я владел на тот момент, а также на политике компании в области программного обеспечения.

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



Выполнение:

Система развернута на Windows Server 2008 64-бит, веб-форма развернута на IIS, технология ASP.NET.
  1. Витрина данных — база данных Oracle
  2. Планировщик заданий — база данных Oracle
  3. Куб OLAP — службы Microsoft Analysis Services
  4. Отслеживание обновлений витрины и запуск обновлений куба — Служба Windows
  5. Средство просмотра OLAP — DevExpres AspxPivotGrid
Немного о технических тонкостях и хитростях, которые использовались при разработке этой системы.



Технические хитрости:

  • 1. Для корректной работы 32-битных и 64-битных провайдеров Oracle под Windows:
    1. Загрузите 32-битные и 64-битные драйверы Oracle с официального сайта.

    2. Поместите Client32 Runtime в отдельную папку.

    3. Чтобы перезагрузить компьютер.

    4. Поместите Client64 Runtime в отдельную папку.

    5. В реестре Windows в разделе KEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ORACLE добавьте значение TNS_ADMIN и установите его в путь к папке для Clinet32 — .

      \network\admin.

    6. Чтобы перезагрузить компьютер
  • При ограничении доступа в кубе Analysis Services на вкладке Кубы необходимо установить Чтение, затем выбрать значения измерений в кубе, выбрать среди них те, к которым роль имеет доступ, и, переключившись на вкладку Дополнительно, установите флажок Включить визуальные итоги, по умолчанию он отключен.

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

  • Для больших размеров в ASPxPivotGrid необходимо отключить сортировку по умолчанию.



О важном!

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

Прежде чем внедрить OLAP, мое руководство в поисках «золотой пули» рассмотрело множество пакетных решений, как от крупных производителей, так и от небольших компаний.

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

Возможно, компания, где я работаю, искала не там, где есть такая «золотая» или хотя бы «серебряная» пуля.

Но что случилось, то случилось.

С другой стороны, эта статья может кого-то остановить от изобретения «велосипедов» в виде построения дополнительных агрегированных таблиц, каких-то сложных архитектур и громоздких веб-сайтов.

Но ведь столько людей и столько мнений, и на этот счет мне нравится выдуманная история с изобретением шариковой ручки: НАСА потратило миллионы долларов на изобретение ручки, которая могла бы писать в невесомости.

Русские просто писали карандашом.

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

Спасибо всем, кто смог прочитать всё, что я написал выше! Теги: #web #.

NET #службы анализа #olap #oracle #pivot #oracle #.

NET #Microsoft SQL Server

Вместе с данным постом часто просматривают: