====== Conception de BD réparties et requêtes ====== > [[fouille_dist_tp|]] ===== Préambule : Exemple Netflix ===== * [[http://www.scribd.com/doc/40225102/Netflix%E2%80%99s-Transition-to-High-Availability-Storage-Systems|]] -- [[fouille_dist_fiche|fiche de lecture]] * Lecture complémentaire : * Brewer's 2000 Talk : {{:m2ilc:podc-keynote.pdf|}} * Gilbert and Lynch's proof : {{:m2ilc:10.1.1.20.1495.pdf|}} Netflix : utilisation de S3 en high availability * avantage et inconvénients * application de recommandation ^ recommandation : | analyser les notes des utilisateurs sur les filmes qu'ils ont vu -> prédire les filmes pour lesquels ils donneraient de bonnes notes (0 à 5). | triplet : [utilisateur, filme, note (,date) ] * matrice de notes filmes x utilisateurs * histogramme du nombre de notes dans le temps * on scinde les notes en deux parties chronologiques : de début jusqu'à 2008, puis 2009 à ... et prend la première partie pour définir le modèle de recommandation. * On valide la qualité de la recommandation avec la suite des données. * Ils ont fait un concours (Netflix prize) pour la production d'un algorithme performant. | => c'est énorme, beaucoup de calculs ^ => c'est extrêmement lent. | On veut mettre à jour continuellement. | Oracle ne marchait plus. Ils ont essayé S3. ===== Approche Décomposition ===== ==== Migration vers un BDR ==== * Décomposition en BD locales * pour la durabilité, confidentialité d'une partie des données (banques, etc.), démarche couteuse qui doit se mériter * Intégration logique des BD locales existantes * services de mash-up, par exemple * pas le sujet du jour aujourd'hui === Conception d'un BDR par décomposition === On veut des morceaux fragments disjoints. Puis on les alloue aux différents sites, avec un peu de redondance si utile. === Objectifs de la décomposition === * fragmentation * trois types : horizontale, verticale, mixte * performances en favorisant les accès locaux * équilibrer la charge de travail entre les sites * Duplication (réplication) * favoriser les accès locaux * augmenter la disponibilité des données ===== Fragmentation ===== ==== Fragmentation Correcte ==== * Complète : chaque élément de R doit se trouver dans un fragment * Reconstructible : on doit pouvoir recomposer R à partir de ses fragments * Disjointe : chaque élément de R ne doit pas être dupliqué === Fragmentation horizontale === * Round-robin : construire **m** lots en affectant ligne i à lot j = i mod m + 1. Utile pour des lectures séquentielles parallèles, guère autrement. * Hashage sur attribut //A// : * ti∈ Rj avec j = hash(ti.A) * sélection (A=v): ''select * from R where hashkey = hash(A)'' * équi-jointure (A=B) : si A et B sont traités avec la même fonction de hashage : ''select * from R,S where R.A = S.B'' * Par intervalle : * Fragmenter le domaine de l'attribut A en **m** intervalles * Vecteur \left\{a_1,\ldots ,a_{m-1}\right\} * ti∈Rj avec a_{j-1} \leq T_i .A \lt a_j * sélection ("A between x and y") : ''select * from R where 10 ≤ R.A < 100'' On se rapproche à des fragmentation qui ressemble aux requêtes. === Fragmentation Horizontale par sélection === | nclient | nom | ville | ^ C1 ^ Dupont ^ Paris ^ | C2 | Martin | Lyon | ^ C3 ^ Martin ^ Paris ^ | C4 | Smith | Lille | ''create table client1 as select * from client where ville = 'Paris'; '' | nclient | nom | ville | ^ C1 ^ Dupont ^ Paris ^ ^ C3 ^ Martin ^ Paris ^ ''create table client2 as select * from client where ville != 'Paris' ;'' | nclient | nom | ville | | C2 | Martin | Lyon | | C4 | Smith | Lille | Une partie où ''ville = Paris'' et l'autre avec ''ville != Paris''. On peut reconstituer la table initiale par union ''create view client as select * from client1 union select * from client2;'' === Fragmentation selon n prédicats === FIXME voir slide ==== Fragmentation horizontale dérivée ==== Utilisation d'une clè étrangère: ''create table cde1 as select cde.* from cde, client1 where cde.client = client1.nclient'' ''create table cde2 as select cde.* from cde, client2 where cde.client = client2.nclient'' Propriétés de la fragmentation horizontale dérivée FIXME : recopier formules de slide 13 * R : fragmentation horizontale -> fragments Ri * S : fragmentation horizontale dérivée -> fragments Si * complète * disjointe * reconstructible * => contrainte d'intégrité référentielle ==== Fragmentation Verticale ==== * exemple : ''sdss sky server'' * Fragments définis par projection * ''cde1 = cde(ncde, nclient)'' * ''cde2 = cde(ncde, produit, qté)'' * Reconstruction === Propriétés === FIXME : copier de slide 15 === Matrice d'affinité des attributs === ===== Allocation des Fragments ===== ===== Fragmentation des Requêtes ===== ==== Evaluation de Requêtes Réparties ==== Un moteur de requête analyse la fragmentation par rapport au schéma de fragmentation, et génère des requêtes sur fragments. Puis, il fait une optimisation avec le schéma d'allocation. === Exemple d'évaluation simple === | ''select A from R where B=b'' | ^ fragmentation : R = R1 ∪ R2 ^ | ''select A from R1 where B=b union select A from R2 where B=b'' | ^ Optimisation : ^ | R1 = R1@Site1 \\ R2=R2@Site2 \\ R2=R2@Site3 | ^ Réécriture | mettre la requete sous forme d'un arbre algébrique (feuille = relation, noeud = op. relationnel | ^ Reconstruction | remplacer chaque feuille par le programme de reconstruction de la relation globale | ^ Transformation | appliquer des techniques de réduction pour éliminer les opérations inutiles | ^ Notations utilisées | S : select \\ J : join \\ P : project | === Reconstruction === FIXME voir slide 26 === Réduction pour la fragmentation horizontale === __Règle :__ éliminer l'accès aux fragments inutiles. Exemple : * Client1 : Client where ville ='Paris' * Client2 : Client where ville != 'Paris' * ''select * from Client where ville='Lyon' '' * => inutile de consulter ''Client1'' car ''Lyon'' n'est jamais ''Paris'' === Réduction pour la Fragmentation Verticale === __Règle :__ éliminer l'accès aux relations de base qui n'ont pas d'attributs utiles pour le résultat final * Cde1 : Cde(ncode, nclient) * Cde2 : Cde(ncode, produit, qt2) * ''select nclient from Cde'' * On a besoin des deux attributs de Cde1, et que l'attribut ncde de Cde2 pour la jointure * Or Pncde(Cde1) = Pncde(Cde2) donc la jointure est inutile === Réduction pour la framgentation horizontale dérivée === __Règle__ distribuer les jointures par rapport aux unions et appliquer les réduciton pour la fragmentation horizontale ^ Exemple ^ | FIXME : slides 28-31 ===== Optimisation des Requêtes =====