1 de Julio de 2000 Vol. 1 No.1


CÓMO DISEÑAR GRANDES VARIABLES EN BASES DE DATOS MULTIDIMENSIONALES
Manuel de la Herrán Gascónhttp://www.eside.deusto.es/profesores/mherran/
Ingeniero Informático por la Universidad de Deusto

Vicent Castellar-Busó http://www.uv.es/~buso/
Doctor en Matemáticas por la Universidad de Valencia

(continuación...)

Cómo reducir el tamaño de una variable

Las variables multidimensionales pueden estar comprimidas, por ejemplo, mediante la tecnología sparse de Oracle Express (http://www.oracle.com/olap/html/oes.html). Sin embargo, es posible que por diversas razones no queramos utilizar una variable comprimida, o que a pesar de utilizar compresión, el espacio ocupado por la variable siga siendo excesivo.

Las formas obvias de reducir el tamaño de una variable son eliminar dimensiones y eliminar valores de dimensión. Por ejemplo, si podemos prescindir de un detalle diario, y nos basta la información semanal, podremos ahorrar mucho espacio en disco.

Una vez que las dimensiones y valores de dimensión se han reducido al mínimo aceptable, y existiendo aún problemas de espacio, siempre nos queda la opción de eliminar algunos de los valores acumulados de la dimensión, ya que podrán ser calculados a partir de sus hijos. Pero no deberíamos aplicar masivamente esta solución, ya que entorpeceríamos las consultas. Precisamente, las bases de datos multidimensionales pretenden, entre otras cosas, agilizar consultas disponiendo de valores precalculados.

Lo más adecuado es aplicar esta técnica en dimensiones pequeñas. Por ejemplo, si la variable posee alguna dimensión con tres valores, uno de ellos total, eliminando el valor total de la dimensión se ahorra un tercio del espacio, y los cálculos realizados bajo demanda suponen sumas de pocos (dos) valores. En cambio, si el número de valores de la dimensión fuese elevado, el ahorro sería mucho menor, y los cálculos más lentos.

En realidad podríamos eliminar cualquiera de los tres valores, y ya que el total será probablemente el más consultado tal vez fuera mejor eliminar alguno de los hijos, aunque esto complicaría los programas de carga de datos.

Sin embargo, en cualquier caso el ahorro conseguido con este método no es muy grande ¿Podremos obtener ahorros mucho mayores sin perder el detalle en las consultas?

La respuesta es, en la mayoría de los casos, sí. Es muy probable que la variable que queremos comprimir tenga un elevado número de dimensiones, y éstas a su vez, muchos valores de dimensión. Si tenemos problemas con el tamaño de la variable, es porque ésta es realmente grande.

Ocurre que cuantas más dimensiones y más valores de dimensión tiene una variable, tanto menos probable es que algún usuario desee consultar algún valor de la variable que esté indexado por valores de dimensión hoja en todas sus dimensiones. Recordemos que se trata de sistemas orientados a la toma de decisiones. En una variable de ocho dimensiones será rarísimo querer consultar algún dato que no esté acumulado en al menos una de las ocho dimensiones.

Restringiendo un poco más la hipótesis, podríamos suponer que en todas las consultas a la variable, al menos por una de las dimensiones, se va a solicitar el valor acumulado total (el más alto de la jerarquía). A continuación veremos un ejemplo de esto con una variable de tres dimensiones.

Esta solución implica el uso de variables y fórmulas multidimensionales. En las bases de datos multidimensionales se almacenan tanto variables como fórmulas. Las variables contienen datos. Las fórmulas en cambio, son expresiones o programas que acceden a variables y/o a otras fórmulas, y que indican la manera de calcular los datos que serán presentados al usuario.

Según la solución propuesta, en vez de almacenar una variable del tipo

V(D1 D2 D3)

Se almacenan tres variables:

V1(D1 D2
V2(D1 D3)
V3(D2 D3)

Cuyas necesidades de espacio serán menores o iguales, siempre que se cumpla que

NC[V] >= NC[V1] + NC[V2] + NC[V3]

Es decir

Dt1 * Dt2 * Dt3 >= Dt1 * Dt2 + Dt1 * Dt3 + Dt2 * Dt3

Siendo esta una condición que se cumple habitualmente. Para el caso que nos ocupa, puede considerarse que se cumple siempre, ya que es condición suficiente (aunque no necesaria) que en cada dimensión existan al menos tantos valores de dimensión como el número total de dimensiones de la variable, es decir, si n es el número de dimensiones y Dti es el número de valores de la dimensión i, basta con que se cumpla:

Se construye una fórmula

F1(D1 D2 D3)

que dependiendo del total consultado, extraiga los datos de una u otra variable, de la forma:

F1 =

if D1 = 'T'
V3
else if D2 = 'T'
V2
else if D3 = 'T'
V1
else
NA

 

 

 

 

Utilizando la analogía espacial, en vez de almacenar todo el cubo de datos, se almacenan sólo los datos de las caras del cubo, ya que siempre al menos uno de los ejes (dimensiones) tiene el valor total (que se considera en el eje de coordenadas). Se almacenarán tantas caras de cubo como dimensiones existan, en este caso, sólo tres.

Por ejemplo, si el número de valores de cada dimensión fueran 10, 50 y 20 respectivamente, en vez de almacenar los datos en una variable de 10 * 50 * 20 celdas = 10000 celdas, tendríamos tres variables de 10 * 50, 10 * 20 y 50 * 20 celdas, en total, 500 + 200 + 1000 = 1700 celdas.

Si obligásemos a que al menos dos dimensiones se consulten como totales, estaríamos almacenando las "aristas" del cubo o hipercubo. Por ejemplo, una variable de cinco dimensiones

V(D1 D2 D3 D4 D5)

Podría almacenarse en 10 variables, cuyo número corresponde con todas las combinaciones de las dos dimensiones que se consultarán a total:

D1 D2
D1 D3
D1 D4
D1 D5
D2 D3
D2 D4
D2 D5
D3 D4
D3 D5
D4 D5

O desde otro punto de vista, y dado que

comb(n, m) = comb(n, n - m)

se trata de todas las combinaciones de las tres de esas cinco dimensiones que no estarán a total:

V1(D1 D2 D3)
V2(D1 D2 D4)
V3(D1 D2 D5)
V4(D1 D3 D4)
V5(D1 D3 D5)
V6(D1 D4 D5)
V7(D2 D3 D4)
V8(D2 D3 D5)
V9(D2 D4 D5)
V10(D3 D4 D5)

Construyéndose una fórmula

F1(D1 D2 D3 D4 D5)

F1 =

if D1 = 'T' and D2 = 'T'
V10
else if D1 = 'T' and D3 = 'T'
V9
else if D1 = 'T' and D4 = 'T'
V8
else if D1 = 'T' and D5 = 'T'
V7
else if D2 = 'T' and D3 = 'T'
V6
else if D2 = 'T' and D4 = 'T'
V5
else if D2 = 'T' and D5 = 'T'
V4
else if D3 = 'T' and D4 = 'T'
V3
else if D3 = 'T' and D5 = 'T'
V2
else if D4 = 'T' and D5 = 'T'
V1else
NA

 

 

 

 

 

 

 

 

 

 

Esta implementación afectaría a los programas de carga, que deberían realizarse de forma que acumulen (y no sólo imputen) cada uno de los datos en todas las variables.

Si la variable fuese de dos dimensiones, y obligamos a que al menos una de ellas sea total, tendríamos

V(D1 D2)

Almacenada mediante

V1(D1)
V2(D2)

Que reduce el espacio ocupado siempre que

Dt1 * Dt2 > Dt1 * + Dt2

Y creándose la formula

F1(D1 D2)

F1 =

if D1 = 'T'
V2
else if D2 = 'T'
V1
else
NA

 

 

 

Podemos aplicar este sistema con cualquier valor de dimensión y no sólo con el valor total, simplemente incluyendo una nueva variable que implícitamente almacene los valores que correspondan con ese valor de dimensión, cuya dimensión será precisamente la que esa variable no posee. Por ejemplo, dada una variable multidimensional de cuatro dimensiones:

V(D1 D2 D3 D4)

Si la dimensión D2 estuviese formada por un total T que tuviese dos hijos subtotales ST1 y ST2, y restringiéramos las consultas de forma que se suponga que siempre se soliciten datos indexados por al menos un total o subtotal por alguna de las dimensiones, los datos se pueden almacenar en las variables:

V1(D1 D2 D3)

Implícitamente supone D4 a T

V2(D1 D2 D4)

Implícitamente supone D3 a T

V3(D1 D3 D4)

Implícitamente supone D2 a T

V4(D2 D3 D4)

Implícitamente supone D1 a T

V5(D1 D3 D4)

Implícitamente supone D2 a ST1

V6(D1 D3 D4)

Implícitamente supone D2 a ST2

Creándose la fórmula

F1(D1 D2 D3 D4)

F1 =

if D1 = 'T'
V4
else if D2 = 'T'
V3
else if D3 = 'T'
V2
else if D4 = 'T'
V1
else if D2 = 'ST1'
V5
else if D2 = 'ST2'
V6
else
NA

 


Dirección General de Servicios de Cómputo Académico-UNAM
Ciudad Universitaria, M
éxico D.F.