0
votes

Estimation du nombre d'enregistrements dans une requête SQL après plusieurs jointures internes

J'ai 5 tables: Person, Table1, Table2, ... Table4 et la requête dont je dois évaluer son coût dans la méthode que je souhaite.

select *
from Person P 
inner join
Table1 T1 on P.ID = T1.ID 
inner join
Table2 T2 on P.ID = T2.ID 
inner join
Table3 T3 on P.ID = T3.ID
inner join
Table2 T4 on P.ID = T4.ID
group by p.ID

La clé primaire de Person est ID, et chacune des autres tables a une clé étrangère vers Person.ID.

Je connais également le nombre d'enregistrements dans chaque tableau et que 90% des personnes dans la table Person apparaissent dans le tableau1

60% des personnes apparaissent dans le tableau2

70% des personnes apparaissent dans le tableau3

55% des personnes apparaissent dans le tableau4

(Les doublons des personnes sont autorisés dans chacun des tableaux1, ... tableau2)

Je n'ai pas non plus de données sur quelle personne se trouve dans quelle / table / table.

Maintenant, après l'exécution des jointures internes, existe-t-il une méthode pour estimer le nombre total d'enregistrements dans le relation créée à partir des données afin de calculer le coût du tri dans la clause group by?

Merci d'avance


0 commentaires

4 Réponses :


1
votes

Quelque part entre 0% et 55%. Si vous faites l'hypothèse statistique familière que les valeurs sont indépendantes, vous pouvez calculer une estimation comme:

0.9 * 0.60 * 0.70 * 0.55

qui est d'environ 20%. Cependant, l'indépendance est une hypothèse assez forte. Sans connaissance des données et des distributions sous-jacentes, je conserverais la plage de sécurité comprise entre 0% et 55%.

De plus, cette estimation est basée sur le fait d'avoir au plus une correspondance dans les "autres" tables . Si vous avez plusieurs correspondances, l'estimation pourrait bien sûr exploser. Et, vous n'avez pas mentionné la base de données que vous utilisez, mais les bases de données SQL ne trient pas nécessairement les données pour group by .


2 commentaires

J'ai également oublié de mentionner que j'ai des données sur le nombre d'enregistrements dans chaque table. Comment suis-je censé utiliser exactement l'expression 0,9 * 0,60 * 0,70 * 0,55? Vous voulez dire que dans chaque tableau, le nombre d'enregistrements qui se chevauchent selon cette hypothèse est de 0,9 * 0,60 * 0,70 * 0,55 * nombre (*)?


@OriLev. . . Votre question porte sur la proportion d'identifiants correspondants. Les autres lignes des tableaux supplémentaires ne sont pas pertinentes.



1
votes

Dans la plupart des cas, l'utilisation de COUNT (*) s'exécute en moins d'une minute et vous n'aurez pas à utiliser d'estimation.

Étant donné que vous évaluez uniquement T1 à T [N] , il est pratiquement impossible d'estimer le nombre réel de lignes car nous ne connaissons pas le degré de chevauchement entre T2 , T3 et T4 .

La seule hypothèse réelle que nous pouvons faire est que T4 , avec un chevauchement de 55%, est la limite supérieure maximale en utilisant un INNER JOIN . En fin de compte, en utilisant INNER JOIN , les résultats seront compris entre 0% de T1 et 55% de T1 .


0 commentaires

0
votes

Vous pouvez essayer la requête ci-dessous comme exemple pour obtenir le nombre et le% d'enregistrements correspondants

  SELECT   
  (t1.count(*)/p1.count(*))*100 as "t1%", 
   (t2.count(*)/p1.count(*))*100 as "t2%", 
   (t3.count(*)/p1.count(*))*100 as "t3%" 
  FROM 
  PERSON 
   P1 
 LEFT JOIN TABLE1 T1
  ON 
 P1.PERSONID=T1.PERSONID
 JOIN TABLE1 T2
  ON 
 P1.PERSONID=T2.PERSONID 
 JOIN TABLE3 T3 
  ON 
 P1.PERSONID=T3.PERSONID 


0 commentaires

0
votes

Je pense que vous devez trouver le pourcentage basé sur le nombre total de personnes dans le tableau PERSON .

Votre requête ne prendra en compte que les personnes incluses dans la relation ( car INNER JOIN est utilisé dans votre requête) mais qu'en est-il des autres personnes qui ne sont pas incluses dans la relation, cela signifie ne figurant dans aucune des tables répertoriées.

Vous avez besoin de la requête suivante pour connaître le pourcentage:

SELECT   
  (count(DISTINCT T1.PERSONID)/count(DISTINCT P1.PERSONID))*100 AS T1_PRCENTAGE, 
  (count(DISTINCT T2.PERSONID)/count(DISTINCT P1.PERSONID))*100 AS T2_PRCENTAGE,
  (count(DISTINCT T3.PERSONID)/count(DISTINCT P1.PERSONID))*100 AS T3_PRCENTAGE,
  FROM 
  PERSON 
   P1 
 LEFT JOIN TABLE1 T1
  ON 
 P1.PERSONID=T1.PERSONID
 LEFT JOIN TABLE1 T2
  ON 
 P1.PERSONID=T2.PERSONID 
 LEFT JOIN TABLE3 T3 
  ON 
 P1.PERSONID=T3.PERSONID;

J'ai utilisé LEFT JOIN pour considérer toutes les personnes de PERSON table qui sera nécessaire pour compter le pourcentage.

Cheers !!


0 commentaires