Показаны сообщения с ярлыком OLAP. Показать все сообщения
Показаны сообщения с ярлыком OLAP. Показать все сообщения

четверг, 19 июля 2012 г.

Writeback в SSAS 2012. Маленький пример - план-факт(часть первая)


Для чего применяется writeback?  И что такое writeback? 
Кратко, writeback – это обратная запись.  То есть, используя excel 2010(в принципе любой клиент, который поддерживает writeback) вы можете внести изменения в  данные хранилища или измерения. Зачем это?
Данная опция нужна для создания “план-факт” анализа, бюджетирования, корректировки данных в измерениях. Рассмотрим небольшой проект план-факт  и как раз на основе данного проекта я покажу работу с writeback.  Источником данных возьмем AdventureWorks 2012. Плюс сделаем отдельную таблицу для плановых значений (она фактически копия таблицы FactFinance). Код для создания таблицы:
USE [AdventureWorksDW2012]
GO
 
/****** Object:  Table [dbo].[PlanFinance]    Script Date: 17.07.2012 13:10:23 ******/
SET ANSI_NULLS ON
GO
 
SET QUOTED_IDENTIFIER ON
GO
 
CREATE TABLE [dbo].[PlanFinance](
    [FinanceKey] [int] IDENTITY(1,1) NOT NULL,
    [DateKey] [int] NOT NULL,
    [OrganizationKey] [int] NOT NULL,
    [DepartmentGroupKey] [int] NOT NULL,
    [ScenarioKey] [int] NOT NULL,
    [AccountKey] [int] NOT NULL,
    [Amount] [float] NOT NULL,
    [Date] [datetime] NULL
) ON [PRIMARY]
 
GO
 
ALTER TABLE [dbo].[PlanFinance]  WITH CHECK ADD  CONSTRAINT [FK_PlanFinance_DimAccount] FOREIGN KEY([AccountKey])
REFERENCES [dbo].[DimAccount] ([AccountKey])
GO
ALTER TABLE [dbo].[PlanFinance] CHECK CONSTRAINT [FK_PlanFinance_DimAccount]
GO
ALTER TABLE [dbo].[PlanFinance]  WITH CHECK ADD  CONSTRAINT [FK_PlanFinance_DimDate] FOREIGN KEY([DateKey])
REFERENCES [dbo].[DimDate] ([DateKey])
GO
ALTER TABLE [dbo].[PlanFinance] CHECK CONSTRAINT [FK_PlanFinance_DimDate]
GO
ALTER TABLE [dbo].[PlanFinance]  WITH CHECK ADD  CONSTRAINT [FK_PlanFinance_DimDepartmentGroup] FOREIGN KEY([DepartmentGroupKey])
REFERENCES [dbo].[DimDepartmentGroup] ([DepartmentGroupKey])
GO
ALTER TABLE [dbo].[PlanFinance] CHECK CONSTRAINT [FK_PlanFinance_DimDepartmentGroup]
GO
ALTER TABLE [dbo].[PlanFinance]  WITH CHECK ADD  CONSTRAINT [FK_PlanFinance_DimOrganization] FOREIGN KEY([OrganizationKey])
REFERENCES [dbo].[DimOrganization] ([OrganizationKey])
GO
ALTER TABLE [dbo].[PlanFinance] CHECK CONSTRAINT [FK_PlanFinance_DimOrganization]
GO
ALTER TABLE [dbo].[PlanFinance]  WITH CHECK ADD  CONSTRAINT [FK_PlanFinance_DimScenario] FOREIGN KEY([ScenarioKey])
REFERENCES [dbo].[DimScenario] ([ScenarioKey])
GO
ALTER TABLE [dbo].[PlanFinance] CHECK CONSTRAINT [FK_PlanFinance_DimScenario]
GO
 
 

В связи с тем, что для проектов я уже использую SQL 2012, то рассмотрим реализацию writebak, как в многомерной модели, так и в Tabular модели.
1 Многомерная модель
  • Создаем многомерную модель в VS 2010 на основе таблиц FactFinance, PlanFinace (таблицы фактов), DimOrganisation, DimDepartamentGroup,DimDate
image
  • Создаем 3 измерения Dim_Date, Dim_Departament, Dim_Organisation
  • Создаем куб и 2 показателя. Один из таблицы FactFinance – Amount, где хранятся наши факты, функцию агрегации используем LastNonEmpty(так как это остатки), второй из таблицы PlanFinance- Amount, функцию агрегации делаем Sum. Название у показателей соответствующие - FactAmount и PlanAmount.
  • Включаем writeback. Для этого переходим в раздел Partitions  и правой кнопкой мышки нажимаем на партицию PlanFinance, в выпадающем меню выбираем writeback settings
image
  • В  появившемся окне вводим название таблицы, куда будут записываться изменения, источник данных и Storage Mode: Molap или Rolap. Я использую Molap.
image
  • Нажимаем Ok и деплоем проект. В итоге в хранилище мы должны получить новую таблицу, в моем случае WriteTable_PlanFinance, в которую теперь будут записываться  новые данные, а также  логирование, когда была вставлена запись и кем.
Ограничения: К сожалению, есть ограничения, writeback  работает только с показателями, у которых функция агрегации суммирование. Поэтому например  показатель остатки по счетам или на складе, которые  используются с функцией агрегации LastEmpty или LastNonEmpty, необходимо будет реализовывать через фиктивные функции.
И как обычно выкладываю проект, который вы может скачать здесь.
Во второй части, я расскажу реализацию writeback в  Tabular модели SSAS

пятница, 15 июня 2012 г.

SCD2: реализация в SSIS.

 

Кратко,  немного теории:

SCD( slowly change dimension ) называются таблицы измерений, в которых некоторые атрибуты могут изменить свои значения по истечении некоторого периода времени, причем частота таких изменений является небольшой.

Существует три типа таких измерений:

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

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

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

Более подробней по поводу SCD-измерений можно почитать у Ralph Kimball. Информации очень много в сети по данной тематике, так что ищите.

Теперь вернемся к реализации SCD type2   с помощью  ssis .

Создаем таблицу dim_Clients в  MS SQL server 2012

CREATE TABLE [dbo].[dim_Clients](
    [id] [int] IDENTITY(1,1) NOT NULL, --id клиента – уникальная запись, инкрементальная
    [ClientIDSource] [int] NOT NULL,  -- id клиента в источнике
    [NameClients] [varchar](250) NOT NULL, –- имя клиента
    [TypeClients] [int] NULL, –-тип клиента
    [KodObl] [varchar](3) NULL, –-код области
    [DateRegistration] [int] NULL, –- дата регистрации
    [DateFrom] [datetime] NOT NULL, –- дата начала действия даты с
    [DateTo] [datetime] NOT NULL, –- дата окончания действия даты до
    [IsCurrent] [bit] NOT NULL, –- является текущей датой(0 – нет, 1 – да)
 CONSTRAINT [PK_dim_Clients] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO



ALTER TABLE [dbo].[dim_Clients] ADD  CONSTRAINT [DF_dim_Clients_DateFrom]  DEFAULT ('30000101') FOR [DateFrom]
GO
Теперь нам необходима дополнительная  таблица, куда мы будем сливать данные из  исходного источника, а потом обрабатывать и сохранять в таблицу в хранилище.
 
CREATE TABLE [dbo].[dim_ClientsStaging](
    [id] [int] NOT NULL,
    [NameClients] [varchar](250) NOT NULL,
    [TypeClients] [int] NULL,
    [KodObl] [varchar](3) NULL,
    [DateRegistration] [int] NULL
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[dim_ClientsStaging] ADD  CONSTRAINT [DF_dim_ClientsStaging_DateRegistration]  DEFAULT (datediff(day,'',getdate())) FOR [DateRegistration]
GO

Создаем новый проект в SSIS 2012. Добавляем источник откуда мы получаем данные, и источник, куда мы будем заливать данные. После создаем два пакета.

В первом пакете для работы SCD2 используем конструкцию T-SQL merge.

blog1

Первым шагом очищаем предварительную таблицу, после делаем заливку данных из источника в staging таблицу, а потом с помощью  скрипта T-SQL  реализуем логику заполнения для SCD2. Скрипт ниже:

  insert into dbo.dim_Clients
   (  
      [ClientIDSource]
     ,[NameClients]
     ,[TypeClients]
     ,[KodObl]
     ,[DateRegistration]
     ,[DateFrom]
     ,[DateTo]
     ,[IsCurrent]
   )
   select 
      [ClientIDSource]
     ,[NameClients]
     ,[TypeClients]
     ,[KodObl]
     ,[DateRegistration]    
      ,getdate()
      ,'30000101'
      ,1     
      from      
      (
      merge into  dim_Clients  as dst
      using  dbo.dim_ClientsStaging as src
      on
      (
       src.id=dst.[ClientIDSource]
       )
      --new records inserted
      when not matched then 
      insert (
      [ClientIDSource]
     ,[NameClients]
     ,[TypeClients]
     ,[KodObl]
     ,[DateRegistration]    
     ,[DateFrom]
     ,[DateTo]
     ,[IsCurrent]
      )
      values(
      src.id
      ,src.[NameClients]
      ,src.[TypeClients]
      ,src.[KodObl]
      ,src.[DateRegistration]
      , getdate()
      , '30000101'
      ,1
      )
      --existing
     when matched
     and  isCurrent=1
     and
     (src.[NameClients]<>dst.[NameClients]
     or src.[TypeClients]<>dst.[TypeClients]
     or src.[KodObl]<>dst.[KodObl]    
      )
     then update 
     set
     dst.IsCurrent=0,
     dst.DateTo=getdate()
     output 
      src.id as clientidsource
      ,src.[NameClients]
      ,src.[TypeClients]
      ,src.[KodObl]
      ,src.[DateRegistration]
     ,$Action as MergeAction) as  mrg 
      where mrg.MergeAction='update';
   
   

А  теперь тестовый прогон:

1  Первый прогон –заполняются данные расставляются даты и указывается флаг текущая действующая запись isCurrent.

blog2 

 

2 Теперь в исходниках изменим имя у записи Stefanie (это первая запись на рисунке ClientIDSource=1) и изменим код области у Dennis(это  запись на рисунке ClientIDSource=2). Запускаем пакет и получаем следующие результаты.

blog3

Красным выделено на рисунке строки, которые не являются действующими, в DateTO указана дата до которой эта запись действует, а в флаге isCurrent=0, то есть эта записья уже не является текущей.

И зеленным выделены записи, которые  являются действующими на текущей момент. У них указана дата действия с(DateFrom) и флаг iscurrent равен 1. То есть эти записи с новыми атрибутами начинают действовать с даты, указанной в DateFrom.

Плюсы данного метода:

1 Скорость

Минусы

1  Тяжеловатый и не всегда понятный код реализации логики SCD2 с помощью T-SQL

Второй пакет использует компонент из toolbox Slowly Change Dimension.

blog4

Всю структуру, которая указана на картинке выше, кроме OLE db source, создаст  мастер Slowly Change Dimension. В мастере необходимо указать ключ - bussines key (ключ источника).

image

И атрибуты, которые будут изменятся

image

После указываем, что делать с fail записями

image

и наконец, указываем столбцы, которые отвечают за даты действия.

image

Также  указываем,что делать с столбцом iscurrent

image

В итоге  после нажатия на finish строится набор task-ов.

Плюсы данного метода

1 Понятный мастер, строит логику работы SCD2 сам.

Минус

1 Скорость. При больших объемах данных начинает жутко тормозить.

В своих проектах, я  использую первый метод. Потому что у меня редко когда бывает маленький объем данных в справочниках.  И если кто заинтересуется,  что я изменил после  работы с Slowly Change Dimension(второй пакет) ?Улыбка

Проект SSIS и скрипт по созданию источника  данных:

Проект SSIS

Скрипт на создание базы данных с данными

среда, 13 июня 2012 г.

Небольшой перепост о DWH

В данной статье автор рассказывает о метриках хранилища.  Очень хорошая статья кратко, емко и по делу.  Благодаря таким метрикам можем в дальнейшем расчитать различные свойства хранилища(предполагаемый размер хранилища,  средний  рост размера хранилища и т.д.),   для руководства быстро нарисовать инфраструктуру и соответсвенно посчитать   затраты. Спасибо тебе автор odiusage.


четверг, 12 июня 2008 г.

MS AS 2000 VS дисковая подсистема(или как я искал ошибку, там где ее нет)

Недавно на одном из филиалов фирмы, где я работаю, начали падать кубы. Происходило это очень странно: во-первых в сообщениях об ошибках выдается, что ось залочена или повреждена. во-вторых происходила перезагрузка AS при попытке перепроцессить куб. Начал разбираться в чем проблема. Захожу в сам куб(editor) все нормально, куб открывается, browse осей работает. Пытаюсь процессить - выдает ошибку. Делаю одну интересную вещь, посдмотренную на www.sql.ru, убиваю все файлы в папке Data/Название базы. Делаю перепроцессинг, все равно падает. Беру накатываю backup и процешу и ву аля работает. Работает, это конечно хорошо. Но причину сбоя я не нашел. Начинаю дальше искать эту проблему. И тут меня озаряет, а может это проблема не в Олапе, а может это проблема в железе. Начинаю тестировать дисковую подсистему, нагружаю ее по полной. И вот при тестирование происходит зависание сервера, после чего машину можно перегрузить, только толкнув кнопку reset на башне. Перегружаю и запускаю процессинг, и вот она родимая ошибочка. Переношу всю папку DATA на другой раздел диска, который относится к другому винту. И запускаю процессинг, он отрабатывает нормально. Уже как 3 дня полет нормальный(Тьфу, тьфу, тьфу). Вот так вот весело, кто кого Олап или дисковая подсистема?