SAS

SAS Banking Intelligence Solution: особенности внедрения в России

Для банковского сегмента SAS предлагает Banking Intelligence Solution, в рамках которого специалистами внедрения предполагается создание и последующее наполнение хранилища детальных данных – BIS DDS (Detailed Data Storage), рекомендованная схема которого создана по стандартам Basel 1,2,3, то есть отвечает общемировой схеме банковского бизнеса, которая порядком отличается от российской, где очень серьезная часть отводится учету бухгалтерских операций. На такой случай SAS предлагает унифицированный подход к кастомизации хранилища.

Западная модель банковского бизнеса вращается вокруг прочнейшей связки “Клиент” и “Сделка” (Account). Под этим словом никоим образом не понимается привычное российским разработчикам понятие банковского счета. Это именно сделка. Которой присущ определенный риск, и, в конечном счете, вся отчетность западных банков должна отражать именно риск его банкротства.

Итак, в основу угла кладется сделка с клиентом. Сделка, которая может относиться к депозитам, кредитам, страховому бизнесу (которым на западе занимаются именно банки, в то время как в России узаконено разделение кредитных и страховых компаний) и т.д. Так возникает связка “Сделка” и “Продукт” (типичный пример – депозитный вклад “Пенсионер Плюс”). В свою очередь клиенты делятся на сегменты. И так далее… Полная схема хранилища BIS DDS включает более 700 таблиц, и если постараться, можно найти в ней таблицы и связки, подходящие в случае конкретного внедрения. Так, например, совсем недавно мы приступили к внедрению банковского измерения “Блок” (ДКМСБ, VIP, Private, Investment, Корпоративный блок и т.п.). После некоторого анализа обнаружили в предлагаемой схеме таблицу BUSINESS_LINE и ее историзированные связки с таблицами ORGANIZATION_UNIT и FINANCIAL_PRODUCT. После дополнительной кастомизации с данной таблицей будут связаны и таблица сделок и отдельные проводки.

Вот и дошла очередь поговорить о проводках как об основе российских стандартов учета. В западной модели места для них не нашлось, но наши специалисты отмечают, что при каждом внедрении SAS BIS в российском банке требуется создавать и поддерживать механизм отслеживания изменений в полной таблице банковских проводок, куда могут входить односторонние, двусторонние и даже трехсторонние (с учетом курсовой разницы) проводки. Кстати, для кросс-курсов валют по какой-то причине таблицы в BIS DDS не обнаружилось, но когда это обсуждалось на нашем семинаре, я как раз пропустил объяснение возможных причин отсутствия наинужнейшей в любой финансовой аналитике таблицы CURRENCY_RATE.

Собственно, почему и зачем следует придерживаться стандартов SAS? Дело в том, что при соответствии банковского хранилища установленной схеме или незначительной кастомизации гораздо легче переходить с версии на версию, и, что самое главное, поверх BIS DDS может быть установлен один из других серийных продуктов SAS для банковской сферы, например, кредитный скоринг, решения FM (финансовая аналитика, корректировки и трансформация отчетности, линии прогнозирования и т.д.) и SPM (всевозможное планирование и отчетность по соблюдению KPI) и некоторые другие.

Теперь что касается механизма работы и стратегии внедрения. Тут вся изюминка в том, что никаких ручных модификаций какой-либо информации сделать нельзя, разве что это специально оговорено в виде формата изменения поставляемых Банком справочников типовых измерений. Специалисты и аналитики SAS должны лишь обеспечить технологическую цепочку импорта данных из систем-источников (обычно OLTP-системы), их унификации, объединения, проверки целостности и окончательной загрузки в хранилище DDS. Как поступить с полученной информацией в дальнейшем – дело вкуса Заказчика, но менять ее невозможно. Зато можно и нужно эффективно использовать! Как правило, создаются масштабные кубы (многомерные таблицы) и их детальные данные, которые в дальнейшем используются OLAP-сервером и доступны для анализа аналитиками банка через обычный браузер с поддержкой Java. Но, что также было отмечено на нашем семинаре, хранилище SAS BIS может быть использовано и как промежуточная ступень, как система-источник информации для других банковских систем. Так, в нашем конкретном случае по информации, каждодневно загружаемой и обновляемой в хранилище, формируется выходной файл с коллекторской информацией о должниках и их просрочках платежей. Кроме того, как правило, параллельно внедрению хранилища стартует и проект Data Quality, ориентированный на автоматическую проверку корректности данных в хранилище. Например, узнать, у каких клиентов не заполнен адрес или что-то в таком духе.

Сложностей во внедрении хватает. Полной цепочке загрузки соответствуют мегабайты кода и макросов. Но на удивление все работает достаточно быстро, в основном, за счет полного отсутствия транзакционности в таблицах SAS. Плюс уникальная работа с датастепами, в которых за один шаг обрабатывается одна запись таблицы и которую на этом шаге можно как угодно обработать в зависимости от информации в записи. Наличествует в SAS и поддержка SQL-механизмов, которые порой оправдывают себя на небольших (до миллиона записей) таблицах. Но, несмотря на то, что мне и другим разработчикам первое время очень хотелось написать быстренький и понятненький SELECT, в реальности всегда оказывается, что оптимизированный датастеп работает быстрее, хоть на его разработку и уходит гораздо больше времени.

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

Ну и напоследок несколько других занятных фактов. В практике внедрения SAS в России встречались случаи, когда для успешного внедрения приходилось менять стандарты ведения бизнеса Банка. Объем хранилища с информацией по кредитным продуктам конкретно нашего банка за два года работы – порядка 300 Гигабайт. Основные затыки в производительности SAS всегда связаны с работой дисковой подсистемы, а существующее ограничение по размеру используемой оперативной памяти в 2 Гигабайта (лицензия включала в себя только 32-битное решение) довольно существенное. Ошибки на этапе загрузки, как правило, не очень критичны для банковского бизнеса, так как день можно проработать на данных предыдущего дня, оперативно исправить ситуацию и при следующей загрузке данные будут актуализированы. Информационный портал хранилища можно донельзя разнообразить при помощи разнообразных стандартных и пользовательских портлетов (используется связка Java и ASP технологии, а провайдером доступа выступает продукт BEA Weblogic).

Ну и, конечно, в деле построения OLAP и DataWareHouse используется лишь часть могучих статистических механизмов SAS, ведь система эта создавалась в свое время как статистический пакет.

Можно сделать и выводы насчет преимуществ подходов к построению хранилищ. Определенная строгость и негибкость касаемо изменения данных в хранилище полностью окупает себя скоростью его формирования и скоростью доступа к отчетам. Как ни странно, мне до сих пор больше импонирует Нострадамус, но лишь потому, что тогда я сам разрабатывал инструментарий для создания прикладных решений, а теперь создаю прикладные решения, зачастую лишь догадываясь, как поведет себя в том или ином случае импортная система. Да и создание заказной разработки на ядре “Нострика” сравнимо по времени с внедрением платформы SAS. Так что то, что в свое время финансовая аналитика в Програмбанке отошла от SAS в сторону собственной разработки, вполне имеет право на жизнь и дальнейшее развитие.

MySQL Новости

10 доводов в пользу MySQL

Некоторое время назад РДТЕХ как давний партнер Oracle получил пару десятков статей о своих продуктах на английском языке. Я поучаствовал в переводе статьи 10 доводов в пользу MySQL

Есть и другие переводы, например, Топ-10 причин для перехода в Oracle Cloud. Как бизнесу ускорить инновации? – Спасибо Юрию Пономареву.

Больше хороших статей про разработку, учебный центр, про знаменитый глоссарий РДТЕХ – в блоге РДТЕХ на Хабре

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

Oracle Beer Day Новости

Плюшевая команда разработки

Тимур и его команда
Менеджер проекта поросёнок Тимур и его команда – мартышка программист Иван и песик тестировщик Кеша

Пользуясь случаем, поздравляем всех с наступающим Новым 2019 годом! И с новым кодом!

И еще новость – у РДТЕХ появился блог на Хабре, где мы разместили перевод прошлогодней статьи Виктора Варламова Проблема со связанными переменными: как превратить оптимизатор из врага в друга. Уже есть ряд интересных комментариев.

Новости

Oracle Ninja

Это наш большой друг, коллега-конкурент из AT Consulting, мастер всяческих единоборств с Ораклом!

Oracle Beer Day Новости

Талисманы


В работе и отдохновении, в дедлайн и в безделье, нам помогают наши талисманы: мартышка программист Иван и пёсик-тестировщик Кеша. Прошу любить и жаловать!

SQL and PL/SQL

Мистический пробел, или неправильный способ обработки исключений

На днях коллеги из соседнего отдела столкнулись с проблемой. Иногда один и тот же вызов процедуры на PL/SQL с одними и теми же параметрами давал различные результаты. Причем, если в проблемном блоке, извлекающем одно значение из выборки в переменную, поставить пробел перед точкой с запятой, ошибки нет. Если убрать пробел, все хорошо. Но чудес не бывает. Выяснилось, что практически во всем пакете запросы, возвращающие одну строку в переменные, были обрамлены в блоки обработки исключений следующим образом:

BEGIN
   SELECT VAL
     INTO v_val
     FROM TBL
    WHERE condition ; -- мистический пробел!
EXCEPTION
   WHEN no_data_found OR too_many_rows
   THEN 
      NULL;
END;

И вот когда случалось, что точная выборка возвращает больше одной строки, ошибка гасилась на извлечении второй строки, а в переменную v_val уже успевало попасть значение из первой строки выборки. Установка или удаление мистического пробела меняла план запроса, а может, сам Oracle что-то предпринимал, одно ему, оракулу, ведомое, и в переменную в разных случаях попадало разное значение с последующей неправильной работой всей процедуры.

Посмотрите, как работает пример ниже:

declare
   v_1 NUMBER := 1;
begin
   dbms_output.put_line(v_1);
   begin
      SELECT 2
        INTO v_1
        FROM DUAL
       WHERE 1 = 0;
   exception
      when no_data_found or too_many_rows then
         null;
   end;
   dbms_output.put_line(v_1);
   dbms_random.seed(TO_CHAR(SYSTIMESTAMP, 'DD.MM.YYYY HH24:MI:SS.FF9'));
   begin
      SELECT Q.L
        INTO v_1
        FROM (SELECT LEVEL + 2 AS L, DBMS_RANDOM.VALUE(1, 100) O
                FROM DUAL
             CONNECT BY LEVEL <= 4) Q
       ORDER BY O;
   exception
      when no_data_found or too_many_rows then
         null;
   end;
   dbms_output.put_line(v_1);
end;

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

Рекомендация в данном случае – в обработке ошибок исключение каждого типа проверять отдельно и в каждом из вариантов инициализировать переменную нужным для дальнейшей корректной работы значением! Может появиться соблазн агрегировать результат при помощи MAX() или MIN(), но это тоже может впоследствии привести – нет, не к ошибке, – к неверной работе реального кода.

Oracle Beer Day

Оговорочки и опечатушки

Вот уже больше десяти лет назад в дружном коллективе фирмы Irbicon, где я тогда работал, в ходе внедрения SAS Banking Intelligence Solution в МДМ-Банке родились вот такие оговорки и опечатки, причем вендор SAS совершенно не важен, ровно то же самое могло произойти и в случае с Oracle, или IBM, или Microsoft:

Обналичивание данных
Когда наши ребята готовили документ, в котором, помимо прочего, речь шла об обезличивании данных и использовании их вне стен банка, в текст усилиями начальника вкралась достойнейшая опечатка. Ее отловили в последний момент перед отправкой документа на согласование со службой безопасности, и как раз незадолго до того отшумела очередная история с кражей конфиденциальных банковских данных где-то за бугром. Хороши бы мы были!!!

На удобрения Заказчику
Еще одна опечатка. Конечно, никто не собирался всерьез отправить многостраничный труд на удобрения!

Объемный огром
Оговорка родилась в процессе создания денормализованной таблицы детальных данных для витрины по депозитам, размер которой физически на тот момент превышал 80 гигабайт.

Обирать счета по маскам
Да, и еще одна восхитительная идея, как содрать денег с Заказчика!

Oracle Beer Day Новости

Старший разработчик Д.Мороз за работой

Analyses and Dashboards Linux Publisher

Минутка с Linux и решение проблемы кириллических символов в OBIEE 12

Вот зря, зря я до сих пор не сходил на курс УЦ РДТЕХ Unix and Linux Essentials, ведь тогда найденное в интернете решение проблемы кириллических шрифтов в отчетах Oracle BI Analyses (в части выгрузки отчетов в формат PDF) и BI Publisher действительно заняло бы минуту. Но middleware-сервер оказался оснащен довольно скудно, поэтому, в отсутствии полезной утилиты Midnight Commander, пришлось вспоминать азы операций с файлами и директориями в командной строке. С помощью коллеги справились. Ведь решение просто предполагало скопировать недостающие шрифты из одной папки в другую (абсолютный путь к инсталляции Oracle Middleware на вашем сервере может быть другим)

[oracle@obiee12]$ cd /u00/app/oracle/Oracle/Middleware/Oracle_Home/bi/common/
[oracle@obiee12 common]$ mkdir fonts
[oracle@obiee12 common]$ cd /u00/app/oracle/Oracle/Middleware/Oracle_Home/oracle_common/internal/fonts/
[oracle@obiee12 fonts]$ ls
128R00.TTF  ADUOKB.ttf   ADUOTCB.ttf   ALBANWTK.ttf  B39R00.TTF
ADUOB.ttf   ADUOK.ttf    ADUOTC.ttf    ALBANWTS.ttf  MICR____.TTF
ADUOJB.ttf  ADUOSCB.ttf  ADUO.ttf      ALBANWTT.ttf  UPCR00.TTF
ADUOJ.ttf   ADUOSC.ttf   ALBANWTJ.ttf  ALBANYWT.ttf
[oracle@obiee12 fonts]$ cp *.ttf /u00/app/oracle/Oracle/Middleware/Oracle_Home/bi/common/fonts

Не обязательно быть крутым админом, чтобы быть программистом, но азы операций в командной строке, будь то Windows Shell или Linux (Unix), обязательно пригодятся! Ну и искусство поиска решений проблем в интернете тоже никто не отменял.

Oracle SQL and PL/SQL

Полезный DUAL

Псевдотаблица DUAL с единственным полем DUMMY и единственной строкой, содержащей “X” в качестве этого самого DUMMY, это просто бесценное изобретение инженеров Oracle, нелогично звучащая, но на самом деле изначально в ней было 2 строки. При помощи инструкции CONNECT BY из единственной строки DUAL получаются самые разные кортежи данных. Аналоги существуют во многих базах данных, ну, скажем так, не обязательно существуют, но могут быть созданы. К примеру, при переносе АПК “Нострадамус” (ныне – “ПрограмБанк.БизнесАнализ”) на рельсы СУБД Firebird была искусственно создана таблица DUAL (позже – процедура селектного типа), в которую включили ряд вычисляемых столбцов по аналогии с Oracle, например, SYSDATE (для запросов SELECT SYSDATE FROM DUAL и ряда схожих).

В ходе разработки на Oracle DUAL проявляет себя в совершенно разных ипостасях. Например, запрос

SELECT * FROM DUAL WHERE TO_NUMBER('A') = 1

позволит определить номер (ORA-1722) и название оракловой ошибки invalid number, по аналогии в предикате можно определить ряд других ошибок преобразования типов, арифметики, логических операций.

SELECT NVL(MAX(DUMMY), '-') FROM DUAL WHERE 1 = 0

– запрос, демонстрирующий логику неявного GROUP BY.

SELECT LAST_DAY(DATE '2017-11-20') AS NOVEMBER_LAST_DAY FROM DUAL

– легко отлаживать функции даты-времени, CASE-конструкции и вообще любые системные или самописные функции, а также их вариации, за исключением попадающих под ограничения ANSI SQL – т.е. без использования типично PL/SQL типов вроде BOOLEAN или с OUT-параметрами.

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