Guía de Rendimiento para Analisys Services 2008

Posted by Miguel Egea | Posted in Analisys Services | Posted on 08-03-2010

0

La descarga que tenéis aquí es una guía práctica de rendimiento en Analisys Services 2008.

Espero que la disfruteis

Perspectivas en Analisys Services, ¿lo que las vistas al Engine?

Posted by Miguel Egea | Posted in Analisys Services | Posted on 28-02-2010

0

Introducción

Las perspectivas podrían ser lo más parecido a lo que las vistas  son a relacional, Sin embargo no es ni siquiera una buena comparación. Como casi siempre que se intentan buscar analogías Relacional vs Multidimensional las comparaciones son imprecisas incompletas y no solo no ayudan a entender el segundo sino que quizá limitan una visión que ha de ser más amplia. De ahí el título de este post, no, no son lo que las vistas al Engine, porque son simplemente otra cosa, aunque de alguna forma no es descabellado asemejarlas.

¿Entonces que son las perspectivas? Las perspectivas son una forma de mostrar un subconjunto de atributos, dimensiones, medidas como si fuesen un nuevo cubo, pero ojo, no son un mecanismo de seguridad, es decir, limitan lo que se vé basicamente para que usuarios menos abezados no se líen, pero no implica en ningun caso que se limite el acceso al cubo del que son base.

La creación de perspectivas es realmente sencilla, muy muy sencilla. En nuestro proyecto de Analisys services iremos a la pestaña perspectivas como puede verse en la siguiente imagen.

Elegimos esa pestaña y creamos una nueva perspectiva. Ahí nos aparece una lista con todos los objetos de nuestro cubo.  Simplementemarcamos con checks los objetos  que quermos que se vean o dejamos desmarcados los que no queremos que aparezcan, insisto que esto no es un mecanismo de seguridad.

Una vez creadas y desplegado el cubo los usuarios perciben las perpestivas como si fuesen un nuevo cubo. Cuando nos conectamos desde un cliente observaremos algo así

Como podeis ver se ven como si fuesen un cubo mas, pero aparece el literal perspectiva.  En cualquier caso se persibe igual que si fuese un cubo.

En otros post veremos como limitar acceso por seguridad.

Ciclo de WebCast sobre SQL Server 2008 R2 (AKA Kilimanjaro)

Posted by Miguel Egea | Posted in Analisys Services, Noticias, Relacional | Posted on 24-02-2010

0

Creo que un ciclo de conferencias tan interesante y tan elaborado merecen un link mas largo, explicando que encontrar en cada uno de ellos etc.. lo haremos espero con tiempo. De momento, aquí teneis el link
Ciclo de WebCast sobre SQL Server 2008 R2 en castellano

Creando una dimensión tiempo en Analisys Services 2/2

Posted by Miguel Egea | Posted in Analisys Services | Posted on 23-01-2010

2

En el artículo anterior de la serie vimos omo  crear la primera parte de la dimensión tiempo. En este momento tenemos ya constrido nuestro DataSource View y vamos a ver como se construye nuestra dimensión tiempo desde el punto de vista de Analisys Services. Para ello empezamos con nuestro BIDS (Bussiness Intelligence Development Studio) abierto con el proyecto tal y como lo teníamos al final del artículo anterior.

Cabe destacar que estamos haciendo este proyecto con SQL Server 2008, cambia algo con respecto de 2005, así que no es de extrañar que los menús no sean exactamente los mismos, aunque si que lo es el concepto y la forma de hacerlo.

Para comenzar pulsaremos sobre el apartado dimensiones con el botón derecho, eligiendo la opción Nueva dimensión, en ese instante nos aparecerá el asistente para la creación de dimensiones, y tras saltarnos si procede la página de bienvenida, elegiremos la opción “Use an existing table”, Usar una tabla existente. (Aunque hay opciones para crear una tabla de tiempo en el origen de datos o en el servidor, y que estas opciones puedan resultar muy atractivas a simple vista, nosotros vamos a usar la forma máal de  crear todo lo relacionado con la dimensión tiempo, porque nuestro objetivo es entenderlo. Además, al menos yo, siempre uso el mecanísmo que estoy describiendo, porque no me aporta un trabajo extra y si me da un control muy importante sobre como funciona la dimensión tiempo.

Â

En el siguiente paso del asistente tenemos que seleccionar en que objeto del Data Source View nos basamos para crear la dimensión, adicionalmente hay que decir cual es la clave primaria de ese objeto (en nuestro caso es fácil, puesto que la infiere del model) y que columna contiene el descriptor de esa clave (name column). Elegiremos el campo Fecha como name column mientras mantenemos FechaKey como la clave primaria de esta dimensión.

En el siguiente paso del asistente es cuando realmente tenemos que definir que estamos hablando de una dimensión de tipo tiempo. Esto cambia con respecto a 2005, en el que había un wizard que nos preguntaba directamente cual era el campo que contenía el dato para mes, semana, dia, trimestre, etc.. En el asistente aparece un campo para definir el tipo de atributo, y es ahí donde concretamos cual es la naturaleza de cada uno de los campos,  por ejemplo, en la siguiente figura podemos ver como hemos especificado para Fecha Key que se trata de un atributo de tipo date, es decir, es la fecha propiamente dicha. También aprovecharemos este paso para ajustar los nombres que no acaben de gustarnos, (por ejemplo quitaré Fecha Key y lo traduciré por fecha.

Una vez que hemos elegido todos los atributos podemos continuar con el asistente, en la imagen que teneis a continuación podeis ver como he hecho los siguiente cambios:

  • He renombrado Fecha Key por fecha y Mes Key por mes
  • He especificado que el tipo de atributo es Date para la fecha
  • Year para el año
  • Month para el mes
  • Week para la semana
  • Day Of year para el dia del año
  • Day of Month para el dia del mes
  • Day of Week para el dia de la semana

Despues de esto simplemente se termina el asistente en el que nos dice que va  crear la dimensión tiempo como puede verse a continuación.

Esta dimensión tiempo, ya funcionaría, pero no es aún ni demasiado navegable (no tiene jerarquías) ni mucho menos optima, porque las relaciones entre atributos tampoco están especificadas. Esto si es un cambio importante en SQL Server 2008, la relación entre atributos cuenta ahora con una pestaña específica, que lo hace más visual. El estado inicial de estas relaciones entre atributos es el que puede verse en la figura a continuación.

Sin embargo, debemos especificar las relaciones reales de dependencia, ya que esas relaciones ayudarán mucho al rendimiento, debido a que con estas relaciones establecidas, SQL Server Analisys Services puede inferir, que el resultado de un mes, es el resultado de sumar los dias (para operaciones aditivas). mientras que el resultado del año es el resultado de sumar los meses. Si estas relaciones no son especificadas, esas conclusiones no pueden establecerse y por tanto se hace un uso suboptimo de los datos. En el grafico siguiente puede verse como establecemos estas relaciones de dependencia de forma adecuada.

Una parte importante, en la que muchas veces no nos fijamos es en el color de las flechitas del apartado Attibute Relasionships, el color más gris indica que la relación que existe entre esos atributos es una relación flexible, es decir que puede cambiar con el tiempo, por ejemplo en el caso del jefe del que depende una persona, es claro que puede cambiar con el tiempo, aunque sea una relación clara entre los atributos, sin embargo, en nuestro caso,  la relación Fecha->Mes y la Relación Mes-Año, están especificada como relaciones rígidas que quiere decir que el mes 2009-01 siempre será del año 2009 y eso no va a cambiar (cosa que es bastante obvia).

Una vez que tenemos establecidas las relaciones solo nos falta añadirle a la dimensión las jerarquias que nos sirvan para especificar el criterio por el que queremos que se navegue nuestra dimensión. Para ello simplemente arrastraré los atributos hasta el apartado de jerarquías. Adicionalmente voy a ocultar el atributo año, para no confundir a los usuarios, si lo dejo podrán llegar al año desde la jerarquia y desde el atributo, y en mi experiencia eso lia bastante a los usuarios. En la imagen siguiente podeis ver como quedan mis jerarquías.

Podeis observar que no tengo ningún warning ni ninguna flechita azul, esto es simplemente porque he seguido todos los patrones de buen diseño que SQL Server 2008 Analisys Services tiene especificados para una dimensión como esta. Ahora simplemente vamos a ver un ejemplo de como navegarla, lo teneis en el siguiente gráfico.

Por último, aunque esta serie de dos artículos acaba, en posteriores post, intentaré hablar de como localizar esta dimensión, especificando que para usuarios en inglés el nombre le aparezca en inglés, mientras que para usuarios en castellano los nombres aparezcan en castellano, esto es January para los Ingleses, Enero para los hispanos.
Esto será en otro post.
Saludos Cordiales

Mi charla sobre Analisys Services 2008 en el Codecamp de tarragona

Posted by Miguel Egea | Posted in Analisys Services | Posted on 18-01-2010

4

Me parece increible que yo diese esta charla y no saber que estaba grabada y publicada, gracias a mi amgigo Salvador Ramos y a un portal de bussiness intelligence me he enterado que estaba publicado. Yo no se dar una charla serio, los que me conoceis ya sabeis como soy, para los demás pues bueno, ya podeis verme y oirme.

Creando una dimensión Tiempo en Analisys Services 1/2

Posted by Miguel Egea | Posted in Analisys Services | Posted on 17-01-2010

2

PortalSQL tradicionalmente venía hablando solo de motor relacional, sin embargo, mi carrera me ha llevado a la parte multidimensional, y os prometo que ha sido un descubrimiento total, trabajar con cientos o miles de millones de filas, y que los usuarios vean los resultados en tiempo real es una experiencia increible. Si además le podemos añadir luego cierta lógica relacionada con el tiempo y fórmulas que añadan valor a las operaciones, los proyectos sin duda tienen tendencia a ser más exitosos.

Dicho esto, vamos a comenzar con el primer artículo sobre Analisys Services, pasaremos casi de largo por algunos pasos básicos, y construiremos la dimensión tiempo paso a paso para que los veais.

Comenzamos en el resultado de los artículos sobre la dimensión tiempo, es decir nuestro datawarehouse cargado y relleno con la dimensión tiempo en Español, Inglés y frances como pude verse en la siguiente figura.

Ahora lo que vamos a hacer es abrir el Bussiness Studio Development Studio desde el menú tal y como puede verse en la siguiente figura.

Después lo que haremos será crear un proyecto de Analisys services llamado Dimensión Tiempo, para ello en Fichero –> Nuevo –>Proyecto–> Bussiness Intelligence Projects y ahí elegimos analisys services projects, tal y como podeis ver en la siguiente figura.

Una vez creado el proyecto nos aparecerán los distintos apartados de Analisys Services, los que necesita para crear el proyecto. Lo primero que haremos será crear el Data Source, es decir, crear una conexión al motor relacional en el que estará la tabla tiempo en la que nos vamos a basar, en realidad, lo que hacemos es muy parecido a lo que se hacía cuando se creaba una conexión ODBC, es decir crear una conexión a una base de datos (no tiene por que ser SQL Server, puede ser cualquier otro motor).
Importante Pensad que estamos haciendo un proyecto que al final no es mas que código fuente que se ejecutará en un servidor, por tanto, la conexión que creamos al final se conectará no desde nuestra máquina, no con nosotros logueados, sino desde el servidor, y ejecutado bajo las credenciales que levanten el servicio de Analisys Services.

Para crear el Data Source pulsaremos con el botón derecho sobre la carpeta Data Sources, y elegiremos New Data Source :

A partir de elegir la opción nuevo data source nos aparece un asistente para crear la conexión, saltamos el primer paso, que es siempre el de bienvenida, y en el segundo nos permite elegir alguna conexión que ya hayamos hecho anteriormente o podemos pulsar el botón nueva conexión.

Una vez pulsado el botón nueva conexión nos va a aparecer la siguiente pantalla, en la que realmente será la que creemos la conexión.

En la parte superior de la imagen podeis ver como hay una lista desplegable en la que seleccionamos el proveedor de datos que usaremos para conectarnos, en nuestro caso es SQL Server, de forma que hemos elegido el Native Client 10.0, basta con que tengas instalados los drivers adecuados para poder elegir cualquier conexión a cualquier base de datos del mercado.

El siguiente paso, que es el penúltimo, nos pide la información de impersonación, es decir, nos ayuda a decir con que credenciales ha de conectarse el servicio de Analisys Services a esta base de datos, podemos especificar unas credenciales de windows, podemos especificar que se conecte bajo las credenciales del servicio, que se usen nuestras credenciales, o que no use ninguna.


El último paso es especificar el nombre que daremos a la conexión, elegid cualquiera que nos vale.

Una vez creado el Data Source, (Origen de Datos), debemos crear el Data Source View, esto nos permite seleccionar bien tablas o vistas, o bien crear consultas y que aparezcan en nuestro modelo como una tabla. Para nuestro ejemplo, en el que no vamos a hacer un cubo completo sino solamente la dimensión tiempo, nos valdrá con la tabla que tiene la dimensión tiempo. Realmente es la única que vamos a necesitar, pero en futuros artículos espero que creemos un cubo completo contra Adventure Works por ejemplo, para que veais el proceso completo.

Para crear el data source view, sobre el apartado en el explorardor de soluciones, botón derecho, nuevo data source view y seguimos el asistente, en el primer paso solamente es el de bienvenida, el segundo nos ofrece para elegir el datasource del que saldrá la conexión, obviamente elegiremos el que acabamos de crear.

Las alternativas que nos ofrece el asistente en el segundo paso son las que usará para inferir claves primarias, y relaciones en las tablas seleccionadas. El data source view añade esta lógica sin modificar el origen de datos, es decir, él necesita saber que campos son clave primaria y como se relacionan las tablas para ayudarnos en la creación de las dimensiones y hechos posteriormente. La alternativa que elijais dependerá mucho de como tengais vuestro protocolo de nombres en la creación, fijaos en los ejemplos que pone cuando pinchais una de las alternativas y elegid el más adecuado a vuestro esquema. En el siguiente paso hay que elegir que tablas nos traemos. En nuestro caso solo Dimensiones.Tiempo, fijaos que hay una parte de filtro abajo de las tablas de origen, esto es porque en los esquemas grandes suelen haber, cientos, quizás miles de tablas (el otro día vi un ejemplo de un sistema navision con 90.000 tablas…) para elegir una en concreto ayudarnos del filtro será fundamental en estos casos.

Fijaos también en el botón Add Related tables, en los que el sistema va a traerse las tablas que estén relacionadas, averiguando esto a través de las restricciones de integridad referencial. De esta forma podemos elegir el conjunto de tablas que necesitamos de una forma mucho más sencilla.

Hasta aquí la primera parte, en breve publicaré el final de la creación de la dimensión tiempo, lo que es la creación en sí.

Saludos

Relaciones entre atributos en SSAS video

Posted by Miguel Egea | Posted in Analisys Services | Posted on 31-12-2009

0

Resulta que no me acordaba que publicamos este video en el canal de youtube de Solid Quality Mentors, y lo he visto en SQLServerSI, el sitio de mi amigo y compañero y MVP Salva Ramos, yo dejé de pertenecer a ese increible grupo de gente en septiembre. Pero mi corazón está con ellos.Relaciones entre Atributos en youtube

Usando CTE’s para construir la dimensión de tiempo 3/3

Posted by Miguel Egea | Posted in Analisys Services, Relacional | Posted on 27-12-2009

0

Empezaremos este tercer artículo de la serie simplemente creando una tabla que alojará nuestros datos de tiempo en distintos idiomas, una vez rellenada esta tabla, puede servirnos perfectamente de base para la creación de una dimensión tiempo, que será el siguiente artículo, en el que comenzaremos a crear el proyecto de Analisys Services para construir la dimensión tiempo.

La tabla contiene la estrucutra básica para contener todos los datos necesarios relacionados con el tiempo , y además tiene la versión en castellano, francés e ingles de estos datos

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
CREATE TABLE [Dimensiones].[Tiempo](
[FechaKey] [int] not NULL primary key ,
[Fecha] [datetime] NULL,
[Año] [int] NULL,
[Numero_Mes] [int] NULL,
[Mes_Castellano] [nvarchar](30) NULL,
[Mes_año_Castellano] [nvarchar](35) NULL,
[MesKey] [int] NULL,
[Semana] [int] NULL,
[SemanaKey] [int] NULL,
[Fecha_Castellano] [nvarchar](52) NULL
[TipoDia] [varchar](13) NOT NULL,
[DiaDelAño] [int] NULL,
[DiaDeLaSemana] [int] NULL,
[DiaDelMes] [int] NULL,
[Dia_castellano] [nvarchar](30) NULL,<code>[Mes_Inglés] [nvarchar](30) NULL,
[Mes_año_Inglés] [nvarchar](35) NULL,
[Fecha_Inglés] [nvarchar](52) NULL,
[Dia_Inglés] [nvarchar](30) NULL,
 
[Mes_Francés] [nvarchar](30) NULL,
[Mes_año_Francés] [nvarchar](35) NULL,
[Fecha_Francés] [nvarchar](52) NULL,
[Dia_Francés] [nvarchar](30) NULL
 
) ON [PRIMARY]
 
GO

Una vez que tenemos la tabla tenemos que rellenarla para ello usaremos el mismo código que la vista del artículo anterior. En este caso si podemos utilizar las cláusulas que hablamos en el primer artículo SET DATE FIRST y SET LANGUAGE, de forma que todo esté adecuadamente configurado cuando hagamos los inserts y los updates corresponeientes. Veamnos como rellenar la tabla con las fechas que deseamos.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
set language spanish;
set datefirst 1;
insert into dimensiones.tiempo
(FechaKey, Fecha, Año, Numero_Mes, Mes_Castellano, Mes_año_Castellano, MesKey, Semana, SemanaKey, Fecha_Castellano,
TipoDia, DiaDelAño, DiaDeLaSemana, DiaDelMes, Dia_castellano)
select
CAST(CONVERT(varchar(10),fecha + id ,112) as int) FechaKey,
fecha+id as Fecha,
YEAR(fecha+ID) as año,
MONTH(fecha+id) as Numero_Mes,
DATENAME(month,fecha+id) Mes_Castellano,
DATENAME(month,Fecha + id ) +' '+ cast(YEAR(Fecha + id ) as varchar(4)) Mes_año_Castellano,
year(Fecha + id )*100+month(Fecha + id ) MesKey,
DATEPART(DW,Fecha + id ) Semana,
year(Fecha + id )*100 + DATEPART(DW,Fecha + id ) SemanaKey,
cast(DAY(Fecha + id ) as varchar(10)) + ' de ' + DATENAME(MM,Fecha + id ) + ' de ' + cast(YEAR(Fecha + id ) as varchar(4)) Fecha_Castellano,
case when datepart(weekday,Fecha + id )&gt;5 then 'Fin de semana' else 'Semana' end TipoDia,
datepart(dayofyear,Fecha + id ) DiaDelAño,
DATEPART(DW,Fecha + id ) DiaDeLaSemana,
DATEPART(dd,Fecha + id ) DiaDelMes,
DATENAME(dw,Fecha + id ) Dia_castellano</code>
 
from (select CAST('19991231' as datetime) fecha ) tabla
cross join nums;

Con este primer insert tendremos rellena la mayor parte de la tabla y los descriptores en castellano, sin embargo, aún no tenemos rellenados los campos en inglés y francés que pretendemos tener completos. Veamos el código para actualizar la parte en inglés

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
set language english;
 
update Dimensiones.Tiempo 
set Fecha_Inglés=a.Fecha_Inglés,
   Dia_Inglés=a.Dia_ingles,
   Mes_año_Inglés=a.Mes_año_Inglés,
   Mes_Inglés=a.Mes_Inglés 
from 
 (  select 
  CAST(CONVERT(varchar(10),fecha  + id ,112) as int) FechaKey,
  DATENAME(month,fecha+id) Mes_Inglés,
  DATENAME(month,Fecha + id ) +' '+  cast(YEAR(Fecha + id ) as varchar(4)) Mes_año_Inglés,
  DATENAME(MM,Fecha + id ) ++ ' ' +cast(DAY(Fecha + id ) as varchar(10)) +  ', ' + cast(YEAR(Fecha + id ) as varchar(4)) Fecha_Inglés,
  DATENAME(dw,Fecha + id ) Dia_ingles
 
  from (select CAST('19991231' as datetime) fecha ) tabla 
      cross join nums ) a inner join Dimensiones.Tiempo on a.FechaKey=Dimensiones.Tiempo.FechaKey

En francés tendremos que hacer algo parecido, simplemente hay que elegir de nuevo el idioma.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
set language français;
update Dimensiones.Tiempo 
set Fecha_Francés=a.Fecha_Francés,
   Dia_Francés=a.Dia_ingles,
   Mes_año_Francés=a.Mes_año_Francés,
   Mes_Francés=a.Mes_Francés 
from 
 (  select 
  CAST(CONVERT(varchar(10),fecha  + id ,112) as int) FechaKey,
  DATENAME(month,fecha+id) Mes_Francés,
  DATENAME(month,Fecha + id ) +' '+  cast(YEAR(Fecha + id ) as varchar(4)) Mes_año_Francés,
  DATENAME(MM,Fecha + id ) ++ ' ' +cast(DAY(Fecha + id ) as varchar(10)) +  ', ' + cast(YEAR(Fecha + id ) as varchar(4)) Fecha_Francés,
  DATENAME(dw,Fecha + id ) Dia_ingles
 
  from (select CAST('19991231' as datetime) fecha ) tabla 
      cross join nums ) a inner join Dimensiones.Tiempo on a.FechaKey=Dimensiones.Tiempo.FechaKey

Espero que os sirva el código.