2013-03-14 9 views
-1

Je souhaite créer une vue pour laquelle j'aurai besoin d'une requête dans laquelle je me joindrai. Je suis inquiet au sujet de ses performances et de son comportement, car il va chercher une bonne quantité de données. Les détails de la table et la requête sont comme suit (tableau d'origine a plus de colonnes et j'exigerons des résultats de plusieurs colonnes, ce qui est juste pour vous présenter un exemple): -
Personne Tableau
Affichage de l'auto-jointure sur la table

PK NAME  SPOUSE_REF_ID IS_MARRIED 
1 John   Null    Y 
2 Alice   1    Y 
3 Varvatos  Null    Y 
4 Barbara  5    Y 
5 Stanely  Null    Y 
6 Ross   Null    N 
7 Henry   Null    N 

Je dois interroger les données de ceux qui sont mariés et qui ont leur conjoint_ref_id avec eux. Ainsi, la requête i est faite: -

select a.NAME spouse_name, a.SERVICE_NO, a.id,a.employment_category_id, pf.name name, pf.service_no,pf.id, 
    pf.employment_category_id 
    from person a 
inner join person pf on 
    a.id = pf.spouse_ref_id 
    where a.IS_MARRIED ='Y' 

S'il vous plaît me conseiller au sujet de son optimisation et si vous pensez que la requête de restructuration va chercher de meilleurs résultats ou auto jointure est souhaitable dans les requêtes etc etc ..
Je vous serais reconnaissant un répondre ayant une vue optimisée.

+1

Avez-vous des questions ou un problème? – JodyT

+2

Puisqu'un auto-joint est la seule façon de faire cela, il n'y a pas grand-chose d'autre à faire. Parfois, vous pouvez remplacer une auto-jointure par une fonction analytique mais pas dans ce cas. –

Répondre

-2

Lorsque vous interrogez une vue, en arrière-plan, la requête utilisée pour construire la vue est exécutée, puis les données appropriées vous sont renvoyées.

Parfois, j'ai remarqué que l'utilisation d'une clause where avec une jointure récupère des résultats qui ne sont pas attendus. Donc, je vous suggère de modifier votre requête initiale à ce qui suit: -

select a.NAME spouse_name, a.SERVICE_NO, a.id,a.employment_category_id, pf.name name, pf.service_no,pf.id, 
    pf.employment_category_id 
    from person a 
inner join person pf on 
    a.id = pf.spouse_ref_id 
    and a.IS_MARRIED ='Y' 

Une autre optimisation que vous pouvez faire est de créer un (index unique)/(index) sur spouse_ref_id. Cela garantira que, lorsque vous effectuez une jointure automatique, et non sera une analyse de table complète pour les deux instances. Je ne suis pas sûr si la requête suivante pourrait produire des résultats encore meilleurs ou ce que vous vouliez (mais vaut le coup): -

select a.NAME spouse_name, a.SERVICE_NO, a.id,a.employment_category_id, pf.name name, pf.service_no,pf.id, 
     pf.employment_category_id 
     from person a 
    inner join person pf on 
     a.id = pf.spouse_ref_id 
     and a.IS_MARRIED ='Y' 
     and pf.IS_MARRIED='Y' 
+2

Je ne suis pas du tout d'accord avec le conseil de mettre à la fois les prédicats et les conditions de jointure dans la clause 'ON'. Cela peut améliorer la lisibilité dans certains cas, mais cela ne vous évitera pas de résultats inattendus. Plus de détails sont requis pour soutenir l'affirmation selon laquelle une méthode d'interrogation extrêmement commune devrait être évitée. –

+0

+1 pour le commentaire @jonearles - la seule fois où j'ai trouvé utile de mettre des conditions semblables dans la jointure est dans les jointures externes. –

Questions connexes