BASES DE DATOS curso 2012/2013 Solución Actividad 5: Estimación de estadísticas 1 – Considérense las relaciones r1(A, B, C), r2(C, D, E) y r3(E, F) del ejercicio anterior. Supóngase que no hay claves primarias, excepto el esquema completo. Sean V(C, r1)=900, V(C, r2)=1100, V(E, r2)=50 y V(E, r3)=100. Supóngase que r1 tiene 1000 tuplas, r2 tiene 1500 tuplas y r3 tiene 750 tuplas. Estímese el tamaño de r1 ⋈ r2 ⋈ r3 y diséñese una estrategia eficiente para el cálculo del join. Opción a) (r1 ⋈ r2) ⋈ r3 Suponiendo que todos los valores son equiprobables, y dado que los atributos comunes a r1 y r2 no son clave de ninguna de estas relaciones, el número de tuplas en r1 ⋈ r2 se calcula como: min ∗ , , ∗ = min , ∗ , ∗ = min 1666, 1364 = 1364 tuplas Igualmente, dado que los atributos comunes a r1 ⋈ r2 y r3 no son clave de ninguna de estas relaciones, el número de tuplas en (r1 ⋈ r2) ⋈ r3 se calcula como: min ∗ , ∗ = min 20460, 10222 = 10222 tuplas Opción b) r1 ⋈ (r2 ⋈ r3) En este caso, el número de tuplas en r2 ⋈ r3 sería: 1500 ∗ 750 1500 ∗ 750 $ ∗$ $ ∗$ min # , ( = min # , ( = min 22500, 11250 = 11250 50 100 % &, '2 % &, '3 y el número de tuplas en r1 ⋈ (r2 ⋈ r3) se calcula como: min # 11250 ∗ 1000 11250 ∗ 1000 , ( = min 10227, 12500 = 10227 900 1100 Una buena estrategia reuniría primero r1 y r2, dado que la relación intermedia es de tamaño parecido a r1 o r2. Después se reúne r3 a este resultado. BASES DE DATOS curso 2012/2013 2– A partir del esquema relacional siguiente: PropertyForRent (propertyNo, street, city, postcode, type, rooms, rent, ownerNo) Client (clientNo, fName, lName, address, telNo, prefType, maxRent) Viewing (clientNo, propertyNo, comment, viewDate) a) Representar gráficamente mediante árboles las expresiones del álgebra relacional de la consulta siguiente, y transformarla a una forma más eficiente. Enunciar las reglas de equivalencia utilizadas en cada uno de los pasos del proceso. Para los inquilinos en perspectiva que estén buscando apartamentos, localizar los inmuebles que satisfacen sus requisitos y son propiedad del propietario CO93. SELECT p.propertyNo, p.street FROM Client c, Viewing v, PropertyForRent p WHERE c.prefType = ‘Flat’ AND c.clientNo = v.clientNo AND v.propertyNo = p.propertyNo AND c.maxRent >= p.rent AND c.prefType = p.type AND p.ownerNo = ‘CO93’; b) Estimar el tamaño de las operaciones que aparecen en el árbol final, teniendo en cuenta lo siguiente: nClient = 1000, V(preftype, Client) = 5, min(maxRent, Client) = 100, min (rent, PropertyForRent) = 350, V(rent, PropertyForRent) = 20 V(clientNo, Viewing) = 250, V(type, PropertyForRent) = 5 nViewing = 3000, nPropertyForRent = 500, V(maxRent, Client) = 50 max(maxRent, Client) = 3000, max (rent, PropertyForRent) = 1000, V(ownerNo, PropertyForRent) = 30, V(propertyNo, Viewing) = 400 Desplazar σ hacia las hojas del árbol (reglas 1, 2, 7) BASES DE DATOS curso 2012/2013 Sustituir el producto cartesiano seguido de σ por ⋈ (regla 4) Determinar las operaciones σ y ⋈ que producen menos tuplas, y ejecutarlas cuanto antes (reglas 2 y 6) Desplazar ∏ hacia las hojas del árbol (reglas 3 y 8) Sustitución de c.prefType = p.type por (p.type = ‘Flat’) ÁRBOL 1 (1*) σc.prefType = ‘Flat’ aplicar Regla 1: (2*) ⋈c.clientNo 1 (2 345623,7) 200 aplicar Regla 7b: clientNo es clave de Client, por lo que cada tupla de V se combina como máximo con una tupla de C. Por lo tanto, nc ⋈ v < nv Como clientNo es foránea en V, entonces nc ⋈ v nv 3000 Como σc.prefType=`Flat` se queda con 1/5 tuplas, entonces el número de tuplas estimado será 3000/5 v. clientNo 600 tuplas (3*) σp.ownerNo = ‘C093’ aplicar Regla 1: O (PQ 3 RP,2) 17 BASES DE DATOS curso 2012/2013 (4*) ⋈v.propertyNo p.propertyNo aplicar Regla 7b: propertyNo es clave de PropertyForRent, por lo que cada tupla de V se combina como máximo con una tupla de P. Por lo tanto, nv ⋈ P <= nv Como propertyNo es foránea en P, entonces nv ⋈ P = nv = 600 Como σp.ownerNo = `C093` se queda con 1/30 tuplas, entonces el número de tuplas estimado será 600/30 = 20 tuplas (5*) σc.maxRent >= p.rent ^c.prefType = p.type aplicar Regla 3 (Conjunción) estimar el tamaño de cada parte de la conjunción Regla 2: σc.maxRent >= p.rent como no se conoce a priori el valor de p.rent se estima la mitad $7⋈ v⋈ p 20 = = 10 = V1 2 2 Regla 1: σc.prefType = p.type como se conoce el valor de prefType = ‘Flat’ $7⋈ v⋈ p 20 = = 4 = V2 %(WXYZ, Y) 5 Regla 3: $7⋈ v⋈ p V1 [ V2 \$7⋈ v⋈ p ] = 20 10 [ 4 =2 202 ÁRBOL 2 (6*) σp.ownerNo = ‘C093’ aplicar Regla 1: O (PQ 3 RP,2) = = 17 (7*) ⋈v.propertyNo= p. propertyNo aplicar Regla 7b: propertyNo es clave de PropertyForRent, por lo que cada tupla de V se combina como máximo con una tupla de P. Por lo tanto, nv ⋈ p <= nv Como propertyNo es foránea en V, entonces nv ⋈ p = nv = 3000 Como σp.ownerNo = ‘C093’ se queda con 1/30 tuplas, entonces el número de tuplas estimado será 3000/30 = 100 tuplas (8*) σc.prefType = ‘Flat’ aplicar Regla 1: 1 (2 345623, ) = = 200 (9*) ⋈c.clientNo= v.clientNo aplicar Regla 7b: clientNo es clave de Client, por lo que cada tupla de V se combina como máximo con una tupla de P. Por lo tanto, nc ⋈ v <= nv Como clientNo es foránea en V, entonces nc ⋈ v = nv = 3000 Como σc.prefType = ‘Flat’ se queda con 1/5 tuplas, entonces el número de tuplas estimado será 100/5 = 20 tuplas (10*) σc.maxRent >= p.rent ^c.prefType = p.type aplicar Regla 3 (Conjunción) estimar el tamaño de cada parte de la conjunción Regla 2: σc.maxRent >= p.rent como no se conoce a priori el valor de p.rent se estima la mitad $7⋈ v⋈ p 20 = = 10 = V1 2 2 Regla 1: σc.prefType = p.type como se conoce el valor de prefType = ‘Flat’ $7⋈ v⋈ p 20 = = 4 = V2 %(WXYZ, Y) 5 Regla 3: $7⋈ v⋈ p V1 [ V2 \$7⋈ v⋈ p ] = 20 10 [ 4 202 =2 BASES DE DATOS curso 2012/2013 ÁRBOL 3 (11*) σp.ownerNo = ‘C093’ ^ p.type= ‘Flat’ aplicar Regla 3 (Conjunción) estimar el tamaño de cada parte de la conjunción Regla 1: σp.ownerNo = ‘C093’ como se conoce el valor de p.ownerNo $2 500 = = 17 = V1 %(^_$Z'`^, Y 30 Regla 1: σp.type= ‘Flat’ como se conoce el valor de p.type $2 500 = = 100 = V2 %(WXYZ, Y 5 Regla 3: $p a ba \ p] 500 b 5002 = 3.4 ≈ 4 (12*) ⋈v.propertyNo p. propertyNo aplicar Regla 7b: propertyNo es clave de PropertyForRent, por lo que cada tupla de V se combina como máximo con una tupla de P. Por lo tanto, nv ⋈ p <= nv Como propertyNo es foránea en V, entonces nv ⋈ p = nv = 3000 Como σp.ownerNo = ‘C093’ ^ p.type= ‘Flat’ se queda con 4/500 tuplas, entonces el número de tuplas estimado será 3000 x 4/500 = 2.4 ≈ 3 tuplas (13*) ⋈c.clientNo= v.clientNo aplicar Regla 7b: clientNo es clave de Client, por lo que cada tupla de V se combina como máximo con una tupla de P. Por lo tanto, nc ⋈ v <= nv Como clientNo es foránea en V, entonces nc ⋈ v = nv = 3000 Como σc.prefType = ‘Flat’ se queda con 1/5 tuplas, entonces el número de tuplas estimado será 3/5 = 0,6 tuplas (14*) σc.maxRent >= p.rent aplicar Regla 2: como no se conoce a priori el valor de p.rent se estima la mitad $7⋈ v⋈ p 0.6 = = 0.3 WdYefV 2 2