Problème requête SQL

Problème requête SQL - SQL/NoSQL - Programmation

Marsh Posté le 05-01-2006 à 14:43:14    

Bonjour,
je dois créer une requête qui fait un count d'une colonne.
Dans ma clause where, j'ai différentes conditions dont un not in.
Voici le code  

Code :
  1. select count(colonne)
  2. from table1, table2, table3
  3. where table2.col1<>'2' and table2.col2= ' ' and table3.col1 like '0%'and table3.col2='p'
  4. and table1.id =table2.id and table1.id = table3.id  and substr(table1.id,length(table1.id)-2)='49' and table1.id not in (select soustable.col1 from soustable)


 
les 2 requêtes, séparément s'ecute relativement vite.
la 1ère ramène environ 3000 rows tandis que la seconde 130000.
Au bout d'une heure ma reuqête n'est pas terminée.
Est ce que quelqu'un a une idée pour rendre plus performante cette requête.
 
 
J'ai trouvé une requête qui s'execute vite mias je me demande si la syntaxe est correte:
la voici:
 

Code :
  1. select count(idpor)
  2. from (select idpor
  3. from mkt.fdidet@crmpfr1p, mkt.fdcart@crmpfr1p, mkt.fdpart@crmpfr1p
  4. where cadad<>'21001231' and camot= ' ' and fdpart.patvo like '06%'and fdpart.pacl1='Y'
  5. and idpor = capor and idpor = papor  and substr(idagr,length(idagr)-2)='492'
  6. minus
  7. select expor from mkt.EX383181@crmpfr1p)

Reply

Marsh Posté le 05-01-2006 à 14:43:14   

Reply

Marsh Posté le 05-01-2006 à 15:57:37    

commence par remplacer ton "not in" par un "not exists".
 
tu devrais déjà gagner énormément de temps. (les IN, c'est mortel, alors qu'un EXISTS, ça fait simplement une jointure, c'est le jour et la nuit)

Reply

Marsh Posté le 05-01-2006 à 17:15:48    

il ne me renvoit aucune valeur

Reply

Marsh Posté le 05-01-2006 à 17:44:41    

regarde la doc du exists hein... c'est pas synonyme de in, faut fairequelques modifs quand même

Reply

Marsh Posté le 05-01-2006 à 17:47:23    

c'est bon moi avoir suivi des études en bases de données, moi avoir

Reply

Marsh Posté le 05-01-2006 à 17:48:34    

ben alors dit pas bêtement "il me renvoit aucune valeur", puisque toute clause "in" portant sur une sous-requête peut être remplacée pas une clause "exists" et ça donne le même résultat.
c'est donc que tu l'as mal écrite.

Reply

Marsh Posté le 05-01-2006 à 17:52:54    

mais je ne dis pas bêtement il ne me revoit aucune valeur.
Tu pourrais me parler autrement.
Tu connais rien au gens et tu ramènes ta science...

Reply

Marsh Posté le 05-01-2006 à 19:25:55    

Attends, je t'arrête tout de suite.
 
Moi je te répond comme tu me parles. C'est pas moi qui ai commecé à écrire en petit nègre genre "vas-y prends-moi pour une conne, je te dirai rien".
Je te donne un conseil, tu me réponds simplement "ça marche pas", sans même poster le requête que t'as testé. Comment veux-tu qu'on t'aide ?
 
L'année 2006 promet d'être terrible... Vous avez quoi tous en ce moment à être inbuvables et insultants ? J'ai pas que ça à foutre que de venir filer des coups de main sur ce forum. Et c'est pas pour l'aide que j'en reçois que je peux dire que ça m'est bénéfique.
 
Tu te rammène comme une fleur avec deux requête qui, sans aucune info, ne nous permet pas de voir en quoi elles sont utiles, ni ce que tu veux faire. Et tu nous demande un coup de main.
Si y'a que moi qui me suis pris la peine de te répondre, c'est pas pour rien : ta question, c'est une cause perdue, on sait ni ce que tu veux faire, ni à partir de quoi, ni même avec quel SGBD. J'arrête le masochisme, et je m'emmerde plus à tenter de filer des coups de main à ceux qui sont pas foutus d'exposer leur problème clairement.
Tant pis pour ceux qui débuttent et qui ne savent pas par où s'y prendre, moi j'en ai marre de me faire recevoir de la sorte quand j'essaie d'aider quelqu'un en dépit de tout.


Message édité par Arjuna le 05-01-2006 à 19:26:05
Reply

Marsh Posté le 05-01-2006 à 19:28:47    

Pour information, "MINUS" est supporté par un nombre très réduit de SGBD, et pour cette raison je te déconseille de l'utiliser.
Deplus, la plupart des éditeurs de SGBD qui implémentent cette fonction restent très humbles en annonçant que les perfs ne seront pas forcément au rendez-vous car étant donné que peu de monde utilise cette fonction, ils préfèrent concentrer leurs efforts d'optimisation sur les parties courrament utilises (genre les not exists...)

Reply

Marsh Posté le 06-01-2006 à 08:32:08    

hey tu devais plus répondre :fou: :fou:


---------------
Hobby eien /人◕ ‿‿ ◕人\
Reply

Marsh Posté le 06-01-2006 à 08:32:08   

Reply

Marsh Posté le 06-01-2006 à 08:55:56    

Tant pis je n'aurais pu ton aide...
et je ne vois pas qu'est ce que ça rapporterait si je te disait ce que ramène cette requête...
la chose serait la même...
j'ai besoin de données d'une table qui ne doivent pas être dans une autre table.
C'est tout ce que je peux dire...Mais bon c'est pas grave....
Merci de ton AMABILITE...tchao

Reply

Marsh Posté le 06-01-2006 à 09:11:40    

tu ne connais manifestement rien des SGBD (sinon tu aurais indiqué les infos utiles qui nous aurait permis de t'aider). Engage plutot quelqu'un qui s'y connait, ca ira plus vite. Y'a plein d'informaticien de dispo sur le marché du travail.


---------------
Hobby eien /人◕ ‿‿ ◕人\
Reply

Marsh Posté le 06-01-2006 à 09:18:26    

Ok ok...je l'avoue...je n'ai pas fait d'études en sgbd, requ^tage, ca ne fait pas 2 ans que je travaille dedans..non...
Enfin j'ai trouvé un autre forum où les personnes doivent mieux s'y connaitre que vous (explain plan, performances et tout) je vais donc de ce pas me désinscire...et bonne continuation à votre site.

Reply

Marsh Posté le 06-01-2006 à 09:32:07    

lol, ils en sont à te demander un explain plan pour ce genre de problème ?

Reply

Marsh Posté le 06-01-2006 à 11:03:18    

deja je vois un moyen d'optimiser de facon drastique la requete, si c'etait du DB2... Bien sur, comme on ne sait rien...


---------------
Hobby eien /人◕ ‿‿ ◕人\
Reply

Marsh Posté le 06-01-2006 à 11:47:02    

Ca m'intéresse ton truc pour DB2, même si j'ai jamais eu l'occasion de m'en servir, ça peut toujours être intéressant :)

Reply

Marsh Posté le 06-01-2006 à 11:53:11    

dans db2 il ne faut jamais utiliser de fonctions (genre les substr que je vois la), ca te plombe des requetes d'une facon assez impressionnante [:chrisbk]
 
En DB2 7.2 du moins :o


---------------
Hobby eien /人◕ ‿‿ ◕人\
Reply

Marsh Posté le 06-01-2006 à 12:20:42    

Ah ? C'est tout ?
 
C'est pareil avec tous les SGBD, mise à part quelques fonction, généralement ça fait claquer les index, puisque "substr(toto, 2, 1)" ne sera pas dans le même ordre que "toto", et ça fait pareil avec la plupart des fonctions ;)

Reply

Marsh Posté le 06-01-2006 à 12:50:06    

oui mais la c'est sans communes mesures... meme apres tuning de base...


---------------
Hobby eien /人◕ ‿‿ ◕人\
Reply

Marsh Posté le 06-01-2006 à 14:12:20    

je dirais "surtout" après tuning de la base ;)
 
puisque 80% du tuning vient de la gestion des index ;)

Reply

Marsh Posté le 06-01-2006 à 14:18:37    

pas sur DB2 :D


---------------
Hobby eien /人◕ ‿‿ ◕人\
Reply

Marsh Posté le 06-01-2006 à 14:28:34    

Bravo claralavraie pour ta boulettitude.
 
Une personne t'aide et tu l'envoi chier, ben tu ne mérites pas que quelqu'un prenne du temps pour toi.

Reply

Marsh Posté le 06-01-2006 à 15:21:08    

bien dit Worldofdada !


---------------
Hobby eien /人◕ ‿‿ ◕人\
Reply

Marsh Posté le 06-01-2006 à 16:05:09    

http://forum.hardware.fr/hardwaref [...] m#t1278265
 
Histoire de mettre les point sur les I (en maj, y'en a pas c'est rigolo :D) histoire de voir que :
1) Le NOT EXISTS est effectivement la meilleur solution
2) Le NOT EXISTS retourne les mêmes valeurs qu'un NOT IN, quand on sait l'écrire
3) Ici aussi on sait faire des Explain Plans et on sait même les interpréter (terrible non ?)

Reply

Marsh Posté le 06-01-2006 à 17:39:39    

Faut juste faire attention à la gestion de la valeur NULL ...
 
Et puis je suis certain qu'il y a des exemples où le NOT IN est plus rapide que le NOT EXISTS, sur certains SGBD, donc ne pas généraliser : TESTER !

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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