Bonjour,
J'ai un problème qui me laisse perplexe. Je ne peux même pas le transposer avec des tables simples donc pour la première foi, je vais copier ici mes requêtes telles que je les utilise, en espérant que ce ne sera pas trop infernal à lire :
La requête suivante s'effectue en 0,047s, donc pas de problème :
Maintenant, la requête suivante (la même que la précédente à l'exception du rajout d'une condition qui me semble sans grande influence a priori) mouline un temps infini, et finit par planter MySql (et mon PC !) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 SELECT book.*, simulation.updatedate as simulationdate, collection.name AS collectionName, groups.name AS groupname, house.name AS housename, CASE WHEN (contributor.firstname = NULL OR contributor.firstname ='') THEN contributor.name ELSE CONCAT(contributor.name,', ', contributor.firstname) END AS contributor1Name, CONCAT(editor.name,', ',editor.firstname) AS editorname, article.articleid, article.udcode, article.isbn13, article.gencod, article.senddate, CASE WHEN (priceandtirage.isvalidated = '1') THEN priceandtirage.realprice END AS finalprice FROM book LEFT OUTER JOIN (article LEFT OUTER JOIN priceandtirage ON (article.articleid = priceandtirage.articleid)) ON (book.bookid = article.bookid) LEFT OUTER JOIN simulation ON (book.simulationid = simulation.simulationid), contributor,editor,collection,groups,house,editionplan WHERE editionplan.bookid = book.bookid AND book.collectionid = collection.collectionid AND book.groupid = groups.groupid AND book.houseid = house.houseid AND book.contributor1id = contributor.contributorid AND book.editorid = editor.editorid AND book.assigned = '1' AND editionplan.year = 2008 AND editionplan.month = 2 GROUP BY book.bookid ORDER BY housename ASC, groupname ASC, title ASC
A moins que je n'aie pas les yeaux en face des trous, la seule chose qui a changé par rapport à la première requête, c'est la condition suivante sui a été rajoutée :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 SELECT book.*, simulation.updatedate as simulationdate, collection.name AS collectionName, groups.name AS groupname, house.name AS housename, CASE WHEN (contributor.firstname = NULL OR contributor.firstname ='') THEN contributor.name ELSE CONCAT(contributor.name,', ', contributor.firstname) END AS contributor1Name, CONCAT(editor.name,', ',editor.firstname) AS editorname, article.articleid, article.udcode, article.isbn13, article.gencod, article.senddate, CASE WHEN (priceandtirage.isvalidated = '1') THEN priceandtirage.realprice END AS finalprice FROM book LEFT OUTER JOIN (article LEFT OUTER JOIN priceandtirage ON (article.articleid = priceandtirage.articleid)) ON (book.bookid = article.bookid) LEFT OUTER JOIN simulation ON (book.simulationid = simulation.simulationid), contributor,editor,collection,groups,house,editionplan WHERE editionplan.bookid = book.bookid AND book.collectionid = collection.collectionid AND book.groupid = groups.groupid AND book.houseid = house.houseid AND book.contributor1id = contributor.contributorid AND book.editorid = editor.editorid AND book.assigned = '1' AND editionplan.year = 2008 AND editionplan.month = 2 AND book.groupid = 12 GROUP BY book.bookid ORDER BY housename ASC, groupname ASC, title ASC
Or, par rapport au résultat de la première requête (101 lignes), 23 correspondent à cette condition supplémentaire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part AND book.groupid = 12
J'ai essayé, à partir de la seconde requête, d'enlever progressivement des éléments pour voir où ça coince mais je n'ai pas réussi à trouver. Je pencherais pour le LEFT OUTER JOIN imbriqué mais c'est sans aucune certitude.
Pour info, le table "priceandtirage" contient un index sur la colonne "articleid" et les tables "simulation" et "article" contiennent un index sur la colonne "bookid".
Qu'est ce qui peut bien expliquer une telle différence de comportement ??
Je suis vraiment perplexe.
Merci pour votre aide.
Partager