• [^] # Re: Séparer stockage (relationnel) et recherche

    Posté par . En réponse à la dépêche Petit état des lieux du NoSQL. Évalué à 1.

    Je n'ai jamais eu a faire de benchmark, je ne sais pas quelles optimisations sont faites ou pas, mais je vois deux autres requêtes.

    Avec des opérateurs ensemblistes :

    SELECT p.*
    FROM Post AS p
     JOIN Post_Tag AS pt ON (p.id = pt.post_id)
    WHERE pt.tag_id = 22
    MINUS
    SELECT p.*
    FROM Post AS p
     JOIN Post_Tag AS pt ON (p.id = pt.post_id)
    WHERE pt.tag_id = 23
    
    

    Pour cette seconde, je suis à peu près certain que c'est possible mais, je ne suis vraiment pas certain de la syntaxe :

    SELECT p.*
    FROM Post AS p
     JOIN Post_Tag AS pt ON (p.id = pt.post_id),
     Post_Tag AS pt2
    WHERE pt2.tag_id = 23
     AND pt.tag_id = 22
     AND pt.post_id NOT IN pt2.post_id
    
    

    Dans la première le SGBD charge probablement 2 fois les deux tables (ce qui ne pose un problème pour la consommation mémoire mais pas pour les accès disques). Pour la seconde il lit une fois Post et 2 fois Post_Tag, mais il a l'avantage de ne pas faire des partitionnement et des regroupements (je ne sais pas si c'est efficace ou pas).

    Ensuite si vraiment tu as trop de données tu peux regarder du coté des partitionnements de table. Ça peut permettre de diviser par 2 ou 3 la taille des données si c'est bien choisi (et si ça s'y prête bien).

    Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)