Diseño de fragmentación vertical Diseño de Fragmentación Vertical El objetivo de la fragmentación vertical es particionar una relación en un conjunto de relaciones mas pequeñas de tal manera que muchas aplicaciones de usuarios corran en un solo fragmento. La fragmentación vertical es mas complicada que la fragmentación horizontal. Esto es debido al número total de posibles de maneras de fragmentar una tabla crece exponencialmente. Por ejemplo: En fragmentación horizontal, si el número total de predicados simples en P es n, existen 2n posibles predicados miniterminos que pueden ser definidos. En fragmentación vertical , si una relación tiene m atributos no primarios, el número de posibles fragmentos es igual a B(m), el cuál es el enésimo número Bell. Para valores grandes de m, B(M) aprox. mm; por ejemplo: si m=10, B(10)=115,000; si m=15, B(15)=109 ; para m=30, B(30) = 1023 | Dos enfoques heurísticos fragmentación vertical: existen para 1. Agrupación: alcance en el cuál atributos son progresivamente agregados para constituir fragmentos. 2. Particionamiento: alcance en el cuál las relaciones globales son progresivamente divididas en fragmentos En ambos casos en cada iteración buscan la mejor opción factible basándose en fórmulas que indican cuál es la mejor agrupación o particionamiento posible. Requerimientos de información de la fragmentación vertical afinidad de atributos Afinidad de atributos nos indica que tan relacionados está los atributos respecto de las aplicaciones. El requerimiento principal de información relacionado a las aplicaciones es su frecuencia de acceso. Establescamos lo siguiente: Q = { q1, q2,..,qq} aplicaciones. conjunto de querys de las R (A1, A2, .., An) relación. Para cada query qi y cada atributo AJ asociamos un valor de uso de atributo que definiremos como: __ | 1 si AJ es referenciado por qi use (qi , AJ ) = | |__ 0 si AJ no es referenciado por qi Ejemplo 1: Considere la sig. tabla: J ( NoJ, nombreJ, pto, cd) Y los sigs. querys: q1: SELECT pto FROM J WHERE NoJ = $value q2: SELECT nombreJ, pto FROM J q3: SELECT nombreJ FROM J WHERE cd = $value q4: SELECT SUM (pto) FROM J WHERE cd = $value Denotemos a: A1 = NoJ ; A2 = nombreJ; A3 = pto ; A4 = cd. El valor de uso de cada atributo es mostrado en la siguiente matriz: A1 A2 A3 A4 Q1 1 0 1 0 Q2 0 1 1 0 Q3 0 1 0 1 Q4 0 0 1 1 Matriz de Uso de atributos Estos valores no representan el peso de las frecuencias de acceso de las aplicaciones, esta puede ser incluida en la definición de la medida de afinidad de atributos, aff(Ai , Aj ), que mide el grado de enlazamiento entre dos atributos de una relación de acuerdo a como ellos son accesados por las aplicaciones y se define de la sig. manera: Aff(Ai , Aj) = Σ Σ refl (qk) accl (qk) ∀k | use(qk,Ai )=1^ use(qk, Aj)=1 ∀Sl Donde: refl (qk) es el número de accesos a los atributos (AI ,Aj) para cada ejecución de la aplicación qk en el sitio Sl . accl (qk) es la frecuencia con que una aplicación qk se ejecuta en el sitio Sl. El resultado es una matriz n*n, que llamaremos la matriz de afinidad de atributos. Ejemplo 2 Continuemos con el ejemplo 1; por simplicidad establescamos refl (qk) = 1 para todo qk y Sl . Establezcamos las siguientes frecuencias de las aplicaciones. acc1 (q1) = 15 acc1 (q2) = 5 acc1 (q3) = 25 acc1 (q4) = 3 acc2 (q1) = 20 acc2 (q2) = 0 acc2 (q3) = 25 acc2 (q4) = 0 acc3 (q1) = 10 acc3 (q2) = 0 acc3 (q3) = 25 acc3 (q4) = 0 La afinidad entre A1 y A3 puede ser calculada de la sig. manera: Aff(A1 , A3) = Σ Σ accl (qk) = acc1 (q1) + acc2 (q1) + acc3 (q1) = 15 + 20 + 10 = 45 La matriz de afinidad (AA) es la sig. A1 A2 A3 A4 A1 45 0 45 0 A2 0 80 5 75 A3 45 5 53 3 A4 0 75 3 78 La matriz de afinidad nos ayudará en el proceso de fragmentación, el cuál en forma general constará de dos pasos: 1.- Agrupar aquellos atributos con mayor afinidad. 2.- Dividir la relación de acuerdo a la agrupación. Algoritmo de Agrupación Un algoritmo de enlace de energía (BEA) deberá ser usado para esta actividad. El algoritmo BEA toma como entrada la matriz de afinidad de atributos (AA), permuta sus renglones y columnas y genera una matriz de afinidad agrupada (CA). Las permutaciones son realizadas de tal manera que se maximize la siguiente medida de afinidad global (AM) : n n AM = Σ Σ aff(Ai,Aj) [aff(Ai,Aj-1)+aff(Ai,Aj+1)+aff(Ai-1,Aj) + aff(Ai+1,Aj)] i = 1 j =1 Donde: aff(A0,Aj) = aff(Ai,A0)=aff(An+1,Aj) = aff(Ai,An+1) = 0 Debido a que la matriz AA es simétrica, AM se puede definir: n n AM = Σ Σ aff(Ai,Aj) [aff(Ai,Aj-1)+aff(Ai,Aj+1)] i = 1 j =1 El algoritmo BEA (para generar la matriz CA): Inicio CA(*,1) = AA (*,1) CA(*,2) = AA(*,2) índice = 3 Mientras índice <= n haz Para i haz desde 1 hasta (índice -1) contribucion(Ci-1, Cindice , Ci ) /* Ci es la columna i */ fin_para contribución(Cíndice-1, C índice , Cíndice+1 ) loc= colocación dada por máximo valor de contribución Para j haz desde índice hasta (loc+1) en paso de -1 CA(*, j) = CA(*, j-1) fin_para CA(*,loc) = AA(*,índice) índice = índice +1 fin_mientras ordena los renglones de acuerdo al orden relativo de las columnas fin { BEA} Donde contribución(Ai ,Ak ,Aj) = 2 bond(Ai,Ak) + 2 bond(Ak,Aj) 2 bond(Ai,Aj ) Donde n bond(Ax,Ay) = Σ aff(Az,Ax) * aff(Az,Ay) z=1 Ejemplo 3: Considere la matriz AA y calculemos la contribución de mover el atributo A4 entre los atributos A1 y A2: contribución(A1,A4,A2) = 2bond(A1,A4)+2bond(A4,A2) - 2bond(A1,A2) 2bond(A1,A4) = 2 (45*0 + 0*75 + 45*3 + 0*78) = 270 2bond(A4,A2) = 2 (0*0 + 75*80 + 3*5 + 78*75) = 23730 2bond(A1,A2) = 2 (45*0 + 0*80 + 45*5 + 0*75) = 450 contribución(A1,A4,A2) = 270 + 23730 - 450 = 23550 Ejemplo 4: Considere la relación J y la matriz de afinidad AA del ejemplo 2. Siguiendo el algoritmo BEA Inicialización de CA CA índice = 3 i=1 contribución(C0,A3,C1) = 8820. i=2 contribución(C1,A3,C2) = 10150. contribución(C2,A3,C4) = 1780. loc = 2 { colocamos a atributo 3 en columna 2} índice = 4 i=1 contribución(C0,A4,C1) = 270. i=2 contribución(C1,A4,C2) = -7014. i=3 contribución(C 2,A4,C3) = 23186. contribución(C3,A4,C5) = 23730. loc = 4 { colocamos a atributo 4 en columna 4} Ordenando renglones de acuerdo a orden de columnas CA (final) Partición de la matriz CA El objetivo de la actividad de división es encontrar un conjunto de atributos que sean accedidos por la mayor cantidad de distintas aplicaciones. Considere la sig. matriz CA; si un punto a lo largo de la diagonal es establecido, dos conjuntos de atributos son identificados. Un conjunto { A1,A2,..,Ai }, denotado por TA, está colocado en la esquina superior izquierda y el segundo conjunto { Ai+1,..,An }, denotado BA, está en la esquina inferior derecha. Establezcamos lo siguiente: Q = { q1, q2,..,qq} -> conjunto de aplicaciones. AQ(qi ) = { Aj | use (qi , Aj ) = 1} -> conjunto de atributos accesados por la aplicacion qi TQ = { qi | AQ(qi) esta incluído en TA} -> conjunto de aplicaciones que accesan solo a TA BQ = { qi | AQ(qi) esta incluído en BA} -> conjunto de aplicaciones que accesan solo a BA OQ = Q - { TQ U BQ} -> conjunto aplicaciones que accesan a TA y BA Si existen n atributos de una relación existen n-1 posibles posiciones donde el punto de división puede ser colocado a lo largo de la diagonal de la matriz CA asociada a esa relación. La mejor posición para la división es aquella que produce los conjuntos TQ y BQ tal que el acceso total a un solo fragmento es maximizado mientras el acceso total a ambos fragmentos es minimizado. Por tanto definimos las siguientes ecuaciones. Σ ε Σ ∀ Σ ε Σ ∀ Σ ε Σ ∀ La solución al problema de optimización es encontrar el punto x (1 <= x <= n-1) tal que la expresión es maximizada. Un aspecto importante es que la expresión anterior define dos fragmentos tal que los valores de CTQ y CBQ son muy parecidos. Existen dos detalles del planteamiento expuesto: 1. La matriz es dividida solamente en dos grupos. Una solución a esta situación es aplicar recursivamente el algoritmo de partición binaria para cada uno de los grupos obtenidos durante la partición previa. 2. Un grupo de atributos pudiera encontrarse en la mitad de la matriz (no en una esquina). Para solucionar esto tendremos que rotar columnas y renglones de la matriz: la columna más a la izquierda de la matriz CA es rotada para que sea ahora la columna mas a la derecha y el renglón de más arriba es rotado hacia el renglón mas bajo. La idea es mover el bloque de atributos a la esquina superior izquierda. Algoritmo de Partición // Entrada: Matriz CA y tabla; Salida: Conjunto de fragmentos F = {f1, f2} inicio mejorZ = -infinito repite para i haz desde n-1 hasta 1 en paso de -1 calcula CTQi calcula CBQi calcula COQi z = CTQi * CBQi - COQi 2 si (z > mejor) entonces mejorZ = z graba la estructura de la matriz rotada(TA,BA) fin_si fin para llamar a función ROTAR(CA) hasta no mas rotaciones posibles reconstruye CA de acuerdo a la estructura asociada a mejorZ. f1 = PTA (R) U K { K es la llave de R} f2 = PBA (R) U K F = { f1 , f2 ) fin {partición} Si aplicamos el algoritmo de partición a la matriz CA obtenida en el ejemplo 4, obtenemos los fragmentos f1 = { A1, A3} y f2 = { A1, A2, A4}, es decir, f1 = { NoJ , pto} y f2 = { NoJ, NombreJ, Cd }