[sql] optimisation requete sql

optimisation requete sql [sql] - SQL/NoSQL - Programmation

Marsh Posté le 05-03-2004 à 21:29:40    

voila jai une requette qui prend pas mal de temp :
 
select distinct P.NAME_SEC,LI.USRCRITLINE,L.REF_USRCRIT from USRCRITLIST L,USRCRITLINE LI,TMP_PROFILER P where  L.REF_USRCRIT not in  (select T.REF_USRCRIT from TMP_PROFILER T where T.ID_SEC = P.ID_SEC  )  and L.REF_USRCRITLINE = LI.ID_USRCRITLINE order by ID_SEC
 
jai dabord pense a changer mon distinct par un group by mais apparament ca change pas grand chose
le not in (qui ralenti tout) jai pas reussi a le remplacer par un not exists a cause du where deja existant  
 
si qqn a une idee...
 
sinon existe til dans le commerce un logiciel qui permettrait doptimiser les requetes sql ?


Message édité par red faction le 05-03-2004 à 22:41:32
Reply

Marsh Posté le 05-03-2004 à 21:29:40   

Reply

Marsh Posté le 05-03-2004 à 23:06:09    

tes champs sont pas assez explicites, j'arrive pas à me représenter ta base en tête...
 
tu pourrais poster la description de tes tables et ce qu'elles contiennent ?
 
sinon, j'ai quand même l'impression que t'as un problème de conception à la base... je me sert jamais de distinct... si t'en as, c'est que t'as une table qui doit pouvoir être splittée en deux, où alors y'a ujn truc qui cloche dans ta requête... j'ai du mal à concevoir ce qu'on peut faire avec des données sans filtre discriminant à par un count/sum/avg...

Reply

Marsh Posté le 05-03-2004 à 23:07:41    

sinon, le exist, tu peux quand même l'utiliser... suffit de rajouter dans la sous-requête "and T.REF_USRCRIT = L.REF_USRCRIT" logiquement.

Reply

Marsh Posté le 06-03-2004 à 00:35:52    

normal que ca rame car tu a ta table "tmp_profiler P" qui n'est pas linkée avec une autre donc il va parcourir ta table entièrement à chaque ligne même avec le distinct
sinon pour ce que tu veux faire, essaye toujours avec :
 
select P.NAME_SEC,LI.USRCRITLINE,L.REF_USRCRIT from USRCRITLIST L,USRCRITLINE LI where  L.REF_USRCRIT not in  (select REF_USRCRIT from TMP_PROFILER)  and L.REF_USRCRITLINE = LI.ID_USRCRITLINE order by ID_SEC  
 
ca devrait te donner le même résultat mais en un peu plus rapide ..


Message édité par bill_clinton le 06-03-2004 à 00:37:13
Reply

Marsh Posté le 06-03-2004 à 00:42:56    

bill_clinton a écrit :

normal que ca rame car tu a ta table "tmp_profiler P" qui n'est pas linkée avec une autre donc il va parcourir ta table entièrement à chaque ligne même avec le distinct
sinon pour ce que tu veux faire, essaye toujours avec :
 
select P.NAME_SEC,LI.USRCRITLINE,L.REF_USRCRIT from USRCRITLIST L,USRCRITLINE LI where  L.REF_USRCRIT not in  (select REF_USRCRIT from TMP_PROFILER)  and L.REF_USRCRITLINE = LI.ID_USRCRITLINE order by ID_SEC  
 
ca devrait te donner le même résultat mais en un peu plus rapide ..


ta retiré tmp_profiler du premier select c ca ?
jpourrait plus avoir name_sec alors

Reply

Marsh Posté le 06-03-2004 à 00:45:15    

vi, elle est buggé sa requête :)
 
maos je suis d'accord avec la première partie : lie ta table avec les autres.

Reply

Marsh Posté le 06-03-2004 à 00:46:47    

sinon je posterait un schema avec les tables importantes (3 ou 4) comme ca si qqn sait maider...
 

Reply

Marsh Posté le 06-03-2004 à 01:30:53    

http://users.skynet.be/fa218598/schema.jpg
 
Bon jvais essayer de faire simple (spa gagné) :
 
Jai un ensemble d?objets et pour chaque objet je peut associer un critere et une valeur par exemple :
a lobjet  «Voiture» jassocie le  critere «couleur» et la valeur « bleu » puis aussi le critere « matiere » et  la valeur « metal »
Les relations entre les objets et les critere et valeurs qui lui sont associees sont réalisée grace a la table « relobject »
 
 
ensuite je doit pouvoir effectuer des recherches sur ces objets suivant leur valeurs qui leur ont ete  associees
 
Pour cela je definit une page dans lequel je vais placer des lignes (represente par la table LIGNE)
Et des colonnes qui sont en fait des criteres
 
Dans lintersection dune ligne et une colonne je place des valeurs
 
Page : test
         Couleur         Marque         Année          Type
Ligne 1  rouge,vert                    93,94,95            
Ligne 2                  BMW,Audi               Break, 3portes
Ligne 3
Ligne 4  jaune,rouge
 
 
Les relations entre lignes, colonnes et valeur sont faites grace a la table LISTE
 
Par exemple pour correspondre a ligne 1 y faut soit quelle soit rouge soit verte  ET quelle soit de 93 94 ou 95
pour la ligne 4 elle doit etre soit jaune soit rouge
 
Au final, je doit afficher pour chaque objet les lignes qui lui correspondent, et surtout pourquoi (a cause de quels valeurs)
 
dans lexemple de la voiture du debut on  a la ligne 4 car elle est rouge mais pas la ligne 1 parce quil lui manque lannee (on c pa de quelle annee elle est)
 
Au depart javais fait ca par programmation , mais cetait 1000x trop lent (jai a peu pres 8000 objetcs et pleins de valeurs associees a ces objets)
et comme je peut pas utiliser de procedure stockee... donc faudrait que je fasse tout dans une requete
 
jespere que certain on eu le courage de tout lire et pourront maider  :)  
ne chercher pas le lien avec la requete du dessus certains noms on ete modifies (pour faire plus simple) puis la table qui etait la est une table temporaire dont jaimerai bien me passer  :o


Message édité par red faction le 06-03-2004 à 11:46:07
Reply

Marsh Posté le 06-03-2004 à 01:54:55    

lol, j'avais oublié que tu voulais aussi name_sec, alors ca serait du style :
 
select P.NAME_SEC,LI.USRCRITLINE,L.REF_USRCRIT from USRCRITLIST L, USRCRITLINE LI
  left join tmp_profiler p on p.[ton_id] = [LI/L].[ton_id]
    where  L.REF_USRCRIT not in  (select REF_USRCRIT from TMP_PROFILER)  and L.REF_USRCRITLINE = LI.ID_USRCRITLINE order by ID_SEC
 
sinon pour le post du dessus j'ai pas du tout pigé ce que tu voulais faire ..


Message édité par bill_clinton le 06-03-2004 à 01:58:41
Reply

Marsh Posté le 06-03-2004 à 03:05:11    

verrai ça demain...
 
ton système de descripteur m'a l'air bancal, mais je suis trop naze pour y réfléchir :D pis faut que je remette d'aplomb mon serveur que j'ai sauvagement planté :sweat:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed