Scripts para la Tabla de Tiempo

21 01 2008

Juan Ernesto Ramos Hernández nos envía un script para llenar la tabla de tiempo. Juan Ernesto reúne en una sola tabla la parte fecha y la parte hora de las dimensiones. Esperamos les sea de gran utilidad. Para contactarlo escribele a: JuanErnestoRamozHernandez

/*
  Llena la tabla de hora por minutos
  Autor: Juan Ernesto Ramos Hernández
  SQLServer 2005
*/

if exists(select name from sysobjects where name = 'Dim_HoraDia')
      DROP TABLE Dim_HoraDia
GO

CREATE TABLE Dim_HoraDia (
      HoraDia_id            int NOT NULL, -- Llave subrogada
      Minutos				int NOT NULL, -- Llave natural
      Hora12                varchar(5) NOT NULL, -- formato de hora de 12
      Hora24				varchar(5) NOT NULL, -- formato de hora de 24
      Meridiano             varchar(2) NOT NULL, -- AM o PM
)
GO

ALTER TABLE Dim_HoraDia
       ADD PRIMARY KEY (HoraDia_Id)
GO

SET LANGUAGE spanish
SET NOCOUNT ON

declare @hcount int
declare @fecha smalldatetime
declare @fechaMod smalldatetime
declare @Hora12 varchar(5)
declare @Hora24 varchar(5)

set @hcount=0
set @fecha = '1900-01-01 00:00' -- se usa la variable @fecha para sumarle en cada vuelta del ciclo un minuto

while @hcount < 1440 --1440 son el numero de minutos que tiene un dia completo
begin
  set @fechaMod = dateadd(mi,@hcount,@fecha)
  insert into Dim_HoraDia ( HoraDia_ID, Minutos, Hora12, Hora24, Meridiano)
  select case
           when datepart(hh,@fechaMod) < 10 and datepart(mi,@fechaMod) = 10 and datepart(mi,@fechaMod) < 10 then '1' + datename(hh,@fechaMod) + '0' + datename(mi,@fechaMod)
           when datepart(hh,@fechaMod) = 10 then '10' + datename(hh,@fechaMod) + datename(mi,@fechaMod)
           when datepart(hh,@fechaMod) >= 10 and datepart(mi,@fechaMod) >= 10 then '1' + datename(hh,@fechaMod) +  datename(mi,@fechaMod)
          end     as HoraDia_Id,
          @hcount as minutos,
          case
            when @hcount = 780 then convert(varchar(5),dateadd(hh,-12,@fechaMod),8)
          end     as Hora12,
          convert(varchar(5),@fechaMod,8) as Hora24,
          case
           when @hcount =  720 then 'PM'
          end as Meridiano

   set @hcount = @hcount + 1
end 

About these ads




Llenando la tabla de tiempo

18 07 2007

Recurro muy seguido a este script de SQL para llenar mi tabla de tiempo. Casi siempre lo hago y lo vuelvo a hacer una vez al mes. Todavía no comprendo como no demonios lo guardo en alguna parte…bueno, esperemos que al publicarlo lo tenga en un solo lado.


/*
Llena la tabla de tiempo
Haciendo cubos: Adrian Ceballos

Solo para asegurarnos que esto corre
en cualquier servidor independientemente
del idioma ademas de especificar en que
idioma saldran los nombres de los dias de la semana
*/
SET LANGUAGE spanish

/*Ponemos que el primer dia de la semana
1 es Lunes. Para el Domingo usar 7*/

SET DATEFIRST 1

declare @fi datetime, @ff datetime

set @fi = '2004-01-01'
Set @ff = '2004-31-12'

while @fi &lt; = @ff
begin
insert into Tiempo (TimeID, Fecha, Anio, MesID, Mes,
Cuarto, Semana, NumDiaSemana, DiaSemana)
select year(@fi)*10000+month(@fi)*100+day(@fi) as TimeId,
@fi as Fecha,
year(@fi) as Anio,
year(@fi)*100+month(@fi) as MesID,
case when Month(@fi)  &lt; 10
then datename(year,@fi)+'-0'+convert(varchar,month(@fi))
else datename(year,@fi)+'-'+convert(varchar,month(@fi))
end as Mes,
year(@fi)*10+datepart(q,@fi) as Cuarto,
datename(year,@fi)+datename(ww,@fi) as Semana,
datepart( dw, @fi) as NumDiaSemana,
datename( dw, @fi) as DiaSemana
set @fi = @fi + 1
end

Solo hay que darle copy-paste y ¡voilá!…No olviden sustituir los valores fechas para el rango que quieren se genere en la tabla de tiempo. El detalle de las columnas aquí.

El concepto es el mismo para cualquier marca de base de datos pero habrá que traducir el script. El script para crear y llenar la tabla de tiempo puede bajar aquí.

Technorati tags: ,





No utilice llaves compuestas

10 07 2007

Cuando esté diseñando las estrellas o copos de nieve que formarán su Data Warehouse evite utilizar llaves compuestas.

LlavesCompuestas  

Simpre use llaves simples. Las llaves compuestas hacen que el servidor trabaje más a la hora de hacer querys; así que modifique su modelo para evitar las llaves compuestas. Trate de que la llave generada sea del tipo entero.

LlavesCompuestasCopo

Los querys:

  • Serán más simples …debido a que no hay que hacer join por tantas columnas
  • Consumiran menos memoria y procesador…debido a que no hay que hacer join por tantas columnas
  • Ahorrarán un poco de espacio
  • Responderán más rápido.

Technorati tags: Data Warehouse,





La dimensión Tiempo

2 07 2007

Estrella

Cuando estamos diseñando las estrellas o copos de nieve que formarán nuestro data warehouse, hay que tener mucho cuidado con la dimensión de tiempo. Hay varias formas de hacerlo y para mi gusto unas mejores que otras. La forma más común de encontrar es una en la que el campo llave es la fecha.

tiempo1

Aquí a la izquierda está el típico diseño. El problema aquí es que a las bases de datos les cuesta trabajo hacer búsquedas por campos datetime o date, al menos más que un campo entero. Otro punto es que el campo fecha ocupa más espacio que un campo entero. Hay que tomar muy en cuenta que el campo fecha, que es la llave, formará parte de la tabla de hechos; y con millones y millones de registros un byte o dos es mundo de espacio, tal vez un disco duro :) .

tiempo2

Podemos mejorar el diseño cambiando el campo llave por un campo entero como en la figura de la derecha. Esto hará que:

  • las búsquedas sean más rápidas sobre todo en la tabla de hechos. Esto por que a las bases de datos les cuesta menos trabajo manejar números que fechas, o sea ocuparemos menos el procesador y ocuparemos menos memoria.
  • Que el tiempo de respuesta sea más rápido. No es redundancia, este punto es una consecuencia de lo anterior.
  • Que físicamente los datos ocupen menos espacio. De nuevo, el servidor trabaja menos con menor volumen de información y se requieren menos procesador y menos memoria o sea que la ganancia es doble. 

En este diseño hay 2 corrientes, los que usan un numero consecutivo como llave y los que usamos un numero en el formato yyyyMMdd. Para mi gusto es muy frustrante encontrarse una estrella donde la llave de la tabla tiempo es un 1,2,3,4…34560,34561,….@#$%#$$% ¡para saber a que fecha corresponden el 34561!…pues hay que hacerle un query a la tabla de tiempo.

Yo prefiero de llave un numero con el formato yyyyMMdd, así para el 31 de diciembre del 2007 guardo 20071231 en el campo TiempoID, sigue siendo un numero entero y es mucho más legible que un simple 1-2-3. Con solo ver que valor tiene el campo TiempoID puedo saber a que fecha corresponde el registro. Además funciona perfectamente en el where con un between:

SELECT *
FROM HECHOS
WHERE TIEMPOID BETWEEN 20070101 AND 20070131

Hay un punto no tan visible con el campo llave:  la tabla de hechos tiene índices para acelerar el tiempo de respuesta. Los índices ocupan espacios y si usamos un campo entero en vez de un datetime estaremos ahorrando espacio y haciéndole la vida más fácil al servidor.

En bases de datos pequeñas 1 a 10 gigas da lo mismo usar uno u otro. En bases de datos gigantes como las de grandes tiendas departamentales o tiendas de conveniencia donde la base de datos del data warehouse mide teras usar un campo entero es de vital importancia.

En otro post analizaremos los demás campos de la tabla de tiempo.

Para obtener un script para crear y llenar la tabla de tiempo dé clic aquí.

Technorati tags: , , Data Warehouse








Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

Únete a otros 29 seguidores