Grand set de données possible à partir de la sous-requête?

Je ne peux pas vous montrer mon problème et ma requête en raison de sa complexité, mais je vais simplifier le problème en un autre.

Voici:

Il y a 5 tables, contenant des informations sur les pommes, les voitures, les livres, les ordinateurs et les vêtements. Chaque table de ce qui précède peut avoir des commentaires et tous les commentaires sont stockés dans une seule table appelée Comments (avec une colonne user_id ). Et pour lier ces 5 tables avec leurs propres commentaires, j'ai dû créer 5 autres noms de tables de liens AppleComments , CarComments , BookComments , et ainsi de suite.

Ma requête veut récupérer tous mes commentaires de ces 5 types de catégories.

Je peux penser à deux façons, l'une plus vite que l'autre.

  1. Je peux joindre les 5 tables avec sa table de binding et ensuite avec des commentaires where comments.user_id = me et ensuite UNION TOUS les résultats dans 1 jeu de résultats:

     SELECT <column_names> FROM AppleComments INNER JOIN Comments ON AppleComments.comment_id = Comments.comment_id WHERE Comments.user_id = me UNION ALL SELECT <column_names> FROM CarComments INNER JOIN Comments ON CarComments.comment_id = Comments.comment_id WHERE Comments.user_id = me etc... 
  2. Je peux sélectionner tous les id-s de commentaires des tables de linkin avec union all et ensuite joindre cette sous-requête à la table Comments pour get les autres informations à leur sujet.

     SELECT <column_names> FROM ( Select AppleComments.comment_id FROM AppleComments UNION ALL Select CarComments.comment_id FROM CarComments UNION ALL Select BookComments.comment_id FROM BookComments UNION ALL Select ComputerComments.comment_id FROM ComputerComments UNION ALL Select ClothesComments.comment_id FROM ClothesComments) AS items INNER JOIN Comments ON items.comment_id = Comments.comment_id WHERE Comments.user_id = me 

Le second est plus rapide et produit un plan d'exécution plus petit.

Le problème est, puisque la sous-requête 'items' de ex. 2 sélectionne tous les commentaires de la database, puis les jointures internes avec la table des commentaires, ce qui me préoccupe, c'est que cela ne fonctionnera pas correctement avec trop de lignes. Peut-être trop de memory?

À l'heure actuelle, je ne peux pas le dire puisque 90% des commentaires sont à moi, mais en jugeant un peu chaque exemple, je dirais que le premier est celui qui récupère de plus petites quantités de données (par total).

Et s'il y a 1 million de commentaires dans la BD et seulement 100 des miens …

Merci.

Votre intuition est correcte. UNION ALL peu près les chances d'optimization sur la route. Faites tout ce que vous pouvez avant de vous syndiquer. la première approche est la bonne.

Sauf que cela pose la question de savoir pourquoi avez-vous des choses similaires dans cinq arrays différents, et pourquoi avez-vous même des tables de binding dans ce qui semble être une relation 1-to-n? Une seule table avec un champ itemtype ne suffirait-elle pas? Si vous avez des données supplémentaires, alors j'ai des liens étrangers optionnels vers des tables de données supplémentaires, c'est ce que je ferais …

Bien sûr, c'est un univers inventé, je n'ai pas la moindre idée de votre problème d'origine 🙂