1

En fait d'une optimisation, j'aimerais surtout savoir pourquoi fragmentée la requête passe (un peu lente, mais elle passe quand même)

En gros, j'ai besoin de récupérer un certain nombre d'informations sur des Maîtres de stages (nom, prénom, établissement...)
Je ne veux que les Maîtres de stage ayant le statut "Recruté" ou "Recrutable" (il existe d'autres statuts que je veux, tous commencent par "Recrut") OU les Maîtres de stage ayant un stagiaire (on sait qu'un Maître a un stagiaire lorsqu'il existe un stage qui possède un maître et un stagiaire).
Un Maître peut avoir plusieurs stages/stagiaires, mais je ne veux qu'une fois l'information.
Ah, et je ne veux que les stages de type RESP ou PA...

SELECT 	mds.no_maitre_stage, mds.civilite, mds.nom_usuel, mds.prenom, mds.discipline, mds.numen,
		e.no_etablissement, e.libelle_etablissement, e.rue, e.cp, e.localite
FROM maitre_stage mds, stage s, stagiaire st, etablissement e
WHERE
	(
		(
			s.type_stage = 'RESP'
		)
		OR
		(
			s.type_stage = 'PA'
		)
	)
	AND
	(
		(
			statut_recrutement LIKE 'Recrut%'
		)
		OR
		(
			(
				UCASE( mds.statut_recrutement ) NOT LIKE 'RECRUT%'
			)
			AND
			(
				s.no_correspondant = mds.no_maitre_stage
			)
			AND 
			(
				st.no_stagiaire = s.no_stagiaire
			)
		)
	)
	AND
	(
		(
			(
				mds.nom_usuel <> ''
			)
			AND
			(
				mds.prenom <> ''
			)
			AND
			(
				mds.prenom <> '-'
			)
			AND
			(
				mds.nom_usuel <> '-'
			)
			AND
			(
				mds.prenom <> '.'
			)
			AND
			(
				mds.nom_usuel <> '.'
			)
			AND
			(
				UPPER( mds.nom_usuel ) <> 'ZZ%'
			)
			AND
			(
				UPPER( mds.prenom ) <> 'ZZ%'
			)
		)
	)
	GROUP BY mds.no_maitre_stage
avatar

2

Euuuh en fait j'ai oublié les jointures grin
avatar

3

ce qui donne au final ?
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

4

SELECT 	mds.no_maitre_stage, mds.civilite, mds.nom_usuel, mds.prenom, mds.discipline, mds.numen,
e.no_etablissement, e.libelle_etablissement, e.rue, e.cp, e.localite
FROM maitre_stage mds, stage s, stagiaire st, etablissement e
WHERE
	(
		(
			s.type_stage = 'RESP'
		)
		OR
		(
			s.type_stage = 'PA'
		)
	)
	AND
	(
		(
			statut_recrutement LIKE 'Recrut%'
		)
		OR
		(
			(
				UCASE( mds.statut_recrutement ) NOT LIKE 'RECRUT%'
			)
			AND
			(
				s.no_correspondant = mds.no_maitre_stage
			)
			AND 
			(
				st.no_stagiaire = s.no_stagiaire
			)
		)
	)
	AND
	(
		(
			(
				mds.nom_usuel <> ''
			)
			AND
			(
				mds.prenom <> ''
			)
			AND
			(
				mds.prenom <> '-'
			)
			AND
			(
				mds.nom_usuel <> '-'
			)
			AND
			(
				mds.prenom <> '.'
			)
			AND
			(
				mds.nom_usuel <> '.'
			)
			AND
			(
				UPPER( mds.nom_usuel ) <> 'ZZ%'
			)
			AND
			(
				UPPER( mds.prenom ) <> 'ZZ%'
			)
		)
	)
	AND
	(
		mds.no_maitre_stage = s.no_correspondant
	)
	AND
	(
		st.no_stagiaire = s.no_stagiaire
	)
	AND
	(
		mds.code_etablissement = e.no_etablissement
	)
		
		
	GROUP BY mds.no_maitre_stage
avatar

5

je suis pas sur de moi mais j'ai appris que quand on fait group by quelque chose, on n'a le doit que de mettre ces quelques chose dans le select. ce serait pas ca qui coince? C'est quoi ta requête qui passe?

6

squalyl: ?? je comprends pas ta remarque, ca marche tres bien chez moi ce genre de trucs...

7

Squalyl > On a tout a fait le droit de faire ce que tu dis smile La requête qui passe est celle du ./4 et, comme indiqué, le seul souci était qu'il manquait les clauses WHERE des jointures.
avatar

8

ah bon smile ça doit dépendre du sgbd alors smile

9

MySQL passe en tt cas... (mais ca m'etonne carrement que ca marche pas, enfin, je trouve pas ca logique)

10

Tu aurais ptet intérêt à réordonner tes Where aussi, concrètement, si dans une table, j'ai les nombres de un à mille et que je ne veux que les chiffres impairs alors il va être plus logique de commencer par faire une condition sur la valeur (0 à 9) puis sur la parité et pas l'inverse... l'idée étant de réduire le plus rapidement possible le nombre de champs traités (par contre l'ordre dans le where dépends du sgbd, cond1 And cond2 sera sur certains traité un puis deux et pour d'autre par la fin, la doc du parseur de requête l'explique généralement)
avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

11

*en theorie* le sgbd se demerde pour gerer l'ordre le plus efficace non?

12

non
avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

13

14

exemple simple : tu fais un select sur ta table, et tu pose deux conditions (sur deux colonnes) on va dire age et poids dans une table personnes de 5 millions d'enregistrements. Bon, comment il fait le sgbd pour savoir si c'est le poids ou l'age qui permettra une convergence plus rapide SANS FAIRE DE REQUETE (sur 5 millions d'enregistrements, rappelons le) ? Eh bien justement, il ne peut pas savoir, donc si le développeur ne peut préciser un ordre précis alors il a la quasi garantie qu'il ne pourra jamais mettre en oeuvre la requète optimale. cqfd
avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

15

Je ne connais pas comment sont implémenté les sgbd, mais je connais assez bien comment marche Lucene, un indexeur de données, accessoirement en les stockant aussi. Sans faire aucun accès aux données, effectivement, c'est pas possible. Mais dans Lucene, savoir combien de données correspondent un critère très précis, de l'ordre du critèe d'égalité, c'est pratiquement immédiat. La requête ne serait pas faite entièrement, on va pas tout de suite essayer de savoir quels sont effectivement les résultats, encore moins les extraires. Donc pour chaque critère, tu tires le nombre de résultats, et après tu peux ordonner tes requêtes, pour ensuite effectivement les faire.

Donc c'est possible avec des optimisations. Mais de toute facon, c'est clair qu'il ne faut pas s'attendre à ce que la SGBD soit optimisée de cette manière la, c'est de l'ordre de la problématique d'implémentation.

16

De plus nombre de SGBD vont avoir un comportement différent pour ce qui est déjà présent dans le cache ou ce qui ne l'est pas...


une requète pas optimisée mais souvent exécutée pourra renvoyer les resultats plus vite qu'une requête affinée au plus optimal si celle ci n'est pas cachée...
avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

17

C'est déjà la requête la plus rapide sur le serveur en question (j'ai fait des permutations des where pour tester, parce que parfois la "logique" ne donne pas les meilleurs résultats).
avatar

18

squalyl (./5) :
je suis pas sur de moi mais j'ai appris que quand on fait group by quelque chose, on n'a le doit que de mettre ces quelques chose dans le select. ce serait pas ca qui coince? C'est quoi ta requête qui passe?
squalyl (./8) :
ah bon smile ça doit dépendre du sgbd alors smile
Exact.
En SQL strict, il y a la restriction décrite par squalyl sur les GROUP BY.
Cependant, ça dépend des moteurs SQL, beaucoup sont permissifs sur ce point.
Exemple concret que j'ai eu à mon boulot : HSQLDB 1.7 est permissif et laisse passer les requêtes avec un GROUP BY non conforme au specs SQL strictes, tandis que HSQLDB 1.8 est strict et nous envoie bouler sur ces mêmes requêtes.
Et comme on veut migrer notre produit central de la 1.7 vers la 1.8, bah... on l'a dans l'os, il faut vérifier toutes les requêtes SQL réparties dans nos centaines de plugins couic...
Donc même si « ça passe sur tel ou tel SGBD », mieux vaut s'en tenir aux specs strictes, ça évite les mauvaises surprises comme celle que j'ai eu (à moins, bien sûr, de ne plus jamais changer de SGBD ni même de version, cf. le cas d'HSQLDB).
avatar
Je ne suis pas développeur Java : je suis artiste Java.
Ce que l’on conçoit bien s’énonce clairement, / Et le code pour l’écrire arrive aisément.
Hâtez-vous lentement ; toujours, avec méthode, / Vingt fois dans l’IDE travaillez votre code.
La perfection est atteinte, non pas lorsqu’il n’y a plus rien à ajouter, mais lorsqu’il n’y a plus rien à retirer.
You don't use science to show that you're right, you use science to become right.

19

merci du conseil, ça pourra être utile ^^

20

Ethaniel : à ceci près que dans certains cas, faire du non strict (aux yeux de la norme) permet (justement parce que c'est du spécifique) de meilleurs résultats... il faut trancher et parfois ce qui est valable à un instant donné ne l'est plus forcément qq années après
avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

21

Certes, pour des projets de taille raisonnable, on peut se permettre certaines entorses sachant qu'il ne sera pas trop long de se remettre dans le droit chemin en cas de nécessité.
Mais si je prends l'exemple de mon boulot, on est toujours sur HSQLDB 1.7 alors que ça fait maintenant 6 mois que j'ai trouvé ce problème nous empêchant de passer en 1.8 (oui oui, c'est moi qui ai trouvé ce problème #fier# grin).
Et comme un des plugins a vraiment besoin de la 1.8 (qui gère les batches de requêtes, ce qui n'est pas le cas de la 1.7), ben... on est obligé de faire tourner en parallèle les deux SGBD en même temps, la 1.8 pour le plugin et ses batches et la 1.7 pour tout le reste sorry...
avatar
Je ne suis pas développeur Java : je suis artiste Java.
Ce que l’on conçoit bien s’énonce clairement, / Et le code pour l’écrire arrive aisément.
Hâtez-vous lentement ; toujours, avec méthode, / Vingt fois dans l’IDE travaillez votre code.
La perfection est atteinte, non pas lorsqu’il n’y a plus rien à ajouter, mais lorsqu’il n’y a plus rien à retirer.
You don't use science to show that you're right, you use science to become right.

22

Non, pas du tout !

J'irais presque jusqu'à dire l'inverse même !

Si à un instant T, deux solutions qui peuvent paraitre équivalente au niveau charge de développement mènent à des couts de production radicalement différents on choisira la moins chère à cet instant précis, et c'est d'autant plus vrai sur les projets monstrueux vu qu'un facteur apparament ridicule de plusieurs milions d'euros, ça devient non négligeable. Le bon sens voudrait qu'on fasse des trucs valables à long terme, la réalité c'est que les décideurs ne sont pas capables de prendre cette décision et par défaut ils préfèrent prendre celle qui sauve leur budget. Enfin d'un autre point de vue on peut aussi considérer que les projets informatiques qui sont prévus pour être rentabilisés à telle échéance, si on présent un potentiel problème après l'échéance, c'est compréhensible de l'ignorer, parce qu'en toute logique dans les faits on aura changé de système vu que l'échéance aura été dépassée...
avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

23

Moui sans doute, je n'ai aucune expérience dans la conduite de gros projets.
Dans les faits, en tout cas, ça fait 6 mois que j'ai signalé ce problème et qu'aucune ligne de code n'a été touchée sur ce point précis grin...
avatar
Je ne suis pas développeur Java : je suis artiste Java.
Ce que l’on conçoit bien s’énonce clairement, / Et le code pour l’écrire arrive aisément.
Hâtez-vous lentement ; toujours, avec méthode, / Vingt fois dans l’IDE travaillez votre code.
La perfection est atteinte, non pas lorsqu’il n’y a plus rien à ajouter, mais lorsqu’il n’y a plus rien à retirer.
You don't use science to show that you're right, you use science to become right.

24

c'est normal, cf le site de la rache ^^
avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

25

OMGWTFBBQ !!!
J'ai oublié de noter ce problème sur un Post-It®, c'est pour ça !
avatar
Je ne suis pas développeur Java : je suis artiste Java.
Ce que l’on conçoit bien s’énonce clairement, / Et le code pour l’écrire arrive aisément.
Hâtez-vous lentement ; toujours, avec méthode, / Vingt fois dans l’IDE travaillez votre code.
La perfection est atteinte, non pas lorsqu’il n’y a plus rien à ajouter, mais lorsqu’il n’y a plus rien à retirer.
You don't use science to show that you're right, you use science to become right.

26

WTF BBQ ??

tu les fait griller au BBQ ?
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

27

avatar
Je ne suis pas développeur Java : je suis artiste Java.
Ce que l’on conçoit bien s’énonce clairement, / Et le code pour l’écrire arrive aisément.
Hâtez-vous lentement ; toujours, avec méthode, / Vingt fois dans l’IDE travaillez votre code.
La perfection est atteinte, non pas lorsqu’il n’y a plus rien à ajouter, mais lorsqu’il n’y a plus rien à retirer.
You don't use science to show that you're right, you use science to become right.

28

29

rien
avatar
Je ne suis pas développeur Java : je suis artiste Java.
Ce que l’on conçoit bien s’énonce clairement, / Et le code pour l’écrire arrive aisément.
Hâtez-vous lentement ; toujours, avec méthode, / Vingt fois dans l’IDE travaillez votre code.
La perfection est atteinte, non pas lorsqu’il n’y a plus rien à ajouter, mais lorsqu’il n’y a plus rien à retirer.
You don't use science to show that you're right, you use science to become right.

30

ben je vois toujours pas ce qu'il vient faire la le bbq grin