Data Warehousing y Business Intelligence

Hay muchas definiciones sobre Data Warehousing y Business Intelligence, a continuación trataremos de delinear la idea detrás de estos términos.

Empecemos con una definición sencilla:

El Data Warehousing y Business Intelligence son técnicas para proporcionar a la gente de negocios la información y herramientas que ellos necesitan para tomar decisiones operativas y estratégicas.

La información es uno de los activos mas importantes de cualquier organización. Esta información es utilizada con dos propósitos principales, mantener registro de la operación y soporte a la toma de decisiones.

Los sistemas operacionales son donde se almacenan los datos producto de la operación diaria, y los sistemas de DW/BI son de donde extraemos esos datos.

Los usuarios de los sistemas de DW/BI, a diferencia de los usuarios de los sistemas operacionales,  normalmente no trabajan con una transacción a la vez, por lo contrario necesitan acceder a miles o cientos de miles de registros para responder una consulta, lo que requiere sistemas optimizados para responder con buenos tiempos de respuesta.

Los objetivos de un sistema de DW/BI son:

  • Hacer que la información sea fácil de obtener
  • Presentar la información de manera consistente.
  • Ser adaptable a los cambios.
  • Presentar la información de manera oportuna
  • Debe ser un bastión seguro.
  • Servir como base fidedigna y confiable para mejorar la toma de decisiones.
  • Debe ser aceptado por los usuarios para considerarse un sistema exitoso.

Entonces porque la dualidad DW/BI?, bueno en los inicios solo se hablaba de sistemas de soporte a la decisión o DW, si observamos la siguiente definición:

Data Warehouse es un sistema que extrae, limpia, normaliza, y entrega datos fuentes a un almacenamiento dimensional para implementar y soportar consultas y análisis de datos para la toma de decisiones.

Podemos ver que el Data Warehouse cubría desde la extracción hasta la explotación de la información. Actualmente algunos se refieren al DW como una plataforma punta a punta, donde las aplicación de BI son un componente mas, otros prefieren separar las herramientas de BI del DW, pues les permite separar la comercialización de estas de la necesidad de un DW para su funcionamiento.

En lo personal comparto la idea de Ralph Kimball, de que las aplicaciones de BI son un componente del DW, aunque desde el punto comercial a veces se las separe.

xEvents con Analysis Services

Los Eventos Extendidos de SQL Server permiten capturar datos del mismo a través de estos y son el reemplazo a las trazas. Ofrecen un menor uso de recursos que su equivalente anterior. SSAS también permite la utilización de Eventos Extendidos para capturar la misma información que vemos a través del Profiler y las DMVs.

Iniciar un Evento Extendido

Para activar un evento debemos ejecutar un XMLA como el siguiente:

<Create xmlns=http://schemas.microsoft.com/analysisservices/2003/engine

xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance

xmlns:ddl2=http://schemas.microsoft.com/analysisservices/2003/engine/2

xmlns:ddl3=http://schemas.microsoft.com/analysisservices/2003/engine/3

xmlns:ddl100_100=http://schemas.microsoft.com/analysisservices/2008/engine/100/100

xmlns:ddl200_200=http://schemas.microsoft.com/analysisservices/2010/engine/200/200

xmlns:ddl300_300=http://schemas.microsoft.com/analysisservices/2011/engine/300/300>

    <ObjectDefinition>

          <Trace>

               <ID>xEvent_SSAS_Trace</ID>

               <Name>xEvent_SSAS_Trace</Name>

               <AutoRestart>true</AutoRestart>

               <ddl300_300:XEvent>

                     <event_session name=xeas dispatchLatency=1 maxEventSize=4 maxMemory=4

                      memoryPartitionMode=none eventRetentionMode=allowSingleEventLoss

                      trackCausality=true>

                           <event package=AS name=QueryCubeEnd />

                           <target package=Package0 name=event_file>

                               <parameter name=filename value=H:\Files\Trace\xEvent_SSAS_Trace.xel/>

                               <parameter name =max_file_size value=10/>

                               <parameter name =max_rollover_files value=15/>

                               <parameter name =increment value=1/>

                           </target>

                     </event_session>

               </ddl300_300:XEvent>

          </Trace>

    </ObjectDefinition>

</Create>

 

Este XMLA posee algunas propiedades que debemos ajustar a nuestra necesidad:

  • AutoRestart: Indica al SSAS que el evento debe reiniciarse automáticamente al reiniciar el servicio.
  • Event: Debemos agregar tantos Event como tipos de eventos necesitemos capturar.

Debemos tener cuidado con la cantidad y tipos de eventos que pidamos capturar pues puede afectar la performance del SSAS y/o generar muchísimos datos 

    • Filename: podemos indicar la ruta y nombre de archivo a generar.
    • Max_File_Size: podemos indicar en MB el tamaño máximo del archivo generado. Cuando alcance ese valor generar un nuevo archivo.
    • Max_Rollover_Files: cantidad de archivos a mantener.

 

Detener un Evento Extendido

<Delete xmlns=http://schemas.microsoft.com/analysisservices/2003/engine>

    <Object>

          <TraceID>xEvent_SSAS_Trace</TraceID>

    </Object>

</Delete>

 

Consultar Eventos Extendidos

Para ver los eventos ejecutándose en el SSAS debemos consultar la siguiente DMV

SELECT

    *

FROM

    $system.discover_traces

 

Visualizar Eventos Extendidos

Los archivos XEL pueden abrirse desde el Management Studio para su revisión, es suficiente con hacer doble click sobre el archivo y visualizarlos. Ahora si necesitamos levantar estos debemos utilizar la funcion de SQL sys.fn_xe_file_target_read_file.

SELECT

    xe.TraceFileName,

    xe.TraceEvent,

    xe.EventDataXML.value(‘(/event/data[@name=”ServerName”]/value)[1]’,‘varchar(50)’) AS ServerName,

    xe.EventDataXML.value(‘(/event/data[@name=”DatabaseName”]/value)[1]’,‘varchar(50)’) AS DatabaseName,

    xe.EventDataXML.value(‘(/event/data[@name=”NTCanonicalUserName”]/value)[1]’,‘varchar(50)’) AS NTCanonicalUserName,

    xe.EventDataXML.value(‘(/event/data[@name=”ConnectionID”]/value)[1]’,‘int’) AS ConnectionID,

    xe.EventDataXML.value(‘(/event/data[@name=”RequestID”]/value)[1]’,‘varchar(50)’) AS RequestID,

    xe.EventDataXML.value(‘(/event/data[@name=”CurrentTime”]/value)[1]’,‘datetime’) AS CurrentTime,

    xe.EventDataXML.value(‘(/event/data[@name=”StartTime”]/value)[1]’,‘datetime’) AS StartTime,

    xe.EventDataXML.value(‘(/event/data[@name=”EndTime”]/value)[1]’,‘datetime’) AS EndTime,

    xe.EventDataXML.value(‘(/event/data[@name=”Duration”]/value)[1]’,‘bigint’) AS Duration,

    xe.EventDataXML.value(‘(/event/data[@name=”ObjectPath”]/value)[1]’,‘varchar(max)’) AS ObjectPath

FROM

    (

        SELECT

            [FILE_NAME] AS TraceFileName,

            OBJECT_NAME AS TraceEvent,

            CONVERT(XML,Event_data) AS EventDataXML

        FROM

            sys.fn_xe_file_target_read_file(‘H:\BCR\Files\Trace\*.xel’, NULL, NULL, NULL)

    ) xe