2011-11-21 2 views
1

Pour votre amour, je ne vais pas tout coller ici, sachez que c'est long et qu'il y a beaucoup de groupes.Comment puis-je améliorer cette requête monstre de jointure multiple?

La structure de la table, je travaille sur, à sa plus compliquée, ressemble à ceci:

tables = Co, Cn, O, A, N; 
scheme (simplified): 
N(n)-> (1)every other table 
A(n)-> (1)(every other table except N 
O(n)-> (1)Co, Cn 
Cn(n) -> (1)Co 
Co(1) -> (1)cn 

La partie la plus laborieuse de la requête va creux de la structure comme ça (je suis en train d'obtenir des informations à partir du tableau N, mais aussi des autres):

N join A join O join ((Co join Cn) union (Cn join Co)) 

Je dois obtenir le contenu de N mais je dois aussi des trucs de Co et Cn mais je dois faire une dépression et O pour les obtenir. Maintenant, cela peut ne pas sembler être une requête énorme, mais N peut également se rapporter à chacune de ces autres tables et j'ai besoin de les obtenir toutes. Disons simplement que je ne peux pas voir le contenu de la requête si je lui fais écho dans l'application. Je rejoins chaque cas séparément (N-> A, N-> O, N-> Cn, etc) et puis les attrape tous avec UNION

À l'heure actuelle, avec près de 200 000 lignes dans N et quelques centaines à près d'un millier dans chacun des autres tableaux, le serveur de base de données et le site Web se bloque lorsque j'essaie d'exécuter la requête. Une solution à laquelle je pensais était d'abandonner les clés étrangères et de faire un champ pour les liens qui va, pour un exemple de N par tous les autres: "A_IdA, O_IdO, Co_IdCo, Cn_IdCn", et le traiter en php; mais je préfère essayer autre chose avant un changement aussi radical dans la conception de la table.

+0

Quelles sont les relations exactes entre les tables? Par exemple, entre «N» et «A», est-ce que «1: 1», «1: n» ou «n: 1»? –

+1

L'instruction select actuelle rendrait les choses beaucoup plus claires. Sûrement l'instruction select pour 6 jointures ne peut pas être ** longue **. – Johan

+0

Je vais essayer de clarifier un peu la situation. – Bogdan

Répondre

0

J'ai du mal à comprendre la structure et la requête de votre table. Cependant, j'ai l'impression que vous essayez de combiner trop en une requête, ce qui rend la connexion extrêmement stressante sur le serveur de base de données. Vous feriez probablement mieux d'effectuer plusieurs requêtes plus simples, puis d'essayer de tout faire dans une requête énorme.

+0

Oui, j'ai pensé à cela, mais j'ai besoin que le résultat soit dans une seule table pour la sortie finale. Sinon, nous devrons changer la structure de base de notre code et ça cessera d'être rétrocompatible. – Bogdan

Questions connexes