<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>L&#039;Endormitoire</title>
	<atom:link href="http://endormitoire.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://endormitoire.wordpress.com</link>
	<description>Des histoires à dormir debout...</description>
	<lastBuildDate>Mon, 09 Jan 2012 17:08:12 +0000</lastBuildDate>
	<language>fr</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='endormitoire.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://1.gravatar.com/blavatar/99ab04ae0ebee6e35febcbefbddea63c?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>L&#039;Endormitoire</title>
		<link>http://endormitoire.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://endormitoire.wordpress.com/osd.xml" title="L&#039;Endormitoire" />
	<atom:link rel='hub' href='http://endormitoire.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Jobineries</title>
		<link>http://endormitoire.wordpress.com/2012/01/09/jobineries/</link>
		<comments>http://endormitoire.wordpress.com/2012/01/09/jobineries/#comments</comments>
		<pubDate>Mon, 09 Jan 2012 17:08:06 +0000</pubDate>
		<dc:creator>endormitoire</dc:creator>
				<category><![CDATA[échecs]]></category>
		<category><![CDATA[littérature]]></category>
		<category><![CDATA[mathématiques]]></category>
		<category><![CDATA[programmation]]></category>
		<category><![CDATA[Smalltalk]]></category>

		<guid isPermaLink="false">http://endormitoire.wordpress.com/?p=311</guid>
		<description><![CDATA[Belle et agréable trouvaille ce matin : un petit blogue sympathique.  Comme moi, si vous aimez les mathématiques, la programmation, la littérature, Smalltalk et les échecs, entre autres&#8230; Jobinerie : (québécisme), travail d&#8217;appoint, petite &#8220;job&#8221;. Classé dans:échecs, littérature, mathématiques, programmation, Smalltalk Tagged: échecs, littérature, mathématiques, programmation, Smalltalk<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=endormitoire.wordpress.com&amp;blog=14420825&amp;post=311&amp;subd=endormitoire&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Belle et agréable trouvaille ce matin : un petit blogue sympathique.  Comme moi, si vous aimez les mathématiques, la programmation, la littérature, Smalltalk et les échecs, entre autres&#8230;</p>
<p><a title="Jobineries" href="http://www.gilles-jobin.org/jobineries/index.php?Squeakeries" target="_blank">Jobinerie</a> : (québécisme), travail d&#8217;appoint, petite &#8220;job&#8221;.</p>
<br />Classé dans:<a href='http://endormitoire.wordpress.com/category/jeux/echecs/'>échecs</a>, <a href='http://endormitoire.wordpress.com/category/litterature/'>littérature</a>, <a href='http://endormitoire.wordpress.com/category/mathematiques/'>mathématiques</a>, <a href='http://endormitoire.wordpress.com/category/programmation/'>programmation</a>, <a href='http://endormitoire.wordpress.com/category/smalltalk/'>Smalltalk</a> Tagged: <a href='http://endormitoire.wordpress.com/tag/echecs/'>échecs</a>, <a href='http://endormitoire.wordpress.com/tag/litterature/'>littérature</a>, <a href='http://endormitoire.wordpress.com/tag/mathematiques/'>mathématiques</a>, <a href='http://endormitoire.wordpress.com/tag/programmation/'>programmation</a>, <a href='http://endormitoire.wordpress.com/tag/smalltalk/'>Smalltalk</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/endormitoire.wordpress.com/311/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/endormitoire.wordpress.com/311/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/endormitoire.wordpress.com/311/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/endormitoire.wordpress.com/311/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/endormitoire.wordpress.com/311/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/endormitoire.wordpress.com/311/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/endormitoire.wordpress.com/311/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/endormitoire.wordpress.com/311/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/endormitoire.wordpress.com/311/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/endormitoire.wordpress.com/311/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/endormitoire.wordpress.com/311/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/endormitoire.wordpress.com/311/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/endormitoire.wordpress.com/311/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/endormitoire.wordpress.com/311/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=endormitoire.wordpress.com&amp;blog=14420825&amp;post=311&amp;subd=endormitoire&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://endormitoire.wordpress.com/2012/01/09/jobineries/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/167178fdce6304d803372432a3052672?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">endormitoire</media:title>
		</media:content>
	</item>
		<item>
		<title>Comment presser un citron (deuxième partie)</title>
		<link>http://endormitoire.wordpress.com/2012/01/08/comment-presser-un-citron-deuxieme-partie/</link>
		<comments>http://endormitoire.wordpress.com/2012/01/08/comment-presser-un-citron-deuxieme-partie/#comments</comments>
		<pubDate>Mon, 09 Jan 2012 03:54:59 +0000</pubDate>
		<dc:creator>endormitoire</dc:creator>
				<category><![CDATA[algorithmes]]></category>
		<category><![CDATA[bases de données]]></category>
		<category><![CDATA[MyISAM]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[optimisation]]></category>
		<category><![CDATA[Pharo]]></category>
		<category><![CDATA[sudoku]]></category>
		<category><![CDATA[optimizer_search_depth]]></category>
		<category><![CDATA[Sudoku]]></category>

		<guid isPermaLink="false">http://endormitoire.wordpress.com/?p=259</guid>
		<description><![CDATA[Dans le premier article, nous avons vu combien il était facile de solutionner des grilles de sudoku avec une seule requête SQL. Malheureusement, c&#8217;était trop beau pour être vrai&#8230; Avant de poursuivre, voici un outil utile pour se faciliter la tâche.  Pour ceux qui utilisent Smalltalk, vous pouvez vous aider du script suivant : Ce [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=endormitoire.wordpress.com&amp;blog=14420825&amp;post=259&amp;subd=endormitoire&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Dans le <a title="Comment presser un citron (première partie)" href="http://endormitoire.wordpress.com/2012/01/07/comment-presser-un-citron-premiere-partie/" target="_blank">premier article</a>, nous avons vu combien il était facile de solutionner des grilles de sudoku avec une seule requête SQL. Malheureusement, c&#8217;était trop beau pour être vrai&#8230;</p>
<p>Avant de poursuivre, voici un outil utile pour se faciliter la tâche.  Pour ceux qui utilisent Smalltalk, vous pouvez vous aider du script suivant :</p>
<p><pre class="brush: plain; wrap-lines: false;">

| uneTableOuVue uneStringSudoku stream estLePremier |

uneTableOuVue := 'sudoku_rows_view'.
uneStringSudoku := '.........134825697759364182397182564.........581476239825641973976538421.........'.

stream := ReadWriteStream on: String new.
stream
nextPutAll: 'SELECT * '; cr;
nextPutAll: 'FROM ';
nextPutAll: uneTableOuVue;
space; cr;
nextPutAll: 'WHERE'; cr.

estLePremier := false.
1 to: 9 do: [:r |
1 to: 9 do: [:c | | i |
i := (r-1)*9 + c.
((uneStringSudoku at: i) ~= $. and: [(uneStringSudoku at: i) ~= 0])
ifTrue: [    estLePremier ifTrue: [stream nextPutAll: ' AND ';cr].
estLePremier := true.
stream
nextPutAll: '(r'; nextPutAll: r asString;
nextPutAll: 'c'; nextPutAll: c asString;
nextPutAll: ' = ';
nextPutAll: (uneStringSudoku at: i) asString;
nextPutAll: ')'.
].]].
Transcript cr;show: stream contents

</pre></p>
<p>Ce script génère  les requêtes SQL à partir d&#8217;une chaîne de caractères (<strong>uneStringSudoku</strong>) représentant une grille de sudoku pour une table/vue précise (<strong>uneTableOuVue</strong>) en affichant le résultat dans le Transcript.</p>
<p><strong>1. Problème majeur</strong></p>
<p>Il y a une faille majeure et évidente dans la solution telle que présentée : elle repose totalement sur la capacité de MySQL de faire correspondre les révélés (<em>givens</em> en anglais) de la grille à des <strong>lignes</strong>. Que se passerait-il si une ligne (ou pire encore, plusieurs lignes) dans le sudoku ne contenait pas de révélés (ou pas assez)? Sans index à utiliser, une lecture séquentielle de la table nous attend sans doute! Prenons, par exemple, la grille suivante:</p>
<p><a href="http://endormitoire.files.wordpress.com/2012/01/sudoku_grille_021.jpg"><img class="aligncenter size-full wp-image-269" title="Sudoku grille #02" src="http://endormitoire.files.wordpress.com/2012/01/sudoku_grille_021.jpg?w=450" alt=""   /></a></p>
<p>Ce sudoku contient 54 révélés (la première grille n&#8217;en comptait que 30, près de la moitié de celle-ci) et 6 de ses lignes seront rapidement récupérées avec les index.  De plus, il y a suffisamment de révélés pour éliminer rapidement un bon nombre de lignes candidates avec les contraintes du puzzle incluses dans la vue <strong>sudoku_rows_view</strong>.</p>
<p>Cependant les lignes vides (1, 5 et 9) causeront probablement une lecture séquentielle (<em>table scan</em>) de la table.  Nous faisons face à un problème majeur avec les lignes 1, 5 et 9 étant vides! Examinons la requête pour ce sudoku :</p>
<p><pre class="brush: sql; wrap-lines: false;">
EXPLAIN
SELECT *
FROM sudoku_rows_view
WHERE
(r2c1 = 1) AND (r2c2 = 3) AND (r2c3 = 4) AND (r2c4 = 8) AND
(r2c5 = 2) AND (r2c6 = 5) AND (r2c7 = 6) AND (r2c8 = 9) AND
(r2c9 = 7) AND (r3c1 = 7) AND (r3c2 = 5) AND (r3c3 = 9) AND
(r3c4 = 3) AND (r3c5 = 6) AND (r3c6 = 4) AND (r3c7 = 1) AND
(r3c8 = 8) AND (r3c9 = 2) AND (r4c1 = 3) AND (r4c2 = 9) AND
(r4c3 = 7) AND (r4c4 = 1) AND (r4c5 = 8) AND (r4c6 = 2) AND
(r4c7 = 5) AND (r4c8 = 6) AND (r4c9 = 4) AND (r6c1 = 5) AND
(r6c2 = 8) AND (r6c3 = 1) AND (r6c4 = 4) AND (r6c5 = 7) AND
(r6c6 = 6) AND (r6c7 = 2) AND (r6c8 = 3) AND (r6c9 = 9) AND
(r7c1 = 8) AND (r7c2 = 2) AND (r7c3 = 5) AND (r7c4 = 6) AND
(r7c5 = 4) AND (r7c6 = 1) AND (r7c7 = 9) AND (r7c8 = 7) AND
(r7c9 = 3) AND (r8c1 = 9) AND (r8c2 = 7) AND (r8c3 = 6) AND
(r8c4 = 5) AND (r8c5 = 3) AND (r8c6 = 8) AND (r8c7 = 4) AND
(r8c8 = 2) AND (r8c9 = 1);
</pre></p>
<p>Le résultat du EXPLAIN :</p>
<p><pre class="brush: plain; highlight: [10,11,12]; wrap-lines: false;">
+----+-------------+-------+-------------+----------------------------------------------------------------------------------------------------------------------------------------------------+-------------+---------+------+--------+----------------------------------------------------------------------------------+
| id | select_type | table | type        | possible_keys                                                                                                                                      | key         | key_len | ref  | rows   | Extra                                                                            |
+----+-------------+-------+-------------+----------------------------------------------------------------------------------------------------------------------------------------------------+-------------+---------+------+--------+----------------------------------------------------------------------------------+
|  1 | SIMPLE      | r2    | index_merge | i12,i13,i14,i15,i16,i17,i18,i19,i23,i24,i25,i26,i27,i28,i29,i34,i35,i36,i37,i38,i39,i45,i46,i47,i48,i49,i56,i57,i58,i59,i67,i68,i69,i78,i79,i89,i9 | i37,i29     | 2,2     | NULL |     68 | Using intersect(i37,i29); Using where                                            |
|  1 | SIMPLE      | r3    | index_merge | i12,i13,i14,i15,i16,i17,i18,i19,i23,i24,i25,i26,i27,i28,i29,i34,i35,i36,i37,i38,i39,i45,i46,i47,i48,i49,i56,i57,i58,i59,i67,i68,i69,i78,i79,i89,i9 | i37,i28     | 2,2     | NULL |     68 | Using intersect(i37,i28); Using where; Using join buffer (Block Nested Loop)     |
|  1 | SIMPLE      | r4    | index_merge | i12,i13,i14,i15,i16,i17,i18,i19,i23,i24,i25,i26,i27,i28,i29,i34,i35,i36,i37,i38,i39,i45,i46,i47,i48,i49,i56,i57,i58,i59,i67,i68,i69,i78,i79,i89,i9 | i56,i29     | 2,2     | NULL |     68 | Using intersect(i56,i29); Using where; Using join buffer (Block Nested Loop)     |
|  1 | SIMPLE      | r6    | index_merge | i12,i13,i14,i15,i16,i17,i18,i19,i23,i24,i25,i26,i27,i28,i29,i34,i35,i36,i37,i38,i39,i45,i46,i47,i48,i49,i56,i57,i58,i59,i67,i68,i69,i78,i79,i89,i9 | i12,i35     | 2,2     | NULL |     68 | Using intersect(i12,i35); Using where; Using join buffer (Block Nested Loop)     |
|  1 | SIMPLE      | r7    | index_merge | i12,i13,i14,i15,i16,i17,i18,i19,i23,i24,i25,i26,i27,i28,i29,i34,i35,i36,i37,i38,i39,i45,i46,i47,i48,i49,i56,i57,i58,i59,i67,i68,i69,i78,i79,i89,i9 | i12,i68     | 2,2     | NULL |     68 | Using intersect(i12,i68); Using where; Using join buffer (Block Nested Loop)     |
|  1 | SIMPLE      | r8    | index_merge | i12,i13,i14,i15,i16,i17,i18,i19,i23,i24,i25,i26,i27,i28,i29,i34,i35,i36,i37,i38,i39,i45,i46,i47,i48,i49,i56,i57,i58,i59,i67,i68,i69,i78,i79,i89,i9 | i37,i79,i38 | 2,2,2   | NULL |     78 | Using intersect(i37,i79,i38); Using where; Using join buffer (Block Nested Loop) |
|  1 | SIMPLE      | r1    | range       | i12,i13,i14,i15,i16,i17,i18,i19,i23,i24,i25,i26,i27,i28,i29,i34,i35,i36,i37,i38,i39,i45,i46,i47,i48,i49,i56,i57,i58,i59,i67,i68,i69,i78,i79,i89,i9 | i23         | 1       | NULL |  40012 | Using index condition; Using where; Using join buffer (Block Nested Loop)        |
|  1 | SIMPLE      | r5    | ALL         | i12,i13,i14,i15,i16,i17,i18,i19,i23,i24,i25,i26,i27,i28,i29,i34,i35,i36,i37,i38,i39,i45,i46,i47,i48,i49,i56,i57,i58,i59,i67,i68,i69,i78,i79,i89,i9 | NULL        | NULL    | NULL | 362880 | Using where; Using join buffer (Block Nested Loop)                               |
|  1 | SIMPLE      | r9    | ALL         | NULL                                                                                                                                               | NULL        | NULL    | NULL | 362880 | Using where; Using join buffer (Block Nested Loop)                               |
+----+-------------+-------+-------------+----------------------------------------------------------------------------------------------------------------------------------------------------+-------------+---------+------+--------+----------------------------------------------------------------------------------+
9 rows in set (13.39 sec)
</pre></p>
<p>Les lignes vides (lignes 1, 5 et 9) nous feront payer très chèrement le fait que nous ne pouvons pas utiliser pleinement les index! Il n&#8217;y a qu&#8217;à constater le nombre de lignes à potentiellement examiner pour joindre les tables r1, r5 et r9 (40012 x 362880 x 362880 = 5268855958732800) ainsi que le type de jointure utilisé (range, ALL et ALL).</p>
<p>Vérifions en combien de temps la requête s&#8217;exécute :</p>
<p><pre class="brush: plain; wrap-lines: false;">

+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
| r1c1 | r1c2 | r1c3 | r1c4 | r1c5 | r1c6 | r1c7 | r1c8 | r1c9 | r2c1 | r2c2 | r2c3 | r2c4 | r2c5 | r2c6 | r2c7 | r2c8 | r2c9 | r3c1 | r3c2 | r3c3 | r3c4 | r3c5 | r3c6 | r3c7 | r3c8 | r3c9 | r4c1 | r4c2 | r4c3 | r4c4 | r4c5 | r4c6 | r4c7 | r4c8 | r4c9 | r5c1 | r5c2 | r5c3 | r5c4 | r5c5 | r5c6 | r5c7 | r5c8 | r5c9 | r6c1 | r6c2 | r6c3 | r6c4 | r6c5 | r6c6 | r6c7 | r6c8 | r6c9 | r7c1 | r7c2 | r7c3 | r7c4 | r7c5 | r7c6 | r7c7 | r7c8 | r7c9 | r8c1 | r8c2 | r8c3 | r8c4 | r8c5 | r8c6 | r8c7 | r8c8 | r8c9 | r9c1 | r9c2 | r9c3 | r9c4 | r9c5 | r9c6 | r9c7 | r9c8 | r9c9 |
+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
|    2 |    6 |    8 |    7 |    1 |    9 |    3 |    4 |    5 |    1 |    3 |    4 |    8 |    2 |    5 |    6 |    9 |    7 |    7 |    5 |    9 |    3 |    6 |    4 |    1 |    8 |    2 |    3 |    9 |    7 |    1 |    8 |    2 |    5 |    6 |    4 |    6 |    4 |    2 |    9 |    5 |    3 |    7 |    1 |    8 |    5 |    8 |    1 |    4 |    7 |    6 |    2 |    3 |    9 |    8 |    2 |    5 |    6 |    4 |    1 |    9 |    7 |    3 |    9 |    7 |    6 |    5 |    3 |    8 |    4 |    2 |    1 |    4 |    1 |    3 |    2 |    9 |    7 |    8 |    5 |    6 |
+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
1 row in set (6.17 sec)

</pre></p>
<p>Ouf!  Nous sommes passés de 0.39 seconde (grille 01) à 6.17 secondes (grille 02) malgré le fait que la grille 02 comporte près de 2 fois plus de révélés que la grille 01!  Cet exemple démontre clairement que les choses peuvent rapidement mal tourner à un rythme alarmant (même exponentiel) quand nous sommes confrontés à une grille contenant des lignes vides ou presque vides!</p>
<p><strong>2. Changer de point de vue! </strong></p>
<p><strong></strong>Imaginons maintenant que nous faisons effectuer une rotation à notre grille et que les colonnes deviennent des lignes.  Dans ce cas, chaque nouvelle ligne pourrait dès lors bénéficier des index!</p>
<p>Voyons cette nouvelle grille :</p>
<p><a href="http://endormitoire.files.wordpress.com/2012/01/sudoku_grille_02b.jpg"><img class="aligncenter size-full wp-image-275" title="Sudoku grille 02b (rotation de la grille grille 02)" src="http://endormitoire.files.wordpress.com/2012/01/sudoku_grille_02b.jpg?w=450" alt=""   /></a></p>
<p>La requête aurait désormais l&#8217;air de ceci :</p>
<p><pre class="brush: sql; wrap-lines: false;">

SELECT *
FROM sudoku_rows_view
WHERE
(r1c2 = 1) AND (r1c3 = 7) AND (r1c4 = 3) AND (r1c6 = 5) AND
(r1c7 = 8) AND (r1c8 = 9) AND (r2c2 = 3) AND (r2c3 = 5) AND
(r2c4 = 9) AND (r2c6 = 8) AND (r2c7 = 2) AND (r2c8 = 7) AND
(r3c2 = 4) AND (r3c3 = 9) AND (r3c4 = 7) AND (r3c6 = 1) AND
(r3c7 = 5) AND (r3c8 = 6) AND (r4c2 = 8) AND (r4c3 = 3) AND
(r4c4 = 1) AND (r4c6 = 4) AND (r4c7 = 6) AND (r4c8 = 5) AND
(r5c2 = 2) AND (r5c3 = 6) AND (r5c4 = 8) AND (r5c6 = 7) AND
(r5c7 = 4) AND (r5c8 = 3) AND (r6c2 = 5) AND (r6c3 = 4) AND
(r6c4 = 2) AND (r6c6 = 6) AND (r6c7 = 1) AND (r6c8 = 8) AND
(r7c2 = 6) AND (r7c3 = 1) AND (r7c4 = 5) AND (r7c6 = 2) AND
(r7c7 = 9) AND (r7c8 = 4) AND (r8c2 = 9) AND (r8c3 = 8) AND
(r8c4 = 6) AND (r8c6 = 3) AND (r8c7 = 7) AND (r8c8 = 2) AND
(r9c2 = 7) AND (r9c3 = 2) AND (r9c4 = 4) AND (r9c6 = 9) AND
(r9c7 = 3) AND (r9c8 = 1);
</pre></p>
<p>Le résultat du EXPLAIN correspondant :</p>
<p><pre class="brush: plain; wrap-lines: false;">

+----+-------------+-------+-------------+----------------------------------------------------------------------------------------------------------------------------------------------------+-------------+---------+------+------+----------------------------------------------------------------------------------+
| id | select_type | table | type        | possible_keys                                                                                                                                      | key         | key_len | ref  | rows | Extra                                                                            |
+----+-------------+-------+-------------+----------------------------------------------------------------------------------------------------------------------------------------------------+-------------+---------+------+------+----------------------------------------------------------------------------------+
|  1 | SIMPLE      | r3    | index_merge | i23,i24,i25,i26,i27,i28,i29,i34,i35,i36,i37,i38,i39,i45,i46,i47,i48,i49,i67,i68,i69,i78,i79,i89                                                    | i23,i38,i48 | 2,2,2   | NULL |   64 | Using intersect(i23,i38,i48); Using where                                        |
|  1 | SIMPLE      | r9    | index_merge | i23,i24,i25,i26,i27,i28,i29,i34,i35,i36,i37,i38,i39,i45,i46,i47,i48,i49,i67,i68,i69,i78,i79,i89                                                    | i78,i68,i48 | 2,2,2   | NULL |   65 | Using intersect(i78,i68,i48); Using where; Using join buffer (Block Nested Loop) |
|  1 | SIMPLE      | r1    | index_merge | i12,i13,i14,i15,i16,i17,i18,i19,i23,i24,i25,i26,i27,i28,i29,i34,i35,i36,i37,i38,i39,i45,i46,i47,i48,i49,i56,i57,i58,i59,i67,i68,i69,i78,i79,i89,i9 | i23,i67     | 2,2     | NULL |   68 | Using intersect(i23,i67); Using where; Using join buffer (Block Nested Loop)     |
|  1 | SIMPLE      | r2    | index_merge | i12,i13,i14,i15,i16,i17,i18,i19,i23,i24,i25,i26,i27,i28,i29,i34,i35,i36,i37,i38,i39,i45,i46,i47,i48,i49,i56,i57,i58,i59,i67,i68,i69,i78,i79,i89,i9 | i23,i68     | 2,2     | NULL |   68 | Using intersect(i23,i68); Using where; Using join buffer (Block Nested Loop)     |
|  1 | SIMPLE      | r4    | index_merge | i12,i13,i14,i15,i16,i17,i18,i19,i23,i24,i25,i26,i27,i28,i29,i34,i35,i36,i37,i38,i39,i45,i46,i47,i48,i49,i56,i57,i58,i59,i67,i68,i69,i78,i79,i89,i9 | i78,i46     | 2,2     | NULL |   68 | Using intersect(i78,i46); Using where; Using join buffer (Block Nested Loop)     |
|  1 | SIMPLE      | r5    | index_merge | i12,i13,i14,i15,i16,i17,i18,i19,i23,i24,i25,i26,i27,i28,i29,i34,i35,i36,i37,i38,i39,i45,i46,i47,i48,i49,i56,i57,i58,i59,i67,i68,i69,i78,i79,i89,i9 | i23,i68     | 2,2     | NULL |   68 | Using intersect(i23,i68); Using where; Using join buffer (Block Nested Loop)     |
|  1 | SIMPLE      | r6    | index_merge | i23,i24,i25,i26,i27,i28,i29,i34,i35,i36,i37,i38,i39,i45,i46,i47,i48,i49,i67,i68,i69,i78,i79,i89                                                    | i23,i67     | 2,2     | NULL |   68 | Using intersect(i23,i67); Using where; Using join buffer (Block Nested Loop)     |
|  1 | SIMPLE      | r7    | index_merge | i12,i13,i14,i15,i16,i17,i18,i19,i23,i24,i25,i26,i27,i28,i29,i34,i35,i36,i37,i38,i39,i45,i46,i47,i48,i49,i56,i57,i58,i59,i67,i68,i69,i78,i79,i89,i9 | i23,i68     | 2,2     | NULL |   68 | Using intersect(i23,i68); Using where; Using join buffer (Block Nested Loop)     |
|  1 | SIMPLE      | r8    | index_merge | i12,i13,i14,i15,i16,i17,i18,i19,i23,i24,i25,i26,i27,i28,i29,i34,i35,i36,i37,i38,i39,i45,i46,i47,i48,i49,i56,i57,i58,i59,i67,i68,i69,i78,i79,i89,i9 | i37,i24     | 2,2     | NULL |   68 | Using intersect(i37,i24); Using where; Using join buffer (Block Nested Loop)     |
+----+-------------+-------+-------------+----------------------------------------------------------------------------------------------------------------------------------------------------+-------------+---------+------+------+----------------------------------------------------------------------------------+
9 rows in set (42.98 sec)

</pre></p>
<p>Et combien de temps la requête prendrait-elle à s&#8217;exécuter?</p>
<p><pre class="brush: plain; wrap-lines: false;">
SELECT *
FROM sudoku_rows_view
WHERE
(r1c2 = 1) AND (r1c3 = 7) AND (r1c4 = 3) AND (r1c6 = 5) AND
(r1c7 = 8) AND (r1c8 = 9) AND (r2c2 = 3) AND (r2c3 = 5) AND
(r2c4 = 9) AND (r2c6 = 8) AND (r2c7 = 2) AND (r2c8 = 7) AND
(r3c2 = 4) AND (r3c3 = 9) AND (r3c4 = 7) AND (r3c6 = 1) AND
(r3c7 = 5) AND (r3c8 = 6) AND (r4c2 = 8) AND (r4c3 = 3) AND
(r4c4 = 1) AND (r4c6 = 4) AND (r4c7 = 6) AND (r4c8 = 5) AND
(r5c2 = 2) AND (r5c3 = 6) AND (r5c4 = 8) AND (r5c6 = 7) AND
(r5c7 = 4) AND (r5c8 = 3) AND (r6c2 = 5) AND (r6c3 = 4) AND
(r6c4 = 2) AND (r6c6 = 6) AND (r6c7 = 1) AND (r6c8 = 8) AND
(r7c2 = 6) AND (r7c3 = 1) AND (r7c4 = 5) AND (r7c6 = 2) AND
(r7c7 = 9) AND (r7c8 = 4) AND (r8c2 = 9) AND (r8c3 = 8) AND
(r8c4 = 6) AND (r8c6 = 3) AND (r8c7 = 7) AND (r8c8 = 2) AND
(r9c2 = 7) AND (r9c3 = 2) AND (r9c4 = 4) AND (r9c6 = 9) AND
(r9c7 = 3) AND (r9c8 = 1);
+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
| r1c1 | r1c2 | r1c3 | r1c4 | r1c5 | r1c6 | r1c7 | r1c8 | r1c9 | r2c1 | r2c2 | r2c3 | r2c4 | r2c5 | r2c6 | r2c7 | r2c8 | r2c9 | r3c1 | r3c2 | r3c3 | r3c4 | r3c5 | r3c6 | r3c7 | r3c8 | r3c9 | r4c1 | r4c2 | r4c3 | r4c4 | r4c5 | r4c6 | r4c7 | r4c8 | r4c9 | r5c1 | r5c2 | r5c3 | r5c4 | r5c5 | r5c6 | r5c7 | r5c8 | r5c9 | r6c1 | r6c2 | r6c3 | r6c4 | r6c5 | r6c6 | r6c7 | r6c8 | r6c9 | r7c1 | r7c2 | r7c3 | r7c4 | r7c5 | r7c6 | r7c7 | r7c8 | r7c9 | r8c1 | r8c2 | r8c3 | r8c4 | r8c5 | r8c6 | r8c7 | r8c8 | r8c9 | r9c1 | r9c2 | r9c3 | r9c4 | r9c5 | r9c6 | r9c7 | r9c8 | r9c9 |
+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
|    2 |    1 |    7 |    3 |    6 |    5 |    8 |    9 |    4 |    6 |    3 |    5 |    9 |    4 |    8 |    2 |    7 |    1 |    8 |    4 |    9 |    7 |    2 |    1 |    5 |    6 |    3 |    7 |    8 |    3 |    1 |    9 |    4 |    6 |    5 |    2 |    1 |    2 |    6 |    8 |    5 |    7 |    4 |    3 |    9 |    9 |    5 |    4 |    2 |    3 |    6 |    1 |    8 |    7 |    3 |    6 |    1 |    5 |    7 |    2 |    9 |    4 |    8 |    4 |    9 |    8 |    6 |    1 |    3 |    7 |    2 |    5 |    5 |    7 |    2 |    4 |    8 |    9 |    3 |    1 |    6 |
+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
1 row in set (0.22 sec)
</pre></p>
<p>Nous sommes passés de 6.17 secondes à 0.22 seconde! Un gain imposant!</p>
<p><strong>3. Les vues combinées</strong></p>
<p>Alors pourquoi ne tenterions-nous pas de résoudre nos sudokus en effectuant la recherche par ligne <strong>ET</strong> par colonne à la fois?</p>
<p>Nous allons donc construire une seconde vue (<strong>sudoku_columns_view</strong>) qui sera basée sur les colonnes de la grille.  Pour faire résoudre les sudokus, il nous faudra une troisième vue (<strong>sudoku_combined_view</strong>) qui combinera la vue par lignes (<strong>sudoku_rows_view</strong>) avec la vue par colonne (<strong>sudoku_columns_view</strong>).  De cette façon, nous serons à l&#8217;abri des grilles avec des lignes vides et des grilles avec des colonnes vides.  L&#8217;optimisateur de requête aura dorénavant tout le luxe de choisir la &#8220;méthode&#8221; la plus efficace!</p>
<p>Construisons la vue par colonnes en exécutant cette requête :</p>
<p><pre class="brush: sql; wrap-lines: false;">
USE sudoku;

CREATE VIEW sudoku_columns_view AS
SELECT
col1.c1 as r1c1, col1.c2 as r2c1, col1.c3 as r3c1, col1.c4 as r4c1, col1.c5 as r5c1,col1.c6 as r6c1, col1.c7 as r7c1, col1.c8 as r8c1, col1.c9 as r9c1, col2.c1 as r1c2,
col2.c2 as r2c2, col2.c3 as r3c2, col2.c4 as r4c2, col2.c5 as r5c2, col2.c6 as r6c2,col2.c7 as r7c2, col2.c8 as r8c2, col2.c9 as r9c2, col3.c1 as r1c3, col3.c2 as r2c3,
col3.c3 as r3c3, col3.c4 as r4c3, col3.c5 as r5c3, col3.c6 as r6c3, col3.c7 as r7c3,col3.c8 as r8c3, col3.c9 as r9c3, col4.c1 as r1c4, col4.c2 as r2c4, col4.c3 as r3c4,
col4.c4 as r4c4, col4.c5 as r5c4, col4.c6 as r6c4, col4.c7 as r7c4, col4.c8 as r8c4,col4.c9 as r9c4, col5.c1 as r1c5, col5.c2 as r2c5, col5.c3 as r3c5, col5.c4 as r4c5,
col5.c5 as r5c5, col5.c6 as r6c5, col5.c7 as r7c5, col5.c8 as r8c5, col5.c9 as r9c5,col6.c1 as r1c6, col6.c2 as r2c6, col6.c3 as r3c6, col6.c4 as r4c6, col6.c5 as r5c6,
col6.c6 as r6c6, col6.c7 as r7c6, col6.c8 as r8c6, col6.c9 as r9c6, col7.c1 as r1c7,col7.c2 as r2c7, col7.c3 as r3c7, col7.c4 as r4c7, col7.c5 as r5c7, col7.c6 as r6c7,
col7.c7 as r7c7, col7.c8 as r8c7, col7.c9 as r9c7, col8.c1 as r1c8, col8.c2 as r2c8,col8.c3 as r3c8, col8.c4 as r4c8, col8.c5 as r5c8, col8.c6 as r6c8, col8.c7 as r7c8,
col8.c8 as r8c8, col8.c9 as r9c8, col9.c1 as r1c9, col9.c2 as r2c9, col9.c3 as r3c9,col9.c4 as r4c9, col9.c5 as r5c9, col9.c6 as r6c9, col9.c7 as r7c9, col9.c8 as r8c9,
col9.c9 as r9c9
FROM
positions col1, positions col2, positions col3,positions col4, positions col5, positions col6,positions col7, positions col8, positions col9
WHERE
-- Nombres uniques dans chaque rangee
(col1.c1 &lt;&gt; col2.c1) AND (col1.c1 &lt;&gt; col3.c1) AND (col1.c1 &lt;&gt; col4.c1) AND (col1.c1 &lt;&gt; col5.c1) AND (col1.c1 &lt;&gt; col6.c1) AND (col1.c1 &lt;&gt; col7.c1) AND (col1.c1 &lt;&gt; col8.c1) AND (col1.c1 &lt;&gt; col9.c1) AND (col1.c2 &lt;&gt; col2.c2) AND (col1.c2 &lt;&gt; col3.c2) AND (col1.c2 &lt;&gt; col4.c2) AND (col1.c2 &lt;&gt; col5.c2) AND (col1.c2 &lt;&gt; col6.c2) AND (col1.c2 &lt;&gt; col7.c2) AND (col1.c2 &lt;&gt; col8.c2) AND (col1.c2 &lt;&gt; col9.c2) AND (col1.c3 &lt;&gt; col2.c3) AND (col1.c3 &lt;&gt; col3.c3) AND (col1.c3 &lt;&gt; col4.c3) AND (col1.c3 &lt;&gt; col5.c3) AND (col1.c3 &lt;&gt; col6.c3) AND (col1.c3 &lt;&gt; col7.c3) AND (col1.c3 &lt;&gt; col8.c3) AND (col1.c3 &lt;&gt; col9.c3) AND (col1.c4 &lt;&gt; col2.c4) AND (col1.c4 &lt;&gt; col3.c4) AND (col1.c4 &lt;&gt; col4.c4) AND (col1.c4 &lt;&gt; col5.c4) AND (col1.c4 &lt;&gt; col6.c4) AND (col1.c4 &lt;&gt; col7.c4) AND (col1.c4 &lt;&gt; col8.c4) AND (col1.c4 &lt;&gt; col9.c4) AND
(col1.c5 &lt;&gt; col2.c5) AND (col1.c5 &lt;&gt; col3.c5) AND (col1.c5 &lt;&gt; col4.c5) AND (col1.c5 &lt;&gt; col5.c5) AND (col1.c5 &lt;&gt; col6.c5) AND (col1.c5 &lt;&gt; col7.c5) AND (col1.c5 &lt;&gt; col8.c5) AND (col1.c5 &lt;&gt; col9.c5) AND (col1.c6 &lt;&gt; col2.c6) AND (col1.c6 &lt;&gt; col3.c6) AND (col1.c6 &lt;&gt; col4.c6) AND (col1.c6 &lt;&gt; col5.c6) AND (col1.c6 &lt;&gt; col6.c6) AND (col1.c6 &lt;&gt; col7.c6) AND (col1.c6 &lt;&gt; col8.c6) AND (col1.c6 &lt;&gt; col9.c6) AND (col1.c7 &lt;&gt; col2.c7) AND (col1.c7 &lt;&gt; col3.c7) AND (col1.c7 &lt;&gt; col4.c7) AND (col1.c7 &lt;&gt; col5.c7) AND (col1.c7 &lt;&gt; col6.c7) AND (col1.c7 &lt;&gt; col7.c7) AND (col1.c7 &lt;&gt; col8.c7) AND (col1.c7 &lt;&gt; col9.c7) AND (col1.c8 &lt;&gt; col2.c8) AND (col1.c8 &lt;&gt; col3.c8) AND (col1.c8 &lt;&gt; col4.c8) AND (col1.c8 &lt;&gt; col5.c8) AND (col1.c8 &lt;&gt; col6.c8) AND (col1.c8 &lt;&gt; col7.c8) AND (col1.c8 &lt;&gt; col8.c8) AND (col1.c8 &lt;&gt; col9.c8) AND
(col1.c9 &lt;&gt; col2.c9) AND (col1.c9 &lt;&gt; col3.c9) AND (col1.c9 &lt;&gt; col4.c9) AND (col1.c9 &lt;&gt; col5.c9) AND (col1.c9 &lt;&gt; col6.c9) AND (col1.c9 &lt;&gt; col7.c9) AND (col1.c9 &lt;&gt; col8.c9) AND (col1.c9 &lt;&gt; col9.c9) AND (col2.c1 &lt;&gt; col3.c1) AND (col2.c1 &lt;&gt; col4.c1) AND (col2.c1 &lt;&gt; col5.c1) AND (col2.c1 &lt;&gt; col6.c1) AND (col2.c1 &lt;&gt; col7.c1) AND (col2.c1 &lt;&gt; col8.c1) AND (col2.c1 &lt;&gt; col9.c1) AND (col2.c2 &lt;&gt; col3.c2) AND (col2.c2 &lt;&gt; col4.c2) AND (col2.c2 &lt;&gt; col5.c2) AND (col2.c2 &lt;&gt; col6.c2) AND (col2.c2 &lt;&gt; col7.c2) AND (col2.c2 &lt;&gt; col8.c2) AND (col2.c2 &lt;&gt; col9.c2) AND (col2.c3 &lt;&gt; col3.c3) AND (col2.c3 &lt;&gt; col4.c3) AND (col2.c3 &lt;&gt; col5.c3) AND (col2.c3 &lt;&gt; col6.c3) AND (col2.c3 &lt;&gt; col7.c3) AND (col2.c3 &lt;&gt; col8.c3) AND (col2.c3 &lt;&gt; col9.c3) AND (col2.c4 &lt;&gt; col3.c4) AND (col2.c4 &lt;&gt; col4.c4) AND (col2.c4 &lt;&gt; col5.c4) AND
(col2.c4 &lt;&gt; col6.c4) AND (col2.c4 &lt;&gt; col7.c4) AND (col2.c4 &lt;&gt; col8.c4) AND (col2.c4 &lt;&gt; col9.c4) AND (col2.c5 &lt;&gt; col3.c5) AND (col2.c5 &lt;&gt; col4.c5) AND (col2.c5 &lt;&gt; col5.c5) AND (col2.c5 &lt;&gt; col6.c5) AND (col2.c5 &lt;&gt; col7.c5) AND (col2.c5 &lt;&gt; col8.c5) AND (col2.c5 &lt;&gt; col9.c5) AND (col2.c6 &lt;&gt; col3.c6) AND (col2.c6 &lt;&gt; col4.c6) AND (col2.c6 &lt;&gt; col5.c6) AND (col2.c6 &lt;&gt; col6.c6) AND (col2.c6 &lt;&gt; col7.c6) AND (col2.c6 &lt;&gt; col8.c6) AND (col2.c6 &lt;&gt; col9.c6) AND (col2.c7 &lt;&gt; col3.c7) AND (col2.c7 &lt;&gt; col4.c7) AND (col2.c7 &lt;&gt; col5.c7) AND (col2.c7 &lt;&gt; col6.c7) AND (col2.c7 &lt;&gt; col7.c7) AND (col2.c7 &lt;&gt; col8.c7) AND (col2.c7 &lt;&gt; col9.c7) AND (col2.c8 &lt;&gt; col3.c8) AND (col2.c8 &lt;&gt; col4.c8) AND (col2.c8 &lt;&gt; col5.c8) AND (col2.c8 &lt;&gt; col6.c8) AND (col2.c8 &lt;&gt; col7.c8) AND (col2.c8 &lt;&gt; col8.c8) AND (col2.c8 &lt;&gt; col9.c8) AND
(col2.c9 &lt;&gt; col3.c9) AND (col2.c9 &lt;&gt; col4.c9) AND (col2.c9 &lt;&gt; col5.c9) AND (col2.c9 &lt;&gt; col6.c9) AND (col2.c9 &lt;&gt; col7.c9) AND (col2.c9 &lt;&gt; col8.c9) AND (col2.c9 &lt;&gt; col9.c9) AND (col3.c1 &lt;&gt; col4.c1) AND (col3.c1 &lt;&gt; col5.c1) AND (col3.c1 &lt;&gt; col6.c1) AND (col3.c1 &lt;&gt; col7.c1) AND (col3.c1 &lt;&gt; col8.c1) AND (col3.c1 &lt;&gt; col9.c1) AND (col3.c2 &lt;&gt; col4.c2) AND (col3.c2 &lt;&gt; col5.c2) AND (col3.c2 &lt;&gt; col6.c2) AND (col3.c2 &lt;&gt; col7.c2) AND (col3.c2 &lt;&gt; col8.c2) AND (col3.c2 &lt;&gt; col9.c2) AND (col3.c3 &lt;&gt; col4.c3) AND (col3.c3 &lt;&gt; col5.c3) AND (col3.c3 &lt;&gt; col6.c3) AND (col3.c3 &lt;&gt; col7.c3) AND (col3.c3 &lt;&gt; col8.c3) AND (col3.c3 &lt;&gt; col9.c3) AND (col3.c4 &lt;&gt; col4.c4) AND (col3.c4 &lt;&gt; col5.c4) AND (col3.c4 &lt;&gt; col6.c4) AND (col3.c4 &lt;&gt; col7.c4) AND (col3.c4 &lt;&gt; col8.c4) AND (col3.c4 &lt;&gt; col9.c4) AND (col3.c5 &lt;&gt; col4.c5) AND
(col3.c5 &lt;&gt; col5.c5) AND (col3.c5 &lt;&gt; col6.c5) AND (col3.c5 &lt;&gt; col7.c5) AND (col3.c5 &lt;&gt; col8.c5) AND (col3.c5 &lt;&gt; col9.c5) AND (col3.c6 &lt;&gt; col4.c6) AND (col3.c6 &lt;&gt; col5.c6) AND (col3.c6 &lt;&gt; col6.c6) AND (col3.c6 &lt;&gt; col7.c6) AND (col3.c6 &lt;&gt; col8.c6) AND (col3.c6 &lt;&gt; col9.c6) AND (col3.c7 &lt;&gt; col4.c7) AND (col3.c7 &lt;&gt; col5.c7) AND (col3.c7 &lt;&gt; col6.c7) AND (col3.c7 &lt;&gt; col7.c7) AND (col3.c7 &lt;&gt; col8.c7) AND (col3.c7 &lt;&gt; col9.c7) AND (col3.c8 &lt;&gt; col4.c8) AND (col3.c8 &lt;&gt; col5.c8) AND (col3.c8 &lt;&gt; col6.c8) AND (col3.c8 &lt;&gt; col7.c8) AND (col3.c8 &lt;&gt; col8.c8) AND (col3.c8 &lt;&gt; col9.c8) AND (col3.c9 &lt;&gt; col4.c9) AND (col3.c9 &lt;&gt; col5.c9) AND (col3.c9 &lt;&gt; col6.c9) AND (col3.c9 &lt;&gt; col7.c9) AND (col3.c9 &lt;&gt; col8.c9) AND (col3.c9 &lt;&gt; col9.c9) AND (col4.c1 &lt;&gt; col5.c1) AND (col4.c1 &lt;&gt; col6.c1) AND (col4.c1 &lt;&gt; col7.c1) AND
(col4.c1 &lt;&gt; col8.c1) AND (col4.c1 &lt;&gt; col9.c1) AND (col4.c2 &lt;&gt; col5.c2) AND (col4.c2 &lt;&gt; col6.c2) AND (col4.c2 &lt;&gt; col7.c2) AND (col4.c2 &lt;&gt; col8.c2) AND (col4.c2 &lt;&gt; col9.c2) AND (col4.c3 &lt;&gt; col5.c3) AND (col4.c3 &lt;&gt; col6.c3) AND (col4.c3 &lt;&gt; col7.c3) AND (col4.c3 &lt;&gt; col8.c3) AND (col4.c3 &lt;&gt; col9.c3) AND (col4.c4 &lt;&gt; col5.c4) AND (col4.c4 &lt;&gt; col6.c4) AND (col4.c4 &lt;&gt; col7.c4) AND (col4.c4 &lt;&gt; col8.c4) AND (col4.c4 &lt;&gt; col9.c4) AND (col4.c5 &lt;&gt; col5.c5) AND (col4.c5 &lt;&gt; col6.c5) AND (col4.c5 &lt;&gt; col7.c5) AND (col4.c5 &lt;&gt; col8.c5) AND (col4.c5 &lt;&gt; col9.c5) AND (col4.c6 &lt;&gt; col5.c6) AND (col4.c6 &lt;&gt; col6.c6) AND (col4.c6 &lt;&gt; col7.c6) AND (col4.c6 &lt;&gt; col8.c6) AND (col4.c6 &lt;&gt; col9.c6) AND (col4.c7 &lt;&gt; col5.c7) AND (col4.c7 &lt;&gt; col6.c7) AND (col4.c7 &lt;&gt; col7.c7) AND (col4.c7 &lt;&gt; col8.c7) AND (col4.c7 &lt;&gt; col9.c7) AND
(col4.c8 &lt;&gt; col5.c8) AND (col4.c8 &lt;&gt; col6.c8) AND (col4.c8 &lt;&gt; col7.c8) AND (col4.c8 &lt;&gt; col8.c8) AND (col4.c8 &lt;&gt; col9.c8) AND (col4.c9 &lt;&gt; col5.c9) AND (col4.c9 &lt;&gt; col6.c9) AND (col4.c9 &lt;&gt; col7.c9) AND (col4.c9 &lt;&gt; col8.c9) AND (col4.c9 &lt;&gt; col9.c9) AND (col5.c1 &lt;&gt; col6.c1) AND (col5.c1 &lt;&gt; col7.c1) AND (col5.c1 &lt;&gt; col8.c1) AND (col5.c1 &lt;&gt; col9.c1) AND (col5.c2 &lt;&gt; col6.c2) AND (col5.c2 &lt;&gt; col7.c2) AND (col5.c2 &lt;&gt; col8.c2) AND (col5.c2 &lt;&gt; col9.c2) AND (col5.c3 &lt;&gt; col6.c3) AND (col5.c3 &lt;&gt; col7.c3) AND (col5.c3 &lt;&gt; col8.c3) AND (col5.c3 &lt;&gt; col9.c3) AND (col5.c4 &lt;&gt; col6.c4) AND (col5.c4 &lt;&gt; col7.c4) AND (col5.c4 &lt;&gt; col8.c4) AND (col5.c4 &lt;&gt; col9.c4) AND (col5.c5 &lt;&gt; col6.c5) AND (col5.c5 &lt;&gt; col7.c5) AND (col5.c5 &lt;&gt; col8.c5) AND (col5.c5 &lt;&gt; col9.c5) AND (col5.c6 &lt;&gt; col6.c6) AND (col5.c6 &lt;&gt; col7.c6) AND
(col5.c6 &lt;&gt; col8.c6) AND (col5.c6 &lt;&gt; col9.c6) AND (col5.c7 &lt;&gt; col6.c7) AND (col5.c7 &lt;&gt; col7.c7) AND (col5.c7 &lt;&gt; col8.c7) AND (col5.c7 &lt;&gt; col9.c7) AND (col5.c8 &lt;&gt; col6.c8) AND (col5.c8 &lt;&gt; col7.c8) AND (col5.c8 &lt;&gt; col8.c8) AND (col5.c8 &lt;&gt; col9.c8) AND (col5.c9 &lt;&gt; col6.c9) AND (col5.c9 &lt;&gt; col7.c9) AND (col5.c9 &lt;&gt; col8.c9) AND (col5.c9 &lt;&gt; col9.c9) AND (col6.c1 &lt;&gt; col7.c1) AND (col6.c1 &lt;&gt; col8.c1) AND (col6.c1 &lt;&gt; col9.c1) AND (col6.c2 &lt;&gt; col7.c2) AND (col6.c2 &lt;&gt; col8.c2) AND (col6.c2 &lt;&gt; col9.c2) AND (col6.c3 &lt;&gt; col7.c3) AND (col6.c3 &lt;&gt; col8.c3) AND (col6.c3 &lt;&gt; col9.c3) AND (col6.c4 &lt;&gt; col7.c4) AND (col6.c4 &lt;&gt; col8.c4) AND (col6.c4 &lt;&gt; col9.c4) AND (col6.c5 &lt;&gt; col7.c5) AND (col6.c5 &lt;&gt; col8.c5) AND (col6.c5 &lt;&gt; col9.c5) AND (col6.c6 &lt;&gt; col7.c6) AND (col6.c6 &lt;&gt; col8.c6) AND (col6.c6 &lt;&gt; col9.c6) AND
(col6.c7 &lt;&gt; col7.c7) AND (col6.c7 &lt;&gt; col8.c7) AND (col6.c7 &lt;&gt; col9.c7) AND (col6.c8 &lt;&gt; col7.c8) AND (col6.c8 &lt;&gt; col8.c8) AND (col6.c8 &lt;&gt; col9.c8) AND (col6.c9 &lt;&gt; col7.c9) AND (col6.c9 &lt;&gt; col8.c9) AND (col6.c9 &lt;&gt; col9.c9) AND (col7.c1 &lt;&gt; col8.c1) AND (col7.c1 &lt;&gt; col9.c1) AND (col7.c2 &lt;&gt; col8.c2) AND (col7.c2 &lt;&gt; col9.c2) AND (col7.c3 &lt;&gt; col8.c3) AND (col7.c3 &lt;&gt; col9.c3) AND (col7.c4 &lt;&gt; col8.c4) AND (col7.c4 &lt;&gt; col9.c4) AND (col7.c5 &lt;&gt; col8.c5) AND (col7.c5 &lt;&gt; col9.c5) AND (col7.c6 &lt;&gt; col8.c6) AND (col7.c6 &lt;&gt; col9.c6) AND (col7.c7 &lt;&gt; col8.c7) AND (col7.c7 &lt;&gt; col9.c7) AND (col7.c8 &lt;&gt; col8.c8) AND (col7.c8 &lt;&gt; col9.c8) AND (col7.c9 &lt;&gt; col8.c9) AND (col7.c9 &lt;&gt; col9.c9) AND (col8.c1 &lt;&gt; col9.c1) AND (col8.c2 &lt;&gt; col9.c2) AND (col8.c3 &lt;&gt; col9.c3) AND (col8.c4 &lt;&gt; col9.c4) AND (col8.c5 &lt;&gt; col9.c5) AND
(col8.c6 &lt;&gt; col9.c6) AND (col8.c7 &lt;&gt; col9.c7) AND (col8.c8 &lt;&gt; col9.c8) AND (col8.c9 &lt;&gt; col9.c9) AND
-- Nombres uniques dans chaque maison de 3x3
(col1.c1 &lt;&gt; col1.c2) AND (col1.c1 &lt;&gt; col1.c3) AND (col1.c1 &lt;&gt; col2.c2) AND (col1.c1 &lt;&gt; col2.c3) AND (col1.c1 &lt;&gt; col3.c2) AND (col1.c1 &lt;&gt; col3.c3) AND (col1.c2 &lt;&gt; col1.c3) AND (col1.c2 &lt;&gt; col2.c1) AND (col1.c2 &lt;&gt; col2.c3) AND (col1.c2 &lt;&gt; col3.c1) AND (col1.c2 &lt;&gt; col3.c3) AND (col1.c3 &lt;&gt; col2.c1) AND (col1.c3 &lt;&gt; col2.c2) AND (col1.c3 &lt;&gt; col3.c1) AND (col1.c3 &lt;&gt; col3.c2) AND (col1.c4 &lt;&gt; col1.c5) AND (col1.c4 &lt;&gt; col1.c6) AND (col1.c4 &lt;&gt; col2.c5) AND (col1.c4 &lt;&gt; col2.c6) AND (col1.c4 &lt;&gt; col3.c5) AND (col1.c4 &lt;&gt; col3.c6) AND (col1.c5 &lt;&gt; col1.c6) AND (col1.c5 &lt;&gt; col2.c4) AND (col1.c5 &lt;&gt; col2.c6) AND (col1.c5 &lt;&gt; col3.c4) AND (col1.c5 &lt;&gt; col3.c6) AND (col1.c6 &lt;&gt; col2.c4) AND (col1.c6 &lt;&gt; col2.c5) AND (col1.c6 &lt;&gt; col3.c4) AND (col1.c6 &lt;&gt; col3.c5) AND (col1.c7 &lt;&gt; col1.c8) AND (col1.c7 &lt;&gt; col1.c9) AND
(col1.c7 &lt;&gt; col2.c8) AND (col1.c7 &lt;&gt; col2.c9) AND (col1.c7 &lt;&gt; col3.c8) AND (col1.c7 &lt;&gt; col3.c9) AND (col1.c8 &lt;&gt; col1.c9) AND (col1.c8 &lt;&gt; col2.c7) AND (col1.c8 &lt;&gt; col2.c9) AND (col1.c8 &lt;&gt; col3.c7) AND (col1.c8 &lt;&gt; col3.c9) AND (col1.c9 &lt;&gt; col2.c7) AND (col1.c9 &lt;&gt; col2.c8) AND (col1.c9 &lt;&gt; col3.c7) AND (col1.c9 &lt;&gt; col3.c8) AND (col2.c1 &lt;&gt; col2.c2) AND (col2.c1 &lt;&gt; col2.c3) AND (col2.c1 &lt;&gt; col3.c2) AND (col2.c1 &lt;&gt; col3.c3) AND (col2.c2 &lt;&gt; col2.c3) AND (col2.c2 &lt;&gt; col3.c1) AND (col2.c2 &lt;&gt; col3.c3) AND (col2.c3 &lt;&gt; col3.c1) AND (col2.c3 &lt;&gt; col3.c2) AND (col2.c4 &lt;&gt; col2.c5) AND (col2.c4 &lt;&gt; col2.c6) AND (col2.c4 &lt;&gt; col3.c5) AND (col2.c4 &lt;&gt; col3.c6) AND (col2.c5 &lt;&gt; col2.c6) AND (col2.c5 &lt;&gt; col3.c4) AND (col2.c5 &lt;&gt; col3.c6) AND (col2.c6 &lt;&gt; col3.c4) AND (col2.c6 &lt;&gt; col3.c5) AND (col2.c7 &lt;&gt; col2.c8) AND
(col2.c7 &lt;&gt; col2.c9) AND (col2.c7 &lt;&gt; col3.c8) AND (col2.c7 &lt;&gt; col3.c9) AND (col2.c8 &lt;&gt; col2.c9) AND (col2.c8 &lt;&gt; col3.c7) AND (col2.c8 &lt;&gt; col3.c9) AND (col2.c9 &lt;&gt; col3.c7) AND (col2.c9 &lt;&gt; col3.c8) AND (col3.c1 &lt;&gt; col3.c2) AND (col3.c1 &lt;&gt; col3.c3) AND (col3.c2 &lt;&gt; col3.c3) AND (col3.c4 &lt;&gt; col3.c5) AND (col3.c4 &lt;&gt; col3.c6) AND (col3.c5 &lt;&gt; col3.c6) AND (col3.c7 &lt;&gt; col3.c8) AND (col3.c7 &lt;&gt; col3.c9) AND (col3.c8 &lt;&gt; col3.c9) AND (col4.c1 &lt;&gt; col4.c2) AND (col4.c1 &lt;&gt; col4.c3) AND (col4.c1 &lt;&gt; col5.c2) AND (col4.c1 &lt;&gt; col5.c3) AND (col4.c1 &lt;&gt; col6.c2) AND (col4.c1 &lt;&gt; col6.c3) AND (col4.c2 &lt;&gt; col4.c3) AND (col4.c2 &lt;&gt; col5.c1) AND (col4.c2 &lt;&gt; col5.c3) AND (col4.c2 &lt;&gt; col6.c1) AND (col4.c2 &lt;&gt; col6.c3) AND (col4.c3 &lt;&gt; col5.c1) AND (col4.c3 &lt;&gt; col5.c2) AND (col4.c3 &lt;&gt; col6.c1) AND (col4.c3 &lt;&gt; col6.c2) AND
(col4.c4 &lt;&gt; col4.c5) AND (col4.c4 &lt;&gt; col4.c6) AND (col4.c4 &lt;&gt; col5.c5) AND (col4.c4 &lt;&gt; col5.c6) AND (col4.c4 &lt;&gt; col6.c5) AND (col4.c4 &lt;&gt; col6.c6) AND (col4.c5 &lt;&gt; col4.c6) AND (col4.c5 &lt;&gt; col5.c4) AND (col4.c5 &lt;&gt; col5.c6) AND (col4.c5 &lt;&gt; col6.c4) AND (col4.c5 &lt;&gt; col6.c6) AND (col4.c6 &lt;&gt; col5.c4) AND (col4.c6 &lt;&gt; col5.c5) AND (col4.c6 &lt;&gt; col6.c4) AND (col4.c6 &lt;&gt; col6.c5) AND (col4.c7 &lt;&gt; col4.c8) AND (col4.c7 &lt;&gt; col4.c9) AND (col4.c7 &lt;&gt; col5.c8) AND (col4.c7 &lt;&gt; col5.c9) AND (col4.c7 &lt;&gt; col6.c8) AND (col4.c7 &lt;&gt; col6.c9) AND (col4.c8 &lt;&gt; col4.c9) AND (col4.c8 &lt;&gt; col5.c7) AND (col4.c8 &lt;&gt; col5.c9) AND (col4.c8 &lt;&gt; col6.c7) AND (col4.c8 &lt;&gt; col6.c9) AND (col4.c9 &lt;&gt; col5.c7) AND (col4.c9 &lt;&gt; col5.c8) AND (col4.c9 &lt;&gt; col6.c7) AND (col4.c9 &lt;&gt; col6.c8) AND (col5.c1 &lt;&gt; col5.c2) AND (col5.c1 &lt;&gt; col5.c3) AND
(col5.c1 &lt;&gt; col6.c2) AND (col5.c1 &lt;&gt; col6.c3) AND (col5.c2 &lt;&gt; col5.c3) AND (col5.c2 &lt;&gt; col6.c1) AND (col5.c2 &lt;&gt; col6.c3) AND (col5.c3 &lt;&gt; col6.c1) AND (col5.c3 &lt;&gt; col6.c2) AND (col5.c4 &lt;&gt; col5.c5) AND (col5.c4 &lt;&gt; col5.c6) AND (col5.c4 &lt;&gt; col6.c5) AND (col5.c4 &lt;&gt; col6.c6) AND (col5.c5 &lt;&gt; col5.c6) AND (col5.c5 &lt;&gt; col6.c4) AND (col5.c5 &lt;&gt; col6.c6) AND (col5.c6 &lt;&gt; col6.c4) AND (col5.c6 &lt;&gt; col6.c5) AND (col5.c7 &lt;&gt; col5.c8) AND (col5.c7 &lt;&gt; col5.c9) AND (col5.c7 &lt;&gt; col6.c8) AND (col5.c7 &lt;&gt; col6.c9) AND (col5.c8 &lt;&gt; col5.c9) AND (col5.c8 &lt;&gt; col6.c7) AND (col5.c8 &lt;&gt; col6.c9) AND (col5.c9 &lt;&gt; col6.c7) AND (col5.c9 &lt;&gt; col6.c8) AND (col6.c1 &lt;&gt; col6.c2) AND (col6.c1 &lt;&gt; col6.c3) AND (col6.c2 &lt;&gt; col6.c3) AND (col6.c4 &lt;&gt; col6.c5) AND (col6.c4 &lt;&gt; col6.c6) AND (col6.c5 &lt;&gt; col6.c6) AND (col6.c7 &lt;&gt; col6.c8) AND
(col6.c7 &lt;&gt; col6.c9) AND (col6.c8 &lt;&gt; col6.c9) AND (col7.c1 &lt;&gt; col7.c2) AND (col7.c1 &lt;&gt; col7.c3) AND (col7.c1 &lt;&gt; col8.c2) AND (col7.c1 &lt;&gt; col8.c3) AND (col7.c1 &lt;&gt; col9.c2) AND (col7.c1 &lt;&gt; col9.c3) AND (col7.c2 &lt;&gt; col7.c3) AND (col7.c2 &lt;&gt; col8.c1) AND (col7.c2 &lt;&gt; col8.c3) AND (col7.c2 &lt;&gt; col9.c1) AND (col7.c2 &lt;&gt; col9.c3) AND (col7.c3 &lt;&gt; col8.c1) AND (col7.c3 &lt;&gt; col8.c2) AND (col7.c3 &lt;&gt; col9.c1) AND (col7.c3 &lt;&gt; col9.c2) AND (col7.c4 &lt;&gt; col7.c5) AND (col7.c4 &lt;&gt; col7.c6) AND (col7.c4 &lt;&gt; col8.c5) AND (col7.c4 &lt;&gt; col8.c6) AND (col7.c4 &lt;&gt; col9.c5) AND (col7.c4 &lt;&gt; col9.c6) AND (col7.c5 &lt;&gt; col7.c6) AND (col7.c5 &lt;&gt; col8.c4) AND (col7.c5 &lt;&gt; col8.c6) AND (col7.c5 &lt;&gt; col9.c4) AND (col7.c5 &lt;&gt; col9.c6) AND (col7.c6 &lt;&gt; col8.c4) AND (col7.c6 &lt;&gt; col8.c5) AND (col7.c6 &lt;&gt; col9.c4) AND (col7.c6 &lt;&gt; col9.c5) AND
(col7.c7 &lt;&gt; col7.c8) AND (col7.c7 &lt;&gt; col7.c9) AND (col7.c7 &lt;&gt; col8.c8) AND (col7.c7 &lt;&gt; col8.c9) AND (col7.c7 &lt;&gt; col9.c8) AND (col7.c7 &lt;&gt; col9.c9) AND (col7.c8 &lt;&gt; col7.c9) AND (col7.c8 &lt;&gt; col8.c7) AND (col7.c8 &lt;&gt; col8.c9) AND (col7.c8 &lt;&gt; col9.c7) AND (col7.c8 &lt;&gt; col9.c9) AND (col7.c9 &lt;&gt; col8.c7) AND (col7.c9 &lt;&gt; col8.c8) AND (col7.c9 &lt;&gt; col9.c7) AND (col7.c9 &lt;&gt; col9.c8) AND (col8.c1 &lt;&gt; col8.c2) AND (col8.c1 &lt;&gt; col8.c3) AND (col8.c1 &lt;&gt; col9.c2) AND (col8.c1 &lt;&gt; col9.c3) AND (col8.c2 &lt;&gt; col8.c3) AND (col8.c2 &lt;&gt; col9.c1) AND (col8.c2 &lt;&gt; col9.c3) AND (col8.c3 &lt;&gt; col9.c1) AND (col8.c3 &lt;&gt; col9.c2) AND (col8.c4 &lt;&gt; col8.c5) AND (col8.c4 &lt;&gt; col8.c6) AND (col8.c4 &lt;&gt; col9.c5) AND (col8.c4 &lt;&gt; col9.c6) AND (col8.c5 &lt;&gt; col8.c6) AND (col8.c5 &lt;&gt; col9.c4) AND (col8.c5 &lt;&gt; col9.c6) AND (col8.c6 &lt;&gt; col9.c4) AND
(col8.c6 &lt;&gt; col9.c5) AND (col8.c7 &lt;&gt; col8.c8) AND (col8.c7 &lt;&gt; col8.c9) AND (col8.c7 &lt;&gt; col9.c8) AND (col8.c7 &lt;&gt; col9.c9) AND (col8.c8 &lt;&gt; col8.c9) AND (col8.c8 &lt;&gt; col9.c7) AND (col8.c8 &lt;&gt; col9.c9) AND (col8.c9 &lt;&gt; col9.c7) AND (col8.c9 &lt;&gt; col9.c8) AND (col9.c1 &lt;&gt; col9.c2) AND (col9.c1 &lt;&gt; col9.c3) AND (col9.c2 &lt;&gt; col9.c3) AND (col9.c4 &lt;&gt; col9.c5) AND (col9.c4 &lt;&gt; col9.c6) AND (col9.c5 &lt;&gt; col9.c6) AND (col9.c7 &lt;&gt; col9.c8) AND (col9.c7 &lt;&gt; col9.c9) AND (col9.c8 &lt;&gt; col9.c9);
</pre></p>
<p>Maintenant, chers lecteurs, patientez un peu!</p>
<p><strong>ATTENTION : n&#8217;allez surtout pas essayer de solutionner une grille  avant de passer au prochain point!</strong></p>
<p>Pour l&#8217;instant, contentez-vous seulement de créer la nouvelle vue <strong>sudoku_combined_view</strong> :</p>
<p><pre class="brush: sql; wrap-lines: false;">
USE sudoku;

CREATE VIEW sudoku_combined_view AS
SELECT t1.*
FROM sudoku_rows_view t1
INNER JOIN sudoku_columns_view t2
ON

-- Jointures entre représentation-colonnes et représentation-rangées
(t1.r1c1 = t2.r1c1) AND (t1.r1c2 = t2.r1c2) AND (t1.r1c3 = t2.r1c3) AND (t1.r1c4 = t2.r1c4) AND
(t1.r1c5 = t2.r1c5) AND (t1.r1c6 = t2.r1c6) AND (t1.r1c7 = t2.r1c7) AND (t1.r1c8 = t2.r1c8) AND
(t1.r1c9 = t2.r1c9) AND (t1.r2c1 = t2.r2c1) AND (t1.r2c2 = t2.r2c2) AND (t1.r2c3 = t2.r2c3) AND
(t1.r2c4 = t2.r2c4) AND (t1.r2c5 = t2.r2c5) AND (t1.r2c6 = t2.r2c6) AND (t1.r2c7 = t2.r2c7) AND
(t1.r2c8 = t2.r2c8) AND (t1.r2c9 = t2.r2c9) AND (t1.r3c1 = t2.r3c1) AND (t1.r3c2 = t2.r3c2) AND
(t1.r3c3 = t2.r3c3) AND (t1.r3c4 = t2.r3c4) AND (t1.r3c5 = t2.r3c5) AND (t1.r3c6 = t2.r3c6) AND
(t1.r3c7 = t2.r3c7) AND (t1.r3c8 = t2.r3c8) AND (t1.r3c9 = t2.r3c9) AND (t1.r4c1 = t2.r4c1) AND
(t1.r4c2 = t2.r4c2) AND (t1.r4c3 = t2.r4c3) AND (t1.r4c4 = t2.r4c4) AND (t1.r4c5 = t2.r4c5) AND
(t1.r4c6 = t2.r4c6) AND (t1.r4c7 = t2.r4c7) AND (t1.r4c8 = t2.r4c8) AND (t1.r4c9 = t2.r4c9) AND
(t1.r5c1 = t2.r5c1) AND (t1.r5c2 = t2.r5c2) AND (t1.r5c3 = t2.r5c3) AND (t1.r5c4 = t2.r5c4) AND
(t1.r5c5 = t2.r5c5) AND (t1.r5c6 = t2.r5c6) AND (t1.r5c7 = t2.r5c7) AND (t1.r5c8 = t2.r5c8) AND
(t1.r5c9 = t2.r5c9) AND (t1.r6c1 = t2.r6c1) AND (t1.r6c2 = t2.r6c2) AND (t1.r6c3 = t2.r6c3) AND
(t1.r6c4 = t2.r6c4) AND (t1.r6c5 = t2.r6c5) AND (t1.r6c6 = t2.r6c6) AND (t1.r6c7 = t2.r6c7) AND
(t1.r6c8 = t2.r6c8) AND (t1.r6c9 = t2.r6c9) AND (t1.r7c1 = t2.r7c1) AND (t1.r7c2 = t2.r7c2) AND
(t1.r7c3 = t2.r7c3) AND (t1.r7c4 = t2.r7c4) AND (t1.r7c5 = t2.r7c5) AND (t1.r7c6 = t2.r7c6) AND
(t1.r7c7 = t2.r7c7) AND (t1.r7c8 = t2.r7c8) AND (t1.r7c9 = t2.r7c9) AND (t1.r8c1 = t2.r8c1) AND
(t1.r8c2 = t2.r8c2) AND (t1.r8c3 = t2.r8c3) AND (t1.r8c4 = t2.r8c4) AND (t1.r8c5 = t2.r8c5) AND
(t1.r8c6 = t2.r8c6) AND (t1.r8c7 = t2.r8c7) AND (t1.r8c8 = t2.r8c8) AND (t1.r8c9 = t2.r8c9) AND
(t1.r9c1 = t2.r9c1) AND (t1.r9c2 = t2.r9c2) AND (t1.r9c3 = t2.r9c3) AND (t1.r9c4 = t2.r9c4) AND
(t1.r9c5 = t2.r9c5) AND (t1.r9c6 = t2.r9c6) AND (t1.r9c7 = t2.r9c7) AND (t1.r9c8 = t2.r9c8) AND
(t1.r9c9 = t2.r9c9);
</pre></p>
<p><strong>4. L&#8217;optimisateur de plan</strong></p>
<p>Avant de tenter d&#8217;exécuter la requête de la grille présentée au point 1 de cet article, quelques explications sont de mise. Il appert que notre nouvelle façon de faire change radicalement les choses!</p>
<p>En effet, au lieu de joindre seulement 9 tables comme c&#8217;était le cas avec <strong>sudoku_rows_view</strong>, notre nouvelle solution joint 9 tables une première fois (<strong>sudoku_rows_view</strong>), encore une fois 9 tables (<strong>sudoku_columns_view</strong>) puis regroupe les résultats de ces 2 vues dans <strong>sudoku_combined_view</strong>.</p>
<p>Il faut savoir que l&#8217;optimisateur de requêtes de MySQL, par défaut, énumère <strong>toutes</strong> les jointures possibles pour déterminer le plan d&#8217;accès qu&#8217;il considère comme optimal. Dans le cas qui nous intéresse, l&#8217;optimisateur détecte donc 18 tables indirectement référencées par la vue <strong>sudoku_combined_view</strong> et aura donc à examiner 18! (18 factorielle) jointures possibles, c&#8217;est-à-dire un total de 6402373705728000 jointures! Si par malheur vous tentiez d&#8217;exécuter la requête sur la vue <strong>sudoku_combined_view</strong>, il vous faudrait attendre une éternité avant que MySQL détermine un plan d&#8217;accès!  Pour vérifier, j&#8217;ai laissé rouler une requête de EXPLAIN sur la vue sudoku_combined_view pendant 2 jours avant de l&#8217;arrêter&#8230;</p>
<p>Heureusement, il existe une variable système nous permettant de contrôler le zèle de l&#8217;optimisateur de requêtes!  Cette variable s&#8217;appelle <a title="optimizer_search_depth" href="http://dev.mysql.com/doc/refman/5.0/fr/controlling-optimizer.html" target="_blank">optimizer_search_depth</a>.  Elle détermine la profondeur d&#8217;analyse de l&#8217;optimisateur quand celui-ci essaie de trouver le plan d&#8217;accès optimal.  À quoi bon un plan d&#8217;accès optimal si celui-ci prend 3 semaines à être généré ?  En ce qui nous concerne, un plan d&#8217;accès non optimal mais généré rapidement, compte tenu des 18 tables, est ce que nous recherchons!</p>
<p>La variable <strong>optimizer_search_depth</strong> peut être changée dans les fichiers de configuration de MySQL ou dynamiquement au beau milieu d&#8217;une session.  <strong>Prenez garde toutefois!  Si vous changez cette variable dans une session et non au niveau des fichiers de configuration, la nouvelle valeur de la variable ne s&#8217;applique qu&#8217;à la session!</strong></p>
<p><a href="http://endormitoire.files.wordpress.com/2012/01/optimizer_search_depth.jpg"><img class="aligncenter size-full wp-image-294" title="optimizer_search_depth" src="http://endormitoire.files.wordpress.com/2012/01/optimizer_search_depth.jpg?w=450&#038;h=293" alt="" width="450" height="293" /></a></p>
<p>Réglons cette valeur à 3  pour l&#8217;instant (plus de détails quant à cette valeur dans le prochain article)  :</p>
<p><pre class="brush: sql;">

set @@optimizer_search_depth = 3;

</pre></p>
<p>Maintenant, nous pouvons exécuter notre requête :</p>
<p><pre class="brush: sql; wrap-lines: false;">

SELECT *
FROM sudoku_combined_view
WHERE
(r2c1 = 1) AND (r2c2 = 3) AND (r2c3 = 4) AND (r2c4 = 8) AND
(r2c5 = 2) AND (r2c6 = 5) AND (r2c7 = 6) AND (r2c8 = 9) AND
(r2c9 = 7) AND (r3c1 = 7) AND (r3c2 = 5) AND (r3c3 = 9) AND
(r3c4 = 3) AND (r3c5 = 6) AND (r3c6 = 4) AND (r3c7 = 1) AND
(r3c8 = 8) AND (r3c9 = 2) AND (r4c1 = 3) AND (r4c2 = 9) AND
(r4c3 = 7) AND (r4c4 = 1) AND (r4c5 = 8) AND (r4c6 = 2) AND
(r4c7 = 5) AND (r4c8 = 6) AND (r4c9 = 4) AND (r6c1 = 5) AND
(r6c2 = 8) AND (r6c3 = 1) AND (r6c4 = 4) AND (r6c5 = 7) AND
(r6c6 = 6) AND (r6c7 = 2) AND (r6c8 = 3) AND (r6c9 = 9) AND
(r7c1 = 8) AND (r7c2 = 2) AND (r7c3 = 5) AND (r7c4 = 6) AND
(r7c5 = 4) AND (r7c6 = 1) AND (r7c7 = 9) AND (r7c8 = 7) AND
(r7c9 = 3) AND (r8c1 = 9) AND (r8c2 = 7) AND (r8c3 = 6) AND
(r8c4 = 5) AND (r8c5 = 3) AND (r8c6 = 8) AND (r8c7 = 4) AND
(r8c8 = 2) AND (r8c9 = 1);

</pre></p>
<p><a href="http://endormitoire.files.wordpress.com/2012/01/combined_search_depth.jpg"><img class="aligncenter size-full wp-image-299" title="sudoku_combined_view et optimizer_search_depth" src="http://endormitoire.files.wordpress.com/2012/01/combined_search_depth.jpg?w=450&#038;h=209" alt="" width="450" height="209" /></a></p>
<p>Fantastique!  1.08 seconde!  Est-il possible d&#8217;extraire plus de jus de ce citron?</p>
<p>Voyons ce que le EXPLAIN a à nous dire :</p>
<p><pre class="brush: plain; wrap-lines: false;">
+----+-------------+-------+-------------+----------------------------------------------------------------------------------------------------------------------------------------------------+-------------+---------+-------------------------------+------+--------------------------------------------------------------+
| id | select_type | table | type        | possible_keys                                                                                                                                      | key         | key_len | ref                           | rows | Extra                                                        |
+----+-------------+-------+-------------+----------------------------------------------------------------------------------------------------------------------------------------------------+-------------+---------+-------------------------------+------+--------------------------------------------------------------+
|  1 | SIMPLE      | col3  | index_merge | i12,i13,i14,i15,i16,i17,i18,i19,i23,i24,i25,i26,i27,i28,i29,i34,i35,i36,i37,i38,i39,i45,i46,i47,i48,i49,i56,i57,i58,i59,i67,i68,i69,i78,i79,i89,i9 | i23,i38,i48 | 2,2,2   | NULL                          |   64 | Using intersect(i23,i38,i48); Using where                    |
|  1 | SIMPLE      | col9  | index_merge | i12,i13,i14,i15,i16,i17,i18,i19,i23,i24,i25,i26,i27,i28,i29,i34,i35,i36,i37,i38,i39,i45,i46,i47,i48,i49,i56,i57,i58,i59,i67,i68,i69,i78,i79,i89,i9 | i78,i68,i48 | 2,2,2   | NULL                          |   65 | Using intersect(i78,i68,i48); Using where; Using join buffer |
|  1 | SIMPLE      | r2    | index_merge | i12,i13,i14,i15,i16,i17,i18,i19,i23,i24,i25,i26,i27,i28,i29,i34,i35,i36,i37,i38,i39,i45,i46,i47,i48,i49,i56,i57,i58,i59,i67,i68,i69,i78,i79,i89,i9 | i37,i29     | 2,2     | NULL                          |   68 | Using intersect(i37,i29); Using where; Using join buffer     |
|  1 | SIMPLE      | r3    | index_merge | i12,i13,i14,i15,i16,i17,i18,i19,i23,i24,i25,i26,i27,i28,i29,i34,i35,i36,i37,i38,i39,i45,i46,i47,i48,i49,i56,i57,i58,i59,i67,i68,i69,i78,i79,i89,i9 | i37,i28     | 2,2     | NULL                          |   68 | Using intersect(i37,i28); Using where; Using join buffer     |
|  1 | SIMPLE      | r4    | index_merge | i12,i13,i14,i15,i16,i17,i18,i19,i23,i24,i25,i26,i27,i28,i29,i34,i35,i36,i37,i38,i39,i45,i46,i47,i48,i49,i56,i57,i58,i59,i67,i68,i69,i78,i79,i89,i9 | i56,i29     | 2,2     | NULL                          |   68 | Using intersect(i56,i29); Using where; Using join buffer     |
|  1 | SIMPLE      | r6    | index_merge | i12,i13,i14,i15,i16,i17,i18,i19,i23,i24,i25,i26,i27,i28,i29,i34,i35,i36,i37,i38,i39,i45,i46,i47,i48,i49,i56,i57,i58,i59,i67,i68,i69,i78,i79,i89,i9 | i12,i35     | 2,2     | NULL                          |   68 | Using intersect(i12,i35); Using where; Using join buffer     |
|  1 | SIMPLE      | r7    | index_merge | i12,i13,i14,i15,i16,i17,i18,i19,i23,i24,i25,i26,i27,i28,i29,i34,i35,i36,i37,i38,i39,i45,i46,i47,i48,i49,i56,i57,i58,i59,i67,i68,i69,i78,i79,i89,i9 | i12,i68     | 2,2     | NULL                          |   68 | Using intersect(i12,i68); Using where; Using join buffer     |
|  1 | SIMPLE      | col1  | index_merge | i12,i13,i14,i15,i16,i17,i18,i19,i23,i24,i25,i26,i27,i28,i29,i34,i35,i36,i37,i38,i39,i45,i46,i47,i48,i49,i56,i57,i58,i59,i67,i68,i69,i78,i79,i89,i9 | i23,i67     | 2,2     | NULL                          |   68 | Using intersect(i23,i67); Using where; Using join buffer     |
|  1 | SIMPLE      | col2  | index_merge | i12,i13,i14,i15,i16,i17,i18,i19,i23,i24,i25,i26,i27,i28,i29,i34,i35,i36,i37,i38,i39,i45,i46,i47,i48,i49,i56,i57,i58,i59,i67,i68,i69,i78,i79,i89,i9 | i23,i68     | 2,2     | NULL                          |   68 | Using intersect(i23,i68); Using where; Using join buffer     |
|  1 | SIMPLE      | col4  | index_merge | i12,i13,i14,i15,i16,i17,i18,i19,i23,i24,i25,i26,i27,i28,i29,i34,i35,i36,i37,i38,i39,i45,i46,i47,i48,i49,i56,i57,i58,i59,i67,i68,i69,i78,i79,i89,i9 | i78,i46     | 2,2     | NULL                          |   68 | Using intersect(i78,i46); Using where; Using join buffer     |
|  1 | SIMPLE      | col5  | index_merge | i12,i13,i14,i15,i16,i17,i18,i19,i23,i24,i25,i26,i27,i28,i29,i34,i35,i36,i37,i38,i39,i45,i46,i47,i48,i49,i56,i57,i58,i59,i67,i68,i69,i78,i79,i89,i9 | i23,i68     | 2,2     | NULL                          |   68 | Using intersect(i23,i68); Using where; Using join buffer     |
|  1 | SIMPLE      | col6  | index_merge | i12,i13,i14,i15,i16,i17,i18,i19,i23,i24,i25,i26,i27,i28,i29,i34,i35,i36,i37,i38,i39,i45,i46,i47,i48,i49,i56,i57,i58,i59,i67,i68,i69,i78,i79,i89,i9 | i23,i67     | 2,2     | NULL                          |   68 | Using intersect(i23,i67); Using where; Using join buffer     |
|  1 | SIMPLE      | r8    | index_merge | i12,i13,i14,i15,i16,i17,i18,i19,i23,i24,i25,i26,i27,i28,i29,i34,i35,i36,i37,i38,i39,i45,i46,i47,i48,i49,i56,i57,i58,i59,i67,i68,i69,i78,i79,i89,i9 | i37,i79,i38 | 2,2,2   | NULL                          |   78 | Using intersect(i37,i79,i38); Using where; Using join buffer |
|  1 | SIMPLE      | col8  | index_merge | i12,i13,i14,i15,i16,i17,i18,i19,i23,i24,i25,i26,i27,i28,i29,i34,i35,i36,i37,i38,i39,i45,i46,i47,i48,i49,i56,i57,i58,i59,i67,i68,i69,i78,i79,i89,i9 | i37,i24     | 2,2     | NULL                          |   68 | Using intersect(i37,i24); Using where; Using join buffer     |
|  1 | SIMPLE      | col7  | index_merge | i12,i13,i14,i15,i16,i17,i18,i19,i23,i24,i25,i26,i27,i28,i29,i34,i35,i36,i37,i38,i39,i45,i46,i47,i48,i49,i56,i57,i58,i59,i67,i68,i69,i78,i79,i89,i9 | i23,i68     | 2,2     | NULL                          |   68 | Using intersect(i23,i68); Using where; Using join buffer     |
|  1 | SIMPLE      | r1    | ref         | i12,i13,i14,i15,i16,i17,i18,i19,i23,i24,i25,i26,i27,i28,i29,i34,i35,i36,i37,i38,i39,i45,i46,i47,i48,i49,i56,i57,i58,i59,i67,i68,i69,i78,i79,i89,i9 | i12         | 2       | sudoku.col1.c1,sudoku.col2.c1 | 5040 | Using where                                                  |
|  1 | SIMPLE      | r5    | ref         | i12,i13,i14,i15,i16,i17,i18,i19,i23,i24,i25,i26,i27,i28,i29,i34,i35,i36,i37,i38,i39,i45,i46,i47,i48,i49,i56,i57,i58,i59,i67,i68,i69,i78,i79,i89,i9 | i12         | 2       | sudoku.col1.c5,sudoku.col2.c5 | 5040 | Using where                                                  |
|  1 | SIMPLE      | r9    | ref         | i12,i13,i14,i15,i16,i17,i18,i19,i23,i24,i25,i26,i27,i28,i29,i34,i35,i36,i37,i38,i39,i45,i46,i47,i48,i49,i56,i57,i58,i59,i67,i68,i69,i78,i79,i89,i9 | i12         | 2       | sudoku.col1.c9,sudoku.col2.c9 | 5040 | Using where                                                  |
+----+-------------+-------+-------------+----------------------------------------------------------------------------------------------------------------------------------------------------+-------------+---------+-------------------------------+------+--------------------------------------------------------------+
18 rows in set (0.28 sec)
</pre></p>
<p><strong>5. Optimisation de la table</strong></p>
<p>Il existe quelques trucs d&#8217;optimisation de table que nous avons omis de faire.  C&#8217;est peut-être le temps d&#8217;y songer pour extraire chaque milliseconde et chaque octet possible!</p>
<p>Bien que la table <strong>positions</strong> ne subisse jamais de <a title="UPDATE" href="http://dev.mysql.com/doc/refman/5.0/fr/update.html" target="_blank">UPDATE</a>, de <a title="INSERT" href="http://dev.mysql.com/doc/refman/5.0/fr/insert.html" target="_blank">INSERT</a> ou de <a title="DELETE" href="http://dev.mysql.com/doc/refman/5.0/fr/delete.html" target="_blank">DELETE</a>, sommes-nous certains que les pages d&#8217;index sont triées ? Pour ce faire, nous pourrions exécuter un <a title="OPTIMIZE TABLE" href="http://dev.mysql.com/doc/refman/5.0/fr/optimize-table.html" target="_blank">OPTIMIZE TABLE</a> sur la table positions.  Ce serait inutile dans notre cas.  Pourquoi?  Parce que les permutations générées pour créer les requêtes d&#8217;insertion dans la table <strong>positions</strong> ont été générées dans l&#8217;ordre des index.</p>
<p>D&#8217;autre part, comme la table n&#8217;a connu aucune modification, un <a title="ANALYZE TABLE" href="http://dev.mysql.com/doc/refman/5.0/fr/analyze-table.html" target="_blank">ANALYZE TABLE</a> serait, lui aussi, totalement inutile!</p>
<p>Changer la définition de la table avec un <a title="ALTER TABLE" href="http://dev.mysql.com/doc/refman/5.0/fr/alter-table.html" target="_blank">ALTER TABLE</a> pour y inclure <a title="AVG_ROW_LENGTH" href="http://dev.mysql.com/doc/refman/5.0/fr/create-table.html" target="_blank">AVG_ROW_LENGTH</a> et <a title="MAX_ROWS" href="http://dev.mysql.com/doc/refman/5.0/fr/create-table.html" target="_blank">MAX_ROWS</a> ?  Pas plus utile.  Comme le format des lignes dans la table <strong>positions</strong> est <em>Fixed</em> et que la table est de format MyISAM, ces deux valeurs n&#8217;ont pas à être forcées puisque MySQL les détermine sans notre aide!</p>
<p><strong>6. Impossible n&#8217;est pas français!</strong></p>
<p>Est-ce possible de faire mieux?  En éternel optimiste et têtu que je suis, je répondrai &#8220;oui&#8221; !  Mais comment?</p>
<p>Seulement, avons-nous tout prévu?  Que faire avec une grille contenant des lignes vides <strong>et</strong> des colonnes vides comme la grille suivante :</p>
<p><a href="http://endormitoire.files.wordpress.com/2012/01/sudoku_grille_03.jpg"><img class="aligncenter size-full wp-image-304" title="sudoku grille 03" src="http://endormitoire.files.wordpress.com/2012/01/sudoku_grille_03.jpg?w=450" alt=""   /></a></p>
<p>Suite au prochain article!</p>
<br />Classé dans:<a href='http://endormitoire.wordpress.com/category/algorithmes/'>algorithmes</a>, <a href='http://endormitoire.wordpress.com/category/bases-de-donnees/'>bases de données</a>, <a href='http://endormitoire.wordpress.com/category/bases-de-donnees/mysql/myisam/'>MyISAM</a>, <a href='http://endormitoire.wordpress.com/category/bases-de-donnees/mysql/'>MySQL</a>, <a href='http://endormitoire.wordpress.com/category/optimisation/'>optimisation</a>, <a href='http://endormitoire.wordpress.com/category/smalltalk/pharo/'>Pharo</a>, <a href='http://endormitoire.wordpress.com/category/jeux/sudoku/'>sudoku</a> Tagged: <a href='http://endormitoire.wordpress.com/tag/algorithmes/'>algorithmes</a>, <a href='http://endormitoire.wordpress.com/tag/bases-de-donnees/'>bases de données</a>, <a href='http://endormitoire.wordpress.com/tag/myisam/'>MyISAM</a>, <a href='http://endormitoire.wordpress.com/tag/mysql/'>MySQL</a>, <a href='http://endormitoire.wordpress.com/tag/optimisation/'>optimisation</a>, <a href='http://endormitoire.wordpress.com/tag/optimizer_search_depth/'>optimizer_search_depth</a>, <a href='http://endormitoire.wordpress.com/tag/pharo/'>Pharo</a>, <a href='http://endormitoire.wordpress.com/tag/sudoku-2/'>Sudoku</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/endormitoire.wordpress.com/259/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/endormitoire.wordpress.com/259/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/endormitoire.wordpress.com/259/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/endormitoire.wordpress.com/259/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/endormitoire.wordpress.com/259/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/endormitoire.wordpress.com/259/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/endormitoire.wordpress.com/259/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/endormitoire.wordpress.com/259/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/endormitoire.wordpress.com/259/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/endormitoire.wordpress.com/259/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/endormitoire.wordpress.com/259/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/endormitoire.wordpress.com/259/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/endormitoire.wordpress.com/259/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/endormitoire.wordpress.com/259/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=endormitoire.wordpress.com&amp;blog=14420825&amp;post=259&amp;subd=endormitoire&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://endormitoire.wordpress.com/2012/01/08/comment-presser-un-citron-deuxieme-partie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/167178fdce6304d803372432a3052672?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">endormitoire</media:title>
		</media:content>

		<media:content url="http://endormitoire.files.wordpress.com/2012/01/sudoku_grille_021.jpg" medium="image">
			<media:title type="html">Sudoku grille #02</media:title>
		</media:content>

		<media:content url="http://endormitoire.files.wordpress.com/2012/01/sudoku_grille_02b.jpg" medium="image">
			<media:title type="html">Sudoku grille 02b (rotation de la grille grille 02)</media:title>
		</media:content>

		<media:content url="http://endormitoire.files.wordpress.com/2012/01/optimizer_search_depth.jpg" medium="image">
			<media:title type="html">optimizer_search_depth</media:title>
		</media:content>

		<media:content url="http://endormitoire.files.wordpress.com/2012/01/combined_search_depth.jpg" medium="image">
			<media:title type="html">sudoku_combined_view et optimizer_search_depth</media:title>
		</media:content>

		<media:content url="http://endormitoire.files.wordpress.com/2012/01/sudoku_grille_03.jpg" medium="image">
			<media:title type="html">sudoku grille 03</media:title>
		</media:content>
	</item>
		<item>
		<title>Comment presser un citron (première partie)</title>
		<link>http://endormitoire.wordpress.com/2012/01/07/comment-presser-un-citron-premiere-partie/</link>
		<comments>http://endormitoire.wordpress.com/2012/01/07/comment-presser-un-citron-premiere-partie/#comments</comments>
		<pubDate>Sun, 08 Jan 2012 03:01:16 +0000</pubDate>
		<dc:creator>endormitoire</dc:creator>
				<category><![CDATA[algorithmes]]></category>
		<category><![CDATA[MyISAM]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[optimisation]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[Pharo]]></category>
		<category><![CDATA[sudoku]]></category>
		<category><![CDATA[Sudoku]]></category>

		<guid isPermaLink="false">http://endormitoire.wordpress.com/?p=120</guid>
		<description><![CDATA[Ainsi donc, cette première partie détaillera la méthode de base utilisée pour résoudre un sudoku en une seule requête SQL.  Et en passant, pour ceux que la petite histoire intéresse, vous trouverez ici un excellent article sur l&#8217;évolution du sudoku. Pour nous faciliter la tâche, nous utiliserons des tables de type MyISAM pour commencer.  Dans [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=endormitoire.wordpress.com&amp;blog=14420825&amp;post=120&amp;subd=endormitoire&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Ainsi donc, cette première partie détaillera la méthode de base utilisée pour résoudre un sudoku en une seule requête SQL.  Et en passant, pour ceux que la petite histoire intéresse, vous trouverez <a title="Historique du sudoku" href="http://franceles.wordpress.com/des-jeux/" target="_blank">ici</a> un excellent article sur l&#8217;évolution du sudoku.</p>
<p>Pour nous faciliter la tâche, nous utiliserons des tables de type <a title="MyISAM" href="http://dev.mysql.com/doc/refman/5.0/fr/myisam-storage-engine.html" target="_blank">MyISAM</a> pour commencer.  Dans le prochain article, nous ferons aussi en sorte que notre méthode ne retourne qu&#8217;une seule grille valide même dans le cas où plusieurs solutions existeraient.  Rappelons que notre objectif ultime est d&#8217;optimiser une base de données dans le but bien précis de solutionner une grille valide dans des délais raisonnables.  Mais pour cet article, nous nous contenterons de verser dans la facilité!</p>
<p>Si l&#8217;envie vous prenait de vous salir les mains, vous aurez besoin d&#8217;un langage de programmation (idéalement Smalltalk comme j&#8217;utilise <a title="Pharo" href="http://www.pharo-project.org/home" target="_blank">Pharo</a> mais <a title="Squeak" href="http://squeak.org/" target="_blank">Squeak</a> ou <a title="Dialectes Smalltalk" href="http://smalltalk.org/versions" target="_blank">n&#8217;importe quel autre environnement Smalltalk</a> fera l&#8217;affaire!) pour générer vous-même certaines données.  Si ce qui vous intéresse c&#8217;est seulement le résultat, n&#8217;importe quel client MySQL pourrait faire l&#8217;affaire comme je vous fournirai tous les scripts SQL nécessaires.</p>
<p>Ainsi, pour la suite de cet article, vous aurez besoin d&#8217;un client MySQL.</p>
<p><a href="http://endormitoire.files.wordpress.com/2012/01/client_mysql.jpg"><img class="aligncenter size-medium wp-image-226" title="Client MySQL" src="http://endormitoire.files.wordpress.com/2012/01/client_mysql.jpg?w=300&#038;h=186" alt="" width="300" height="186" /></a></p>
<p>Bien que ce qui suit puisse se faire à l&#8217;aide de vos outils favoris, je vous suggère l&#8217;invite de commande et le client MySQL par souci de simplicité et de rapidité!</p>
<p><strong>1. Création de la base de données</strong></p>
<p>Il nous faut tout d&#8217;abord créer la base de données en exécutant:</p>
<p><pre class="brush: plain;">
CREATE DATABASE sudoku;
</pre></p>
<p><strong>2. Création de la table de positions</strong></p>
<p>La solution (et la représentation des données que j&#8217;ai envisagée) pour résoudre ce problème est triviale : il s&#8217;agit de créer toutes les <a title="Permutation" href="http://fr.wikipedia.org/wiki/Permutation" target="_blank">permutations </a>possibles pour une ligne et de toutes les insérer dans une table que nous joindrons ensuite 9 fois sur elle-même de façon à créer le puzzle complet.  Évidemment,  nous devrons aussi ajouter toutes les règles nécessaires (dans une vue) pour que la grille soit valide ainsi que les valeurs de départ connues du sudoku.</p>
<p>Ainsi donc, comme la grille standard a 9 colonnes, il a fallu créer 9! (9 <a title="Factorielle" href="http://fr.wikipedia.org/wiki/Factorielle" target="_blank">factorielle</a> = 362880 = 9*8*7*6*5*4*3*2*1) lignes que nous avons insérées dans cette table.  Chaque enregistrement de la table <strong>positions</strong> représente une ligne de sudoku, constituée de ses 9 colonnes (de là les identifiants c1, c2, c3, c4, etc).</p>
<p><a href="http://endormitoire.files.wordpress.com/2012/01/rows_explained.jpg"><img class="aligncenter size-full wp-image-222" title="Méthode de regroupement des lignes" src="http://endormitoire.files.wordpress.com/2012/01/rows_explained.jpg?w=450&#038;h=560" alt="" width="450" height="560" /></a></p>
<p><pre class="brush: sql; wrap-lines: false;">
USE sudoku;

CREATE TABLE positions (
c1 TINYINT UNSIGNED NOT NULL,
c2 TINYINT UNSIGNED NOT NULL,
c3 TINYINT UNSIGNED NOT NULL,
c4 TINYINT UNSIGNED NOT NULL,
c5 TINYINT UNSIGNED NOT NULL,
c6 TINYINT UNSIGNED NOT NULL,
c7 TINYINT UNSIGNED NOT NULL,
c8 TINYINT UNSIGNED NOT NULL,
c9 TINYINT UNSIGNED NOT NULL
) ENGINE=MYISAM;
</pre></p>
<p>Vous remarquerez l&#8217;absence d&#8217;index. Pour accélérer les choses, nous définirons les index seulement une fois la table remplie!  Les <a title="Comment MySQL utilise les index" href="http://dev.mysql.com/doc/refman/5.0/fr/mysql-indexes.html" target="_blank">index</a> seront essentiels dans notre cas, en particulier pour ce qui nous attend dans le prochain article!</p>
<p><strong>3. Générer les données</strong></p>
<p>J&#8217;ai créé les requêtes pour les <a title="Syntaxe de INSERT" href="http://dev.mysql.com/doc/refman/5.0/fr/insert.html" target="_blank">INSERT</a> dans la table <strong>positions</strong> à l&#8217;aide d&#8217;un petit script exécuté dans un <em>workspace</em> <a title="Pharo" href="http://www.pharo-project.org/home" target="_blank">Pharo</a> Smalltalk.</p>
<p><a href="http://endormitoire.files.wordpress.com/2012/01/workspace.jpg"><img class="aligncenter size-full wp-image-235" title="Workspace" src="http://endormitoire.files.wordpress.com/2012/01/workspace.jpg?w=450&#038;h=280" alt="" width="450" height="280" /></a></p>
<p>Voici le script utilisé :</p>
<p><pre class="brush: plain; wrap-lines: false;">

| file |
file := StandardFileStream forceNewFileNamed: 'positions.sql'.
(1 to: 9) permutationsDo: [:e | file
nextPutAll: 'INSERT INTO positions(c1,c2,c3,c4,c5,c6,c7,c8,c9) VALUES(';
nextPutAll: (e at: 1) printString;nextPut: $, ;
nextPutAll: (e at: 2) printString;nextPut: $, ;
nextPutAll: (e at: 3) printString;nextPut: $, ;
nextPutAll: (e at: 4) printString;nextPut: $, ;
nextPutAll: (e at: 5) printString;nextPut: $, ;
nextPutAll: (e at: 6) printString;nextPut: $, ;
nextPutAll: (e at: 7) printString;nextPut: $, ;
nextPutAll: (e at: 8) printString;nextPut: $, ;
nextPutAll: (e at: 9) printString;nextPutAll: ');';cr].
file close.
</pre></p>
<p>Pour les plus aventuriers d&#8217;entre vous, je suggère d&#8217;étudier le contenu du fichier <strong>positions.sql</strong> afin de pouvoir générer l&#8217;équivalent à l&#8217;aide de votre langage de programmation favori! Pour les autres, j&#8217;ai déjà fait le travail et vous trouverez le fichier <a title="03-positions.sql.gz" href="http://www.fileden.com/files/2011/12/20/3240993/03-positions.sql.gz" target="_blank">ici</a>.</p>
<p>L&#8217;exécution de ce script dans un <em>workspace</em> créera un fichier nommé <strong>positions.sql</strong>  contenant toutes les requêtes de INSERT servant à remplir la table <strong>positions</strong>.</p>
<p><strong>ATTENTION: la prochaine étape prend quelques minutes!</strong></p>
<p>Pour insérer les données dans la table <strong>positions</strong>, ouvrez un invite de commande et exécutez ceci :</p>
<p><a href="http://endormitoire.files.wordpress.com/2012/01/invite_de_commande_insertion.jpg"><img class="aligncenter size-full wp-image-229" title="Invite de commande" src="http://endormitoire.files.wordpress.com/2012/01/invite_de_commande_insertion.jpg?w=450&#038;h=227" alt="" width="450" height="227" /></a></p>
<p><strong>4. Générer les contraintes</strong></p>
<p>Les contraintes de la requête servant à solutionner la grille sudoku ont aussi été générées à l&#8217;aide d&#8217;un script exécuté dans un <em>workspace</em> avec Pharo. Ce script élimine toute les clauses superflues ou dupliquées de façon à garder leur nombre au strict minimum en prenant bien soin de s&#8217;assurer d&#8217;avoir une grille de sudoku valide. Plus précisément, ce script veille à :</p>
<p>1) éliminer les clauses dupliquées (par exemple, nul besoin de spécifier que (r1.c3 &lt;&gt; r2.c3) et que (r2.c3 &lt;&gt; r1.c3), c&#8217;est la même chose!;</p>
<p>2) éliminer tous les clauses reliées aux lignes comme nous savons que toutes les lignes de la table position sont valides comme nous les avons toutes générées.</p>
<p><a href="http://endormitoire.files.wordpress.com/2012/01/workspace_contraintes.jpg"><img class="aligncenter size-full wp-image-238" title="Workspace (contraintes)" src="http://endormitoire.files.wordpress.com/2012/01/workspace_contraintes.jpg?w=450&#038;h=343" alt="" width="450" height="343" /></a></p>
<p><pre class="brush: plain; wrap-lines: false;">
| s1 s2 s3 |
s1 := Set new.
1 to: 9 do: [:r |
1 to: 9 do: [:c |    | cell |
cell := 'r', r printString, '.c', c printString.
1 to: 9 do: [:r2 |         | compCell |
compCell := 'r', r2 printString, '.c', c printString.
compCell ~= cell
ifTrue: [    cell &lt; compCell
ifTrue: [s1 add: (cell, ' &lt;&gt; ', compCell)]
ifFalse: [s1 add: (compCell, ' &lt;&gt; ', cell)].
]
]
]
].
Transcript cr;show: '-- Unique in column';cr.
s1 asSortedCollection do: [:e | Transcript show: '(', e, ') AND ';cr].

s2 := Set new.
1 to: 9 do: [:r |
1 to: 9 do: [:c |    | cell deltaR deltaC |
deltaR := ((r-1) // 3) * 3.
deltaC := ((c-1) // 3) * 3.
1 to: 3 do: [:r2 |
1 to: 3 do: [:c2 |    | compCell |
cell := 'r', r printString, '.c', c printString.
compCell := 'r', (r2 + deltaR) printString, '.c', (c2 + deltaC) printString.
(compCell ~= cell and: [(r2 + deltaR) ~= r])
ifTrue:[    cell &lt; compCell
ifTrue: [s2 add: (cell, ' &lt;&gt; ', compCell)]
ifFalse: [s2 add: (compCell, ' &lt;&gt; ', cell)].
]
]
]
]
].
Transcript cr;show: '-- Unique within 3x3 square';cr.
s3 := Set new.
s2 do: [:each | (s1 includes: each) ifFalse: [s3 add: each]].
s3 asSortedCollection do: [:e | Transcript show: '(', e, ') AND ';cr].
</pre></p>
<p>Nous utiliserons le résultat affiché dans le <em>Transcript</em> pour créer notre vue!</p>
<p><strong>Note: il vous faudra préalablement changer une méthode dans Pharo pour être en mesure d&#8217;afficher la totalité des contraintes.</strong><br />
<strong> <a href="http://endormitoire.files.wordpress.com/2012/01/transcript_characterlimit.jpg"><img class="aligncenter size-full wp-image-233" title="Transcript&gt;&gt;characterLimit" src="http://endormitoire.files.wordpress.com/2012/01/transcript_characterlimit.jpg?w=450&#038;h=321" alt="" width="450" height="321" /></a></strong></p>
<p><strong>5. Créer les index</strong></p>
<p>Pour accélérer la recherche, il nous faut des index! Il est temps de les générer!</p>
<p><strong>ATTENTION: la prochaine étape prend plusieurs minutes!</strong></p>
<p><pre class="brush: sql; wrap-lines: false;">
USE sudoku;

CREATE INDEX i12 ON positions(c1, c2); CREATE INDEX i13 ON positions(c1, c3);
CREATE INDEX i14 ON positions(c1, c4); CREATE INDEX i15 ON positions(c1, c5);
CREATE INDEX i16 ON positions(c1, c6); CREATE INDEX i17 ON positions(c1, c7);
CREATE INDEX i18 ON positions(c1, c8); CREATE INDEX i19 ON positions(c1, c9);
CREATE INDEX i23 ON positions(c2, c3); CREATE INDEX i24 ON positions(c2, c4);
CREATE INDEX i25 ON positions(c2, c5); CREATE INDEX i26 ON positions(c2, c6);
CREATE INDEX i27 ON positions(c2, c7); CREATE INDEX i28 ON positions(c2, c8);
CREATE INDEX i29 ON positions(c2, c9); CREATE INDEX i34 ON positions(c3, c4);
CREATE INDEX i35 ON positions(c3, c5); CREATE INDEX i36 ON positions(c3, c6);
CREATE INDEX i37 ON positions(c3, c7); CREATE INDEX i38 ON positions(c3, c8);
CREATE INDEX i39 ON positions(c3, c9); CREATE INDEX i45 ON positions(c4, c5);
CREATE INDEX i46 ON positions(c4, c6); CREATE INDEX i47 ON positions(c4, c7);
CREATE INDEX i48 ON positions(c4, c8); CREATE INDEX i49 ON positions(c4, c9);
CREATE INDEX i56 ON positions(c5, c6); CREATE INDEX i57 ON positions(c5, c7);
CREATE INDEX i58 ON positions(c5, c8); CREATE INDEX i59 ON positions(c5, c9);
CREATE INDEX i67 ON positions(c6, c7); CREATE INDEX i68 ON positions(c6, c8);
CREATE INDEX i69 ON positions(c6, c9); CREATE INDEX i78 ON positions(c7, c8);
CREATE INDEX i79 ON positions(c7, c9); CREATE INDEX i89 ON positions(c8, c9);
CREATE INDEX i9 ON positions(c9);
</pre></p>
<p><strong>6. Créer une vue pour chercher les sudokus</strong></p>
<p>C&#8217;est ici que les contraintes générées précédemment à l&#8217;aide de Pharo deviennent utiles!  Observez le nombre effarant de conditions dans la clause WHERE de la requête définissant la vue!</p>
<p><pre class="brush: plain; wrap-lines: false;">
USE sudoku;

CREATE VIEW sudoku_rows_view AS
SELECT
r1.c1 as r1c1, r1.c2 as r1c2, r1.c3 as r1c3, r1.c4 as r1c4, r1.c5 as r1c5, r1.c6 as r1c6, r1.c7 as r1c7, r1.c8 as r1c8, r1.c9 as r1c9, r2.c1 as r2c1,
r2.c2 as r2c2, r2.c3 as r2c3, r2.c4 as r2c4, r2.c5 as r2c5, r2.c6 as r2c6, r2.c7 as r2c7, r2.c8 as r2c8, r2.c9 as r2c9, r3.c1 as r3c1, r3.c2 as r3c2,
r3.c3 as r3c3, r3.c4 as r3c4, r3.c5 as r3c5, r3.c6 as r3c6, r3.c7 as r3c7, r3.c8 as r3c8, r3.c9 as r3c9, r4.c1 as r4c1, r4.c2 as r4c2, r4.c3 as r4c3,
r4.c4 as r4c4, r4.c5 as r4c5, r4.c6 as r4c6, r4.c7 as r4c7, r4.c8 as r4c8, r4.c9 as r4c9, r5.c1 as r5c1, r5.c2 as r5c2, r5.c3 as r5c3, r5.c4 as r5c4,
r5.c5 as r5c5, r5.c6 as r5c6, r5.c7 as r5c7, r5.c8 as r5c8, r5.c9 as r5c9, r6.c1 as r6c1, r6.c2 as r6c2, r6.c3 as r6c3, r6.c4 as r6c4, r6.c5 as r6c5,
r6.c6 as r6c6, r6.c7 as r6c7, r6.c8 as r6c8, r6.c9 as r6c9, r7.c1 as r7c1, r7.c2 as r7c2, r7.c3 as r7c3, r7.c4 as r7c4, r7.c5 as r7c5, r7.c6 as r7c6,
r7.c7 as r7c7, r7.c8 as r7c8, r7.c9 as r7c9, r8.c1 as r8c1, r8.c2 as r8c2, r8.c3 as r8c3, r8.c4 as r8c4, r8.c5 as r8c5, r8.c6 as r8c6, r8.c7 as r8c7,
r8.c8 as r8c8, r8.c9 as r8c9, r9.c1 as r9c1, r9.c2 as r9c2, r9.c3 as r9c3, r9.c4 as r9c4, r9.c5 as r9c5, r9.c6 as r9c6, r9.c7 as r9c7, r9.c8 as r9c8,
r9.c9 as r9c9

FROM
positions r1, positions r2, positions r3,
positions r4, positions r5, positions r6,
positions r7, positions r8, positions r9

WHERE
-- Nombres uniques dans chaque colonne
(r1.c1 &lt;&gt; r2.c1) AND (r1.c1 &lt;&gt; r3.c1) AND (r1.c1 &lt;&gt; r4.c1) AND (r1.c1 &lt;&gt; r5.c1) AND (r1.c1 &lt;&gt; r6.c1) AND (r1.c1 &lt;&gt; r7.c1) AND (r1.c1 &lt;&gt; r8.c1) AND (r1.c1 &lt;&gt; r9.c1) AND (r1.c2 &lt;&gt; r2.c2) AND (r1.c2 &lt;&gt; r3.c2) AND (r1.c2 &lt;&gt; r4.c2) AND (r1.c2 &lt;&gt; r5.c2) AND (r1.c2 &lt;&gt; r6.c2) AND (r1.c2 &lt;&gt; r7.c2) AND (r1.c2 &lt;&gt; r8.c2) AND (r1.c2 &lt;&gt; r9.c2) AND
(r1.c3 &lt;&gt; r2.c3) AND (r1.c3 &lt;&gt; r3.c3) AND (r1.c3 &lt;&gt; r4.c3) AND (r1.c3 &lt;&gt; r5.c3) AND (r1.c3 &lt;&gt; r6.c3) AND (r1.c3 &lt;&gt; r7.c3) AND (r1.c3 &lt;&gt; r8.c3) AND (r1.c3 &lt;&gt; r9.c3) AND (r1.c4 &lt;&gt; r2.c4) AND (r1.c4 &lt;&gt; r3.c4) AND (r1.c4 &lt;&gt; r4.c4) AND (r1.c4 &lt;&gt; r5.c4) AND (r1.c4 &lt;&gt; r6.c4) AND (r1.c4 &lt;&gt; r7.c4) AND (r1.c4 &lt;&gt; r8.c4) AND (r1.c4 &lt;&gt; r9.c4) AND
(r1.c5 &lt;&gt; r2.c5) AND (r1.c5 &lt;&gt; r3.c5) AND (r1.c5 &lt;&gt; r4.c5) AND (r1.c5 &lt;&gt; r5.c5) AND (r1.c5 &lt;&gt; r6.c5) AND (r1.c5 &lt;&gt; r7.c5) AND (r1.c5 &lt;&gt; r8.c5) AND (r1.c5 &lt;&gt; r9.c5) AND (r1.c6 &lt;&gt; r2.c6) AND (r1.c6 &lt;&gt; r3.c6) AND (r1.c6 &lt;&gt; r4.c6) AND (r1.c6 &lt;&gt; r5.c6) AND (r1.c6 &lt;&gt; r6.c6) AND (r1.c6 &lt;&gt; r7.c6) AND (r1.c6 &lt;&gt; r8.c6) AND (r1.c6 &lt;&gt; r9.c6) AND
(r1.c7 &lt;&gt; r2.c7) AND (r1.c7 &lt;&gt; r3.c7) AND (r1.c7 &lt;&gt; r4.c7) AND (r1.c7 &lt;&gt; r5.c7) AND (r1.c7 &lt;&gt; r6.c7) AND (r1.c7 &lt;&gt; r7.c7) AND (r1.c7 &lt;&gt; r8.c7) AND (r1.c7 &lt;&gt; r9.c7) AND (r1.c8 &lt;&gt; r2.c8) AND (r1.c8 &lt;&gt; r3.c8) AND (r1.c8 &lt;&gt; r4.c8) AND (r1.c8 &lt;&gt; r5.c8) AND (r1.c8 &lt;&gt; r6.c8) AND (r1.c8 &lt;&gt; r7.c8) AND (r1.c8 &lt;&gt; r8.c8) AND (r1.c8 &lt;&gt; r9.c8) AND
(r1.c9 &lt;&gt; r2.c9) AND (r1.c9 &lt;&gt; r3.c9) AND (r1.c9 &lt;&gt; r4.c9) AND (r1.c9 &lt;&gt; r5.c9) AND (r1.c9 &lt;&gt; r6.c9) AND (r1.c9 &lt;&gt; r7.c9) AND (r1.c9 &lt;&gt; r8.c9) AND (r1.c9 &lt;&gt; r9.c9) AND (r2.c1 &lt;&gt; r3.c1) AND (r2.c1 &lt;&gt; r4.c1) AND (r2.c1 &lt;&gt; r5.c1) AND (r2.c1 &lt;&gt; r6.c1) AND (r2.c1 &lt;&gt; r7.c1) AND (r2.c1 &lt;&gt; r8.c1) AND (r2.c1 &lt;&gt; r9.c1) AND (r2.c2 &lt;&gt; r3.c2) AND
(r2.c2 &lt;&gt; r4.c2) AND (r2.c2 &lt;&gt; r5.c2) AND (r2.c2 &lt;&gt; r6.c2) AND (r2.c2 &lt;&gt; r7.c2) AND (r2.c2 &lt;&gt; r8.c2) AND (r2.c2 &lt;&gt; r9.c2) AND (r2.c3 &lt;&gt; r3.c3) AND (r2.c3 &lt;&gt; r4.c3) AND (r2.c3 &lt;&gt; r5.c3) AND (r2.c3 &lt;&gt; r6.c3) AND (r2.c3 &lt;&gt; r7.c3) AND (r2.c3 &lt;&gt; r8.c3) AND (r2.c3 &lt;&gt; r9.c3) AND (r2.c4 &lt;&gt; r3.c4) AND (r2.c4 &lt;&gt; r4.c4) AND (r2.c4 &lt;&gt; r5.c4) AND
(r2.c4 &lt;&gt; r6.c4) AND (r2.c4 &lt;&gt; r7.c4) AND (r2.c4 &lt;&gt; r8.c4) AND (r2.c4 &lt;&gt; r9.c4) AND (r2.c5 &lt;&gt; r3.c5) AND (r2.c5 &lt;&gt; r4.c5) AND (r2.c5 &lt;&gt; r5.c5) AND (r2.c5 &lt;&gt; r6.c5) AND (r2.c5 &lt;&gt; r7.c5) AND (r2.c5 &lt;&gt; r8.c5) AND (r2.c5 &lt;&gt; r9.c5) AND (r2.c6 &lt;&gt; r3.c6) AND (r2.c6 &lt;&gt; r4.c6) AND (r2.c6 &lt;&gt; r5.c6) AND (r2.c6 &lt;&gt; r6.c6) AND (r2.c6 &lt;&gt; r7.c6) AND
(r2.c6 &lt;&gt; r8.c6) AND (r2.c6 &lt;&gt; r9.c6) AND (r2.c7 &lt;&gt; r3.c7) AND (r2.c7 &lt;&gt; r4.c7) AND (r2.c7 &lt;&gt; r5.c7) AND (r2.c7 &lt;&gt; r6.c7) AND (r2.c7 &lt;&gt; r7.c7) AND (r2.c7 &lt;&gt; r8.c7) AND (r2.c7 &lt;&gt; r9.c7) AND (r2.c8 &lt;&gt; r3.c8) AND (r2.c8 &lt;&gt; r4.c8) AND (r2.c8 &lt;&gt; r5.c8) AND (r2.c8 &lt;&gt; r6.c8) AND (r2.c8 &lt;&gt; r7.c8) AND (r2.c8 &lt;&gt; r8.c8) AND (r2.c8 &lt;&gt; r9.c8) AND
(r2.c9 &lt;&gt; r3.c9) AND (r2.c9 &lt;&gt; r4.c9) AND (r2.c9 &lt;&gt; r5.c9) AND (r2.c9 &lt;&gt; r6.c9) AND (r2.c9 &lt;&gt; r7.c9) AND (r2.c9 &lt;&gt; r8.c9) AND (r2.c9 &lt;&gt; r9.c9) AND (r3.c1 &lt;&gt; r4.c1) AND (r3.c1 &lt;&gt; r5.c1) AND (r3.c1 &lt;&gt; r6.c1) AND (r3.c1 &lt;&gt; r7.c1) AND (r3.c1 &lt;&gt; r8.c1) AND (r3.c1 &lt;&gt; r9.c1) AND (r3.c2 &lt;&gt; r4.c2) AND (r3.c2 &lt;&gt; r5.c2) AND (r3.c2 &lt;&gt; r6.c2) AND
(r3.c2 &lt;&gt; r7.c2) AND (r3.c2 &lt;&gt; r8.c2) AND (r3.c2 &lt;&gt; r9.c2) AND (r3.c3 &lt;&gt; r4.c3) AND (r3.c3 &lt;&gt; r5.c3) AND (r3.c3 &lt;&gt; r6.c3) AND (r3.c3 &lt;&gt; r7.c3) AND (r3.c3 &lt;&gt; r8.c3) AND (r3.c3 &lt;&gt; r9.c3) AND (r3.c4 &lt;&gt; r4.c4) AND (r3.c4 &lt;&gt; r5.c4) AND (r3.c4 &lt;&gt; r6.c4) AND (r3.c4 &lt;&gt; r7.c4) AND (r3.c4 &lt;&gt; r8.c4) AND (r3.c4 &lt;&gt; r9.c4) AND (r3.c5 &lt;&gt; r4.c5) AND
(r3.c5 &lt;&gt; r5.c5) AND (r3.c5 &lt;&gt; r6.c5) AND (r3.c5 &lt;&gt; r7.c5) AND (r3.c5 &lt;&gt; r8.c5) AND (r3.c5 &lt;&gt; r9.c5) AND (r3.c6 &lt;&gt; r4.c6) AND (r3.c6 &lt;&gt; r5.c6) AND (r3.c6 &lt;&gt; r6.c6) AND (r3.c6 &lt;&gt; r7.c6) AND (r3.c6 &lt;&gt; r8.c6) AND (r3.c6 &lt;&gt; r9.c6) AND (r3.c7 &lt;&gt; r4.c7) AND (r3.c7 &lt;&gt; r5.c7) AND (r3.c7 &lt;&gt; r6.c7) AND (r3.c7 &lt;&gt; r7.c7) AND (r3.c7 &lt;&gt; r8.c7) AND
(r3.c7 &lt;&gt; r9.c7) AND (r3.c8 &lt;&gt; r4.c8) AND (r3.c8 &lt;&gt; r5.c8) AND (r3.c8 &lt;&gt; r6.c8) AND (r3.c8 &lt;&gt; r7.c8) AND (r3.c8 &lt;&gt; r8.c8) AND (r3.c8 &lt;&gt; r9.c8) AND (r3.c9 &lt;&gt; r4.c9) AND (r3.c9 &lt;&gt; r5.c9) AND (r3.c9 &lt;&gt; r6.c9) AND (r3.c9 &lt;&gt; r7.c9) AND (r3.c9 &lt;&gt; r8.c9) AND (r3.c9 &lt;&gt; r9.c9) AND (r4.c1 &lt;&gt; r5.c1) AND (r4.c1 &lt;&gt; r6.c1) AND (r4.c1 &lt;&gt; r7.c1) AND
(r4.c1 &lt;&gt; r8.c1) AND (r4.c1 &lt;&gt; r9.c1) AND (r4.c2 &lt;&gt; r5.c2) AND (r4.c2 &lt;&gt; r6.c2) AND (r4.c2 &lt;&gt; r7.c2) AND (r4.c2 &lt;&gt; r8.c2) AND (r4.c2 &lt;&gt; r9.c2) AND (r4.c3 &lt;&gt; r5.c3) AND (r4.c3 &lt;&gt; r6.c3) AND (r4.c3 &lt;&gt; r7.c3) AND (r4.c3 &lt;&gt; r8.c3) AND (r4.c3 &lt;&gt; r9.c3) AND (r4.c4 &lt;&gt; r5.c4) AND (r4.c4 &lt;&gt; r6.c4) AND (r4.c4 &lt;&gt; r7.c4) AND (r4.c4 &lt;&gt; r8.c4) AND
(r4.c4 &lt;&gt; r9.c4) AND (r4.c5 &lt;&gt; r5.c5) AND (r4.c5 &lt;&gt; r6.c5) AND (r4.c5 &lt;&gt; r7.c5) AND (r4.c5 &lt;&gt; r8.c5) AND (r4.c5 &lt;&gt; r9.c5) AND (r4.c6 &lt;&gt; r5.c6) AND (r4.c6 &lt;&gt; r6.c6) AND (r4.c6 &lt;&gt; r7.c6) AND (r4.c6 &lt;&gt; r8.c6) AND (r4.c6 &lt;&gt; r9.c6) AND (r4.c7 &lt;&gt; r5.c7) AND (r4.c7 &lt;&gt; r6.c7) AND (r4.c7 &lt;&gt; r7.c7) AND (r4.c7 &lt;&gt; r8.c7) AND (r4.c7 &lt;&gt; r9.c7) AND
(r4.c8 &lt;&gt; r5.c8) AND (r4.c8 &lt;&gt; r6.c8) AND (r4.c8 &lt;&gt; r7.c8) AND (r4.c8 &lt;&gt; r8.c8) AND (r4.c8 &lt;&gt; r9.c8) AND (r4.c9 &lt;&gt; r5.c9) AND (r4.c9 &lt;&gt; r6.c9) AND (r4.c9 &lt;&gt; r7.c9) AND (r4.c9 &lt;&gt; r8.c9) AND (r4.c9 &lt;&gt; r9.c9) AND (r5.c1 &lt;&gt; r6.c1) AND (r5.c1 &lt;&gt; r7.c1) AND (r5.c1 &lt;&gt; r8.c1) AND (r5.c1 &lt;&gt; r9.c1) AND (r5.c2 &lt;&gt; r6.c2) AND (r5.c2 &lt;&gt; r7.c2) AND
(r5.c2 &lt;&gt; r8.c2) AND (r5.c2 &lt;&gt; r9.c2) AND (r5.c3 &lt;&gt; r6.c3) AND (r5.c3 &lt;&gt; r7.c3) AND (r5.c3 &lt;&gt; r8.c3) AND (r5.c3 &lt;&gt; r9.c3) AND (r5.c4 &lt;&gt; r6.c4) AND (r5.c4 &lt;&gt; r7.c4) AND (r5.c4 &lt;&gt; r8.c4) AND (r5.c4 &lt;&gt; r9.c4) AND (r5.c5 &lt;&gt; r6.c5) AND (r5.c5 &lt;&gt; r7.c5) AND (r5.c5 &lt;&gt; r8.c5) AND (r5.c5 &lt;&gt; r9.c5) AND (r5.c6 &lt;&gt; r6.c6) AND (r5.c6 &lt;&gt; r7.c6) AND
(r5.c6 &lt;&gt; r8.c6) AND (r5.c6 &lt;&gt; r9.c6) AND (r5.c7 &lt;&gt; r6.c7) AND (r5.c7 &lt;&gt; r7.c7) AND (r5.c7 &lt;&gt; r8.c7) AND (r5.c7 &lt;&gt; r9.c7) AND (r5.c8 &lt;&gt; r6.c8) AND (r5.c8 &lt;&gt; r7.c8) AND (r5.c8 &lt;&gt; r8.c8) AND (r5.c8 &lt;&gt; r9.c8) AND (r5.c9 &lt;&gt; r6.c9) AND (r5.c9 &lt;&gt; r7.c9) AND (r5.c9 &lt;&gt; r8.c9) AND (r5.c9 &lt;&gt; r9.c9) AND (r6.c1 &lt;&gt; r7.c1) AND (r6.c1 &lt;&gt; r8.c1) AND
(r6.c1 &lt;&gt; r9.c1) AND (r6.c2 &lt;&gt; r7.c2) AND (r6.c2 &lt;&gt; r8.c2) AND (r6.c2 &lt;&gt; r9.c2) AND (r6.c3 &lt;&gt; r7.c3) AND (r6.c3 &lt;&gt; r8.c3) AND (r6.c3 &lt;&gt; r9.c3) AND (r6.c4 &lt;&gt; r7.c4) AND (r6.c4 &lt;&gt; r8.c4) AND (r6.c4 &lt;&gt; r9.c4) AND (r6.c5 &lt;&gt; r7.c5) AND (r6.c5 &lt;&gt; r8.c5) AND (r6.c5 &lt;&gt; r9.c5) AND (r6.c6 &lt;&gt; r7.c6) AND (r6.c6 &lt;&gt; r8.c6) AND (r6.c6 &lt;&gt; r9.c6) AND
(r6.c7 &lt;&gt; r7.c7) AND (r6.c7 &lt;&gt; r8.c7) AND (r6.c7 &lt;&gt; r9.c7) AND (r6.c8 &lt;&gt; r7.c8) AND (r6.c8 &lt;&gt; r8.c8) AND (r6.c8 &lt;&gt; r9.c8) AND (r6.c9 &lt;&gt; r7.c9) AND (r6.c9 &lt;&gt; r8.c9) AND (r6.c9 &lt;&gt; r9.c9) AND (r7.c1 &lt;&gt; r8.c1) AND (r7.c1 &lt;&gt; r9.c1) AND (r7.c2 &lt;&gt; r8.c2) AND (r7.c2 &lt;&gt; r9.c2) AND (r7.c3 &lt;&gt; r8.c3) AND (r7.c3 &lt;&gt; r9.c3) AND (r7.c4 &lt;&gt; r8.c4) AND
(r7.c4 &lt;&gt; r9.c4) AND (r7.c5 &lt;&gt; r8.c5) AND (r7.c5 &lt;&gt; r9.c5) AND (r7.c6 &lt;&gt; r8.c6) AND (r7.c6 &lt;&gt; r9.c6) AND (r7.c7 &lt;&gt; r8.c7) AND (r7.c7 &lt;&gt; r9.c7) AND (r7.c8 &lt;&gt; r8.c8) AND (r7.c8 &lt;&gt; r9.c8) AND (r7.c9 &lt;&gt; r8.c9) AND (r7.c9 &lt;&gt; r9.c9) AND (r8.c1 &lt;&gt; r9.c1) AND (r8.c2 &lt;&gt; r9.c2) AND (r8.c3 &lt;&gt; r9.c3) AND (r8.c4 &lt;&gt; r9.c4) AND (r8.c5 &lt;&gt; r9.c5) AND
(r8.c6 &lt;&gt; r9.c6) AND (r8.c7 &lt;&gt; r9.c7) AND (r8.c8 &lt;&gt; r9.c8) AND (r8.c9 &lt;&gt; r9.c9) AND
-- Nombres uniques dans chaque maison de 3x3
(r1.c1 &lt;&gt; r2.c2) AND (r1.c1 &lt;&gt; r2.c3) AND (r1.c1 &lt;&gt; r3.c2) AND (r1.c1 &lt;&gt; r3.c3) AND (r1.c2 &lt;&gt; r2.c1) AND (r1.c2 &lt;&gt; r2.c3) AND (r1.c2 &lt;&gt; r3.c1) AND (r1.c2 &lt;&gt; r3.c3) AND (r1.c3 &lt;&gt; r2.c1) AND (r1.c3 &lt;&gt; r2.c2) AND (r1.c3 &lt;&gt; r3.c1) AND (r1.c3 &lt;&gt; r3.c2) AND (r1.c4 &lt;&gt; r2.c5) AND (r1.c4 &lt;&gt; r2.c6) AND (r1.c4 &lt;&gt; r3.c5) AND (r1.c4 &lt;&gt; r3.c6) AND
(r1.c5 &lt;&gt; r2.c4) AND (r1.c5 &lt;&gt; r2.c6) AND (r1.c5 &lt;&gt; r3.c4) AND (r1.c5 &lt;&gt; r3.c6) AND (r1.c6 &lt;&gt; r2.c4) AND (r1.c6 &lt;&gt; r2.c5) AND (r1.c6 &lt;&gt; r3.c4) AND (r1.c6 &lt;&gt; r3.c5) AND (r1.c7 &lt;&gt; r2.c8) AND (r1.c7 &lt;&gt; r2.c9) AND (r1.c7 &lt;&gt; r3.c8) AND (r1.c7 &lt;&gt; r3.c9) AND (r1.c8 &lt;&gt; r2.c7) AND (r1.c8 &lt;&gt; r2.c9) AND (r1.c8 &lt;&gt; r3.c7) AND (r1.c8 &lt;&gt; r3.c9) AND
(r1.c9 &lt;&gt; r2.c7) AND (r1.c9 &lt;&gt; r2.c8) AND (r1.c9 &lt;&gt; r3.c7) AND (r1.c9 &lt;&gt; r3.c8) AND (r2.c1 &lt;&gt; r3.c2) AND (r2.c1 &lt;&gt; r3.c3) AND (r2.c2 &lt;&gt; r3.c1) AND (r2.c2 &lt;&gt; r3.c3) AND (r2.c3 &lt;&gt; r3.c1) AND (r2.c3 &lt;&gt; r3.c2) AND (r2.c4 &lt;&gt; r3.c5) AND (r2.c4 &lt;&gt; r3.c6) AND (r2.c5 &lt;&gt; r3.c4) AND (r2.c5 &lt;&gt; r3.c6) AND (r2.c6 &lt;&gt; r3.c4) AND (r2.c6 &lt;&gt; r3.c5) AND
(r2.c7 &lt;&gt; r3.c8) AND (r2.c7 &lt;&gt; r3.c9) AND (r2.c8 &lt;&gt; r3.c7) AND (r2.c8 &lt;&gt; r3.c9) AND (r2.c9 &lt;&gt; r3.c7) AND (r2.c9 &lt;&gt; r3.c8) AND (r4.c1 &lt;&gt; r5.c2) AND (r4.c1 &lt;&gt; r5.c3) AND (r4.c1 &lt;&gt; r6.c2) AND (r4.c1 &lt;&gt; r6.c3) AND (r4.c2 &lt;&gt; r5.c1) AND (r4.c2 &lt;&gt; r5.c3) AND (r4.c2 &lt;&gt; r6.c1) AND (r4.c2 &lt;&gt; r6.c3) AND (r4.c3 &lt;&gt; r5.c1) AND (r4.c3 &lt;&gt; r5.c2) AND
(r4.c3 &lt;&gt; r6.c1) AND (r4.c3 &lt;&gt; r6.c2) AND (r4.c4 &lt;&gt; r5.c5) AND (r4.c4 &lt;&gt; r5.c6) AND (r4.c4 &lt;&gt; r6.c5) AND (r4.c4 &lt;&gt; r6.c6) AND (r4.c5 &lt;&gt; r5.c4) AND (r4.c5 &lt;&gt; r5.c6) AND (r4.c5 &lt;&gt; r6.c4) AND (r4.c5 &lt;&gt; r6.c6) AND (r4.c6 &lt;&gt; r5.c4) AND (r4.c6 &lt;&gt; r5.c5) AND (r4.c6 &lt;&gt; r6.c4) AND (r4.c6 &lt;&gt; r6.c5) AND (r4.c7 &lt;&gt; r5.c8) AND (r4.c7 &lt;&gt; r5.c9) AND
(r4.c7 &lt;&gt; r6.c8) AND (r4.c7 &lt;&gt; r6.c9) AND (r4.c8 &lt;&gt; r5.c7) AND (r4.c8 &lt;&gt; r5.c9) AND (r4.c8 &lt;&gt; r6.c7) AND (r4.c8 &lt;&gt; r6.c9) AND (r4.c9 &lt;&gt; r5.c7) AND (r4.c9 &lt;&gt; r5.c8) AND (r4.c9 &lt;&gt; r6.c7) AND (r4.c9 &lt;&gt; r6.c8) AND (r5.c1 &lt;&gt; r6.c2) AND (r5.c1 &lt;&gt; r6.c3) AND (r5.c2 &lt;&gt; r6.c1) AND (r5.c2 &lt;&gt; r6.c3) AND (r5.c3 &lt;&gt; r6.c1) AND (r5.c3 &lt;&gt; r6.c2) AND
(r5.c4 &lt;&gt; r6.c5) AND (r5.c4 &lt;&gt; r6.c6) AND (r5.c5 &lt;&gt; r6.c4) AND (r5.c5 &lt;&gt; r6.c6) AND (r5.c6 &lt;&gt; r6.c4) AND (r5.c6 &lt;&gt; r6.c5) AND (r5.c7 &lt;&gt; r6.c8) AND (r5.c7 &lt;&gt; r6.c9) AND (r5.c8 &lt;&gt; r6.c7) AND (r5.c8 &lt;&gt; r6.c9) AND (r5.c9 &lt;&gt; r6.c7) AND (r5.c9 &lt;&gt; r6.c8) AND (r7.c1 &lt;&gt; r8.c2) AND (r7.c1 &lt;&gt; r8.c3) AND (r7.c1 &lt;&gt; r9.c2) AND (r7.c1 &lt;&gt; r9.c3) AND
(r7.c2 &lt;&gt; r8.c1) AND (r7.c2 &lt;&gt; r8.c3) AND (r7.c2 &lt;&gt; r9.c1) AND (r7.c2 &lt;&gt; r9.c3) AND (r7.c3 &lt;&gt; r8.c1) AND (r7.c3 &lt;&gt; r8.c2) AND (r7.c3 &lt;&gt; r9.c1) AND (r7.c3 &lt;&gt; r9.c2) AND (r7.c4 &lt;&gt; r8.c5) AND (r7.c4 &lt;&gt; r8.c6) AND (r7.c4 &lt;&gt; r9.c5) AND (r7.c4 &lt;&gt; r9.c6) AND (r7.c5 &lt;&gt; r8.c4) AND (r7.c5 &lt;&gt; r8.c6) AND (r7.c5 &lt;&gt; r9.c4) AND (r7.c5 &lt;&gt; r9.c6) AND
(r7.c6 &lt;&gt; r8.c4) AND (r7.c6 &lt;&gt; r8.c5) AND (r7.c6 &lt;&gt; r9.c4) AND (r7.c6 &lt;&gt; r9.c5) AND (r7.c7 &lt;&gt; r8.c8) AND (r7.c7 &lt;&gt; r8.c9) AND (r7.c7 &lt;&gt; r9.c8) AND (r7.c7 &lt;&gt; r9.c9) AND (r7.c8 &lt;&gt; r8.c7) AND (r7.c8 &lt;&gt; r8.c9) AND (r7.c8 &lt;&gt; r9.c7) AND (r7.c8 &lt;&gt; r9.c9) AND (r7.c9 &lt;&gt; r8.c7) AND (r7.c9 &lt;&gt; r8.c8) AND (r7.c9 &lt;&gt; r9.c7) AND (r7.c9 &lt;&gt; r9.c8) AND
(r8.c1 &lt;&gt; r9.c2) AND (r8.c1 &lt;&gt; r9.c3) AND (r8.c2 &lt;&gt; r9.c1) AND (r8.c2 &lt;&gt; r9.c3) AND (r8.c3 &lt;&gt; r9.c1) AND (r8.c3 &lt;&gt; r9.c2) AND (r8.c4 &lt;&gt; r9.c5) AND (r8.c4 &lt;&gt; r9.c6) AND (r8.c5 &lt;&gt; r9.c4) AND (r8.c5 &lt;&gt; r9.c6) AND (r8.c6 &lt;&gt; r9.c4) AND (r8.c6 &lt;&gt; r9.c5) AND (r8.c7 &lt;&gt; r9.c8) AND (r8.c7 &lt;&gt; r9.c9) AND (r8.c8 &lt;&gt; r9.c7) AND (r8.c8 &lt;&gt; r9.c9) AND
(r8.c9 &lt;&gt; r9.c7) AND (r8.c9 &lt;&gt; r9.c8);
</pre></p>
<p>Maintenant, nous avons tout ce qu&#8217;il faut pour débuter! Si vous avez rencontré des difficultés avec le téléchargement du fichier <strong>positions.sql</strong>, contactez-moi et je me ferai un plaisir de vous envoyez le fichier compressé (format Gzip) par courriel. Consultez ma page &#8220;<a title="À propos" href="http://endormitoire.wordpress.com/about/" target="_blank">À propos</a>&#8221; pour savoir à quelle adresse courriel me rejoindre!</p>
<p><strong>7. Tester une grille</strong></p>
<p><a title="Asteure" href="http://www.dictionnaire-quebecois.com/definitions-a.html" target="_blank">Asteure</a> que toute la poutine (expression québécoise parfois utilisée pour désigner les tâches cléricales, répétitives, procédurales, techniques ou ennuyantes) est complétée, examinons comment notre solution se comporte pour cette grille :</p>
<p><a href="http://endormitoire.files.wordpress.com/2012/01/sudoku_grid_01.jpg"><img class="aligncenter size-full wp-image-210" title="Grille #01" src="http://endormitoire.files.wordpress.com/2012/01/sudoku_grid_01.jpg?w=450" alt=""   /></a></p>
<p>Pour solutionner la grille, nous devons exécuter cette requête SQL :</p>
<p><pre class="brush: sql; wrap-lines: false;">
SELECT *
FROM sudoku_rows_view
WHERE
(r1c1 = 5) AND (r1c2 = 3) AND (r1c5 = 7) AND (r2c1 = 6) AND
(r2c4 = 1) AND (r2c5 = 9) AND (r2c6 = 5) AND (r3c2 = 9) AND
(r3c3 = 8) AND (r3c8 = 6) AND (r4c1 = 8) AND (r4c5 = 6) AND
(r4c9 = 3) AND (r5c1 = 4) AND (r5c4 = 8) AND (r5c6 = 3) AND
(r5c9 = 1) AND (r6c1 = 7) AND (r6c5 = 2) AND (r6c9 = 6) AND
(r7c2 = 6) AND (r7c7 = 2) AND (r7c8 = 8) AND (r8c4 = 4) AND
(r8c5 = 1) AND (r8c6 = 9) AND (r8c9 = 5) AND (r9c5 = 8) AND
(r9c8 = 7) AND (r9c9 = 9);</pre></p>
<p>Évidemment, je l&#8217;espère, vous aurez compris que <em>r8c9</em> signifie &#8220;rangée 8 colonne 9&#8243;, etc.</p>
<p>Tada!</p>
<p><a href="http://endormitoire.files.wordpress.com/2012/01/execution_grille_01.jpg"><img class="aligncenter size-full wp-image-219" title="execution_grille_01" src="http://endormitoire.files.wordpress.com/2012/01/execution_grille_01.jpg?w=450&#038;h=181" alt="" width="450" height="181" /></a></p>
<p>Victoire!</p>
<p>Voici ce que le <a title="EXPLAIN" href="http://dev.mysql.com/doc/refman/5.0/fr/explain.html" target="_blank">EXPLAIN</a> de la requête a à dire :</p>
<p><pre class="brush: plain; wrap-lines: false;">

mysql&gt; explain
-&gt; SELECT *
-&gt; FROM sudoku_rows_view
-&gt; WHERE
-&gt; (r1c1 = 5) AND (r1c2 = 3) AND (r1c5 = 7) AND (r2c1 = 6) AND
-&gt; (r2c4 = 1) AND (r2c5 = 9) AND (r2c6 = 5) AND (r3c2 = 9) AND
-&gt; (r3c3 = 8) AND (r3c8 = 6) AND (r4c1 = 8) AND (r4c5 = 6) AND
-&gt; (r4c9 = 3) AND (r5c1 = 4) AND (r5c4 = 8) AND (r5c6 = 3) AND
-&gt; (r5c9 = 1) AND (r6c1 = 7) AND (r6c5 = 2) AND (r6c9 = 6) AND
-&gt; (r7c2 = 6) AND (r7c7 = 2) AND (r7c8 = 8) AND (r8c4 = 4) AND
-&gt; (r8c5 = 1) AND (r8c6 = 9) AND (r8c9 = 5) AND (r9c5 = 8) AND
-&gt; (r9c8 = 7) AND (r9c9 = 9);
+----+-------------+-------+-------------+----------------------------------------------------------------------------------------------------------------------------------------------------+-------------+---------+------+------+--------------------------------------------------------------+
| id | select_type | table | type        | possible_keys                                                                                                                                      | key         | key_len | ref  | rows | Extra                                                        |
+----+-------------+-------+-------------+----------------------------------------------------------------------------------------------------------------------------------------------------+-------------+---------+------+------+--------------------------------------------------------------+
|  1 | SIMPLE      | r5    | index_merge | i12,i13,i14,i15,i16,i17,i18,i19,i23,i24,i25,i26,i27,i28,i29,i34,i35,i36,i37,i38,i39,i45,i46,i47,i48,i49,i56,i57,i58,i59,i67,i68,i69,i78,i79,i89,i9 | i16,i19,i49 | 2,2,2   | NULL |   68 | Using intersect(i16,i19,i49); Using where                    |
|  1 | SIMPLE      | r2    | index_merge | i12,i13,i14,i15,i16,i17,i18,i19,i23,i24,i25,i26,i27,i28,i29,i34,i35,i36,i37,i38,i39,i45,i46,i47,i48,i49,i56,i57,i58,i59,i67,i68,i69,i78,i79,i89,i9 | i14,i15,i16 | 2,2,2   | NULL |   78 | Using intersect(i14,i15,i16); Using where; Using join buffer |
|  1 | SIMPLE      | r8    | index_merge | i45,i46,i47,i48,i49,i56,i57,i58,i59,i67,i68,i69,i78,i79,i89,i9                                                                                     | i45,i46,i59 | 2,2,2   | NULL |   78 | Using intersect(i45,i46,i59); Using where; Using join buffer |
|  1 | SIMPLE      | r3    | index_merge | i12,i13,i14,i15,i16,i17,i18,i19,i23,i24,i25,i26,i27,i28,i29,i34,i35,i36,i37,i38,i39,i45,i46,i47,i48,i49,i56,i57,i58,i59,i67,i68,i69,i78,i79,i89,i9 | i28,i38     | 2,2     | NULL |  551 | Using intersect(i28,i38); Using where; Using join buffer     |
|  1 | SIMPLE      | r6    | index_merge | i12,i13,i14,i15,i16,i17,i18,i19,i23,i24,i25,i26,i27,i28,i29,i45,i46,i47,i48,i49,i56,i57,i58,i59,i67,i68,i69,i78,i79,i89,i9                         | i19,i59     | 2,2     | NULL |  551 | Using intersect(i19,i59); Using where; Using join buffer     |
|  1 | SIMPLE      | r1    | index_merge | i12,i13,i14,i15,i16,i17,i18,i19,i23,i24,i25,i26,i27,i28,i29,i34,i35,i36,i37,i38,i39,i45,i46,i47,i48,i49,i56,i57,i58,i59,i67,i68,i69,i78,i79,i89,i9 | i12,i15     | 2,2     | NULL |  624 | Using intersect(i12,i15); Using where; Using join buffer     |
|  1 | SIMPLE      | r9    | index_merge | i56,i57,i58,i59,i89,i9                                                                                                                             | i58,i59     | 2,2     | NULL |  624 | Using intersect(i58,i59); Using where; Using join buffer     |
|  1 | SIMPLE      | r4    | index_merge | i12,i13,i14,i15,i16,i17,i18,i19,i23,i24,i25,i26,i27,i28,i29,i34,i35,i36,i37,i38,i39,i45,i46,i47,i48,i49,i56,i57,i58,i59,i67,i68,i69,i78,i79,i89,i9 | i15,i19     | 2,2     | NULL |  625 | Using intersect(i15,i19); Using where; Using join buffer     |
|  1 | SIMPLE      | r7    | index_merge | i23,i24,i25,i26,i27,i28,i29,i45,i46,i47,i48,i49,i56,i57,i58,i59,i67,i68,i69,i78,i79,i89,i9                                                         | i27,i28     | 2,2     | NULL |  625 | Using intersect(i27,i28); Using where; Using join buffer     |
+----+-------------+-------+-------------+----------------------------------------------------------------------------------------------------------------------------------------------------+-------------+---------+------+------+--------------------------------------------------------------+
9 rows in set (0.06 sec)

</pre></p>
<p>Voilà!</p>
<p>Tout fonctionne à merveille! Seulement <strong>0.39 secondes</strong> pour solutionner la grille!  Savourons le résultat :</p>
<p><pre class="brush: plain; wrap-lines: false;">

mysql&gt; SELECT *
-&gt; FROM sudoku_rows_view
-&gt; WHERE
-&gt; (r1c1 = 5) AND (r1c2 = 3) AND (r1c5 = 7) AND (r2c1 = 6) AND
-&gt; (r2c4 = 1) AND (r2c5 = 9) AND (r2c6 = 5) AND (r3c2 = 9) AND
-&gt; (r3c3 = 8) AND (r3c8 = 6) AND (r4c1 = 8) AND (r4c5 = 6) AND
-&gt; (r4c9 = 3) AND (r5c1 = 4) AND (r5c4 = 8) AND (r5c6 = 3) AND
-&gt; (r5c9 = 1) AND (r6c1 = 7) AND (r6c5 = 2) AND (r6c9 = 6) AND
-&gt; (r7c2 = 6) AND (r7c7 = 2) AND (r7c8 = 8) AND (r8c4 = 4) AND
-&gt; (r8c5 = 1) AND (r8c6 = 9) AND (r8c9 = 5) AND (r9c5 = 8) AND
-&gt; (r9c8 = 7) AND (r9c9 = 9);
+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
| r1c1 | r1c2 | r1c3 | r1c4 | r1c5 | r1c6 | r1c7 | r1c8 | r1c9 | r2c1 | r2c2 | r2c3 | r2c4 | r2c5 | r2c6 | r2c7 | r2c8 | r2c9 | r3c1 | r3c2 | r3c3 | r3c4 | r3c5 | r3c6 | r3c7 | r3c8 | r3c9 | r4c1 | r4c2 | r4c3 | r4c4 | r4c5 | r4c6 | r4c7 | r4c8 | r4c9 | r5c1 | r5c2 | r5c3 | r5c4 | r5c5 | r5c6 | r5c7 | r5c8 | r5c9 | r6c1 | r6c2 | r6c3 | r6c4 | r6c5 | r6c6 | r6c7 | r6c8 | r6c9 | r7c1 | r7c2 | r7c3 | r7c4 | r7c5 | r7c6 | r7c7 | r7c8 | r7c9 | r8c1 | r8c2 | r8c3 | r8c4 | r8c5 | r8c6 | r8c7 | r8c8 | r8c9 | r9c1 | r9c2 | r9c3 | r9c4 | r9c5 | r9c6 | r9c7 | r9c8 | r9c9 |
+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
|    5 |    3 |    4 |    6 |    7 |    8 |    9 |    1 |    2 |    6 |    7 |    2 |    1 |    9 |    5 |    3 |    4 |    8 |    1 |    9 |    8 |    3 |    4 |    2 |    5 |    6 |    7 |    8 |    5 |    9 |    7 |    6 |    1 |    4 |    2 |    3 |    4 |    2 |    6 |    8 |    5 |    3 |    7 |    9 |    1 |    7 |    1 |    3 |    9 |    2 |    4 |    8 |    5 |    6 |    9 |    6 |    1 |    5 |    3 |    7 |    2 |    8 |    4 |    2 |    8 |    7 |    4 |    1 |    9 |    6 |    3 |    5 |    3 |    4 |    5 |    2 |    8 |    6 |    1 |    7 |    9 |
+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
1 row in set (0.39 sec)

</pre></p>
<p>Trop facile ? Hmmmm!?!? Peut-être!  À moins que&#8230;</p>
<p>C&#8217;était beaucoup trop beau! Comme nous le verrons au prochain article, plusieurs problèmes pointent à l&#8217;horizon (et espérons-le, plusieurs remèdes!) et nous devrons faire <strong>beaucoup</strong> mieux et plus vite avec les outils que nous avons pour arriver à résoudre certaines grilles très particulières.</p>
<p>En attendant la seconde partie de cet article, amusez-vous bien et expérimentez !</p>
<p>Note: j&#8217;ai déjà publié cet article en anglais sur mes autres blogues dont récemment <a title="A Pattern So Grand and Complex! (Part 1)" href="http://myfavoriteheadache.wordpress.com/2010/12/15/a-pattern-so-grand-and-complex-part-1/" target="_blank">ici</a> (l&#8217;autre blogue est disparu depuis longtemps). Ne vous en faites pas, il ne s&#8217;agit pas d&#8217;un cas de plagiat!!!</p>
<p>Prochaine étape, chers lecteurs, nous apprendrons à presser un citron et à en extraire tout le jus!</p>
<p><a href="http://endormitoire.files.wordpress.com/2012/01/un_citron.jpg"><img class="aligncenter size-thumbnail wp-image-246" title="Un citron" src="http://endormitoire.files.wordpress.com/2012/01/un_citron.jpg?w=150&#038;h=112" alt="" width="150" height="112" /></a></p>
<br />Classé dans:<a href='http://endormitoire.wordpress.com/category/algorithmes/'>algorithmes</a>, <a href='http://endormitoire.wordpress.com/category/bases-de-donnees/mysql/myisam/'>MyISAM</a>, <a href='http://endormitoire.wordpress.com/category/bases-de-donnees/mysql/'>MySQL</a>, <a href='http://endormitoire.wordpress.com/category/optimisation/'>optimisation</a>, <a href='http://endormitoire.wordpress.com/category/performance/'>performance</a>, <a href='http://endormitoire.wordpress.com/category/smalltalk/pharo/'>Pharo</a>, <a href='http://endormitoire.wordpress.com/category/jeux/sudoku/'>sudoku</a> Tagged: <a href='http://endormitoire.wordpress.com/tag/algorithmes/'>algorithmes</a>, <a href='http://endormitoire.wordpress.com/tag/myisam/'>MyISAM</a>, <a href='http://endormitoire.wordpress.com/tag/mysql/'>MySQL</a>, <a href='http://endormitoire.wordpress.com/tag/optimisation/'>optimisation</a>, <a href='http://endormitoire.wordpress.com/tag/performance/'>performance</a>, <a href='http://endormitoire.wordpress.com/tag/pharo/'>Pharo</a>, <a href='http://endormitoire.wordpress.com/tag/sudoku-2/'>Sudoku</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/endormitoire.wordpress.com/120/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/endormitoire.wordpress.com/120/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/endormitoire.wordpress.com/120/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/endormitoire.wordpress.com/120/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/endormitoire.wordpress.com/120/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/endormitoire.wordpress.com/120/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/endormitoire.wordpress.com/120/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/endormitoire.wordpress.com/120/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/endormitoire.wordpress.com/120/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/endormitoire.wordpress.com/120/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/endormitoire.wordpress.com/120/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/endormitoire.wordpress.com/120/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/endormitoire.wordpress.com/120/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/endormitoire.wordpress.com/120/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=endormitoire.wordpress.com&amp;blog=14420825&amp;post=120&amp;subd=endormitoire&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://endormitoire.wordpress.com/2012/01/07/comment-presser-un-citron-premiere-partie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/167178fdce6304d803372432a3052672?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">endormitoire</media:title>
		</media:content>

		<media:content url="http://endormitoire.files.wordpress.com/2012/01/client_mysql.jpg?w=300" medium="image">
			<media:title type="html">Client MySQL</media:title>
		</media:content>

		<media:content url="http://endormitoire.files.wordpress.com/2012/01/rows_explained.jpg" medium="image">
			<media:title type="html">Méthode de regroupement des lignes</media:title>
		</media:content>

		<media:content url="http://endormitoire.files.wordpress.com/2012/01/workspace.jpg" medium="image">
			<media:title type="html">Workspace</media:title>
		</media:content>

		<media:content url="http://endormitoire.files.wordpress.com/2012/01/invite_de_commande_insertion.jpg" medium="image">
			<media:title type="html">Invite de commande</media:title>
		</media:content>

		<media:content url="http://endormitoire.files.wordpress.com/2012/01/workspace_contraintes.jpg" medium="image">
			<media:title type="html">Workspace (contraintes)</media:title>
		</media:content>

		<media:content url="http://endormitoire.files.wordpress.com/2012/01/transcript_characterlimit.jpg" medium="image">
			<media:title type="html">Transcript&#62;&#62;characterLimit</media:title>
		</media:content>

		<media:content url="http://endormitoire.files.wordpress.com/2012/01/sudoku_grid_01.jpg" medium="image">
			<media:title type="html">Grille #01</media:title>
		</media:content>

		<media:content url="http://endormitoire.files.wordpress.com/2012/01/execution_grille_01.jpg" medium="image">
			<media:title type="html">execution_grille_01</media:title>
		</media:content>

		<media:content url="http://endormitoire.files.wordpress.com/2012/01/un_citron.jpg?w=150" medium="image">
			<media:title type="html">Un citron</media:title>
		</media:content>
	</item>
		<item>
		<title>db4free.net</title>
		<link>http://endormitoire.wordpress.com/2012/01/06/db4free-net/</link>
		<comments>http://endormitoire.wordpress.com/2012/01/06/db4free-net/#comments</comments>
		<pubDate>Fri, 06 Jan 2012 19:45:43 +0000</pubDate>
		<dc:creator>endormitoire</dc:creator>
				<category><![CDATA[InnoDb]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[db4free]]></category>
		<category><![CDATA[db4free.net]]></category>
		<category><![CDATA[EMS MySQLManager]]></category>
		<category><![CDATA[HeidiSQL]]></category>

		<guid isPermaLink="false">http://endormitoire.wordpress.com/?p=173</guid>
		<description><![CDATA[Pour ceux qui voudraient se familiariser avec MySQL (ou tout simplement tester la version 5.6), il est possible de le faire en se créant gratuitement un compte sur le site db4free.net.  La procédure est simple et ne prend qu&#8217;une minute. Prenez toutefois bonne note que les administrateurs du serveur se réservent le droit, à tout [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=endormitoire.wordpress.com&amp;blog=14420825&amp;post=173&amp;subd=endormitoire&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Pour ceux qui voudraient se familiariser avec MySQL (ou tout simplement tester la version 5.6), il est possible de le faire en se créant gratuitement un compte sur le site <a title="db4free.net" href="http://db4free.net/" target="_blank">db4free.net</a>.  La procédure est simple et ne prend qu&#8217;une minute.</p>
<p>Prenez toutefois bonne note que les administrateurs du serveur se réservent le droit, <strong>à tout moment</strong>, de supprimer votre base de données et/ou votre compte.  Évidemment, cet avertissement s&#8217;adresse à ceux qui abuseraient de ce service gratuit.  Les requêtes monopolisant le CPU du serveur, les bases de données trop volumineuses et les comptes très rarement utilisés sont autant de raisons d&#8217;être concernés par l&#8217;avertissement ci-haut!</p>
<p>On peut accéder à sa (une seule par compte) base de données de trois façons :</p>
<p>1) par le client mysql avec la commande:</p>
<p style="text-align:center;"><strong>mysql</strong> <strong>-u</strong>votrenomusager <strong>-p</strong>votremotdepasse <strong>-h</strong>db4free.net</p>
<p>2) vous pouvez également vous servir de vos outils préférés tels que <a title="HeidiSQL" href="http://www.heidisql.com/" target="_blank">HeidiSQL</a> et <a title="EMS MySQL Manager" href="http://www.sqlmanager.net/products/mysql/manager/" target="_blank">EMS MySQL Manager</a></p>
<p>3) en dernier recours, vous avez aussi accès à l&#8217;interface <a title="PHPMyAdmin" href="http://www.phpmyadmin.net/home_page/index.php" target="_blank">PHPMyAdmin</a> directement sur leur site.</p>
<p>Tous les types de tables sont supportés (oui, même MEMORY!) et les tables InnoDb sont sauvegardées dans un <em>tablespace</em> global (par opposition au mode innodb_file_per_table).</p>
<p>Amusez-vous bien!</p>
<br />Classé dans:<a href='http://endormitoire.wordpress.com/category/bases-de-donnees/mysql/innodb/'>InnoDb</a>, <a href='http://endormitoire.wordpress.com/category/bases-de-donnees/mysql/'>MySQL</a> Tagged: <a href='http://endormitoire.wordpress.com/tag/db4free/'>db4free</a>, <a href='http://endormitoire.wordpress.com/tag/db4free-net/'>db4free.net</a>, <a href='http://endormitoire.wordpress.com/tag/ems-mysqlmanager/'>EMS MySQLManager</a>, <a href='http://endormitoire.wordpress.com/tag/heidisql/'>HeidiSQL</a>, <a href='http://endormitoire.wordpress.com/tag/mysql/'>MySQL</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/endormitoire.wordpress.com/173/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/endormitoire.wordpress.com/173/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/endormitoire.wordpress.com/173/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/endormitoire.wordpress.com/173/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/endormitoire.wordpress.com/173/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/endormitoire.wordpress.com/173/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/endormitoire.wordpress.com/173/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/endormitoire.wordpress.com/173/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/endormitoire.wordpress.com/173/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/endormitoire.wordpress.com/173/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/endormitoire.wordpress.com/173/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/endormitoire.wordpress.com/173/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/endormitoire.wordpress.com/173/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/endormitoire.wordpress.com/173/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=endormitoire.wordpress.com&amp;blog=14420825&amp;post=173&amp;subd=endormitoire&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://endormitoire.wordpress.com/2012/01/06/db4free-net/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/167178fdce6304d803372432a3052672?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">endormitoire</media:title>
		</media:content>
	</item>
		<item>
		<title>Quelques trucs pour WordPress.com&#8230;  WordPress Tips!</title>
		<link>http://endormitoire.wordpress.com/2012/01/06/quelques-trucs-pour-wordpress-com-wordpress-tips/</link>
		<comments>http://endormitoire.wordpress.com/2012/01/06/quelques-trucs-pour-wordpress-com-wordpress-tips/#comments</comments>
		<pubDate>Fri, 06 Jan 2012 14:57:34 +0000</pubDate>
		<dc:creator>endormitoire</dc:creator>
				<category><![CDATA[anglais]]></category>
		<category><![CDATA[échecs]]></category>
		<category><![CDATA[français]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[programmation]]></category>
		<category><![CDATA[Smalltalk]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[trucs]]></category>
		<category><![CDATA[WordPress.com]]></category>
		<category><![CDATA[English]]></category>

		<guid isPermaLink="false">http://endormitoire.wordpress.com/?p=147</guid>
		<description><![CDATA[1. Insérer du code Pour ceux qui se demandent comment insérer des bouts de code dans WordPress.com, il faut savoir qu&#8217;il existe des tags permettant de le faire.  Plusieurs langages de programmation populaires sont supportés mais pas Smalltalk, malheureusement&#8230;  Pas encore du moins!  Pour ce qui est du code SQL, ça  fonctionne assez bien.  Ça [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=endormitoire.wordpress.com&amp;blog=14420825&amp;post=147&amp;subd=endormitoire&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong>1. Insérer du code</strong></p>
<p>Pour ceux qui se demandent comment insérer des bouts de code dans WordPress.com, il faut savoir qu&#8217;il existe des <em>tags</em> permettant de le faire.  Plusieurs langages de programmation populaires sont supportés mais pas Smalltalk, malheureusement&#8230;  Pas encore du moins!  Pour ce qui est du code SQL, ça  fonctionne assez bien.  Ça va nous permettre d&#8217;afficher nos requêtes à MySQL de façon lisible et agréable à l&#8217;oeil!</p>
<p>La <a title="Insérer du code source dans WordPress.com" href="http://en.support.wordpress.com/code/posting-source-code/" target="_blank">méthode</a> est expliquée en anglais seulement mais les indications sont faciles à suivre.</p>
<p>Ça donne quelque chose du genre :</p>
<p><pre class="brush: sql;">
SELECT *
FROM region
INNER JOIN (
SELECT region.PDB, region.CHAIN
FROM region
LEFT JOIN split_domain USING (SUNID)
WHERE split_domain.SUNID IS NULL
GROUP BY PDB, CHAIN
HAVING COUNT(*)&gt;1
) AS x
ON
region.PDB = x.PDB
AND
region.CHAIN = x.CHAIN
LIMIT 10
</pre></p>
<p><strong>2. Insérer des parties d&#8217;échecs et des diagrammes</strong></p>
<p>Pour les parties d&#8217;échecs et les positions, WordPress.com ne permet pas l&#8217;usage de Flash, de Java ou de <em>plugins</em> permettant la création de diagrammes ou de visualiser des parties. Pour le faire, vous devez avoir votre propre instance de WordPress ou vous devrez vous résoudre à insérer des images <a title="À la mitaine" href="http://legrenierdebibiane.com/participez/Expressions/quebec.html#M" target="_blank">à la mitaine </a>dans votre article.</p>
<p><strong>3. Lire ce blogue dans une langue autre que le français</strong></p>
<p>Le contenu de ce blogue, de façon surprenante, est assez bien traduit par Google. Je vous suggère d&#8217;essayer de traduire <a title="Comment presser un citron" href="http://endormitoire.wordpress.com/2012/01/04/comment-presser-un-citron-preambule/" target="_blank">cet article</a> avec l&#8217;<a title="Outil de traduction Google" href="http://translate.google.com/" target="_blank">outil de traduction de Google</a>.</p>
<p>The content of this blog, surprisingly, is pretty well translated by Google. I suggest you try to translate <a title="Comment presser un citron" href="http://endormitoire.wordpress.com/2012/01/04/comment-presser-un-citron-preambule/" target="_blank">this article</a> with the <a title="Outil de traduction Google" href="http://translate.google.com/" target="_blank">Google translation tool</a>.</p>
<br />Classé dans:<a href='http://endormitoire.wordpress.com/category/langue/anglais/'>anglais</a>, <a href='http://endormitoire.wordpress.com/category/jeux/echecs/'>échecs</a>, <a href='http://endormitoire.wordpress.com/category/langue/francais/'>français</a>, <a href='http://endormitoire.wordpress.com/category/bases-de-donnees/mysql/'>MySQL</a>, <a href='http://endormitoire.wordpress.com/category/programmation/'>programmation</a>, <a href='http://endormitoire.wordpress.com/category/smalltalk/'>Smalltalk</a>, <a href='http://endormitoire.wordpress.com/category/bases-de-donnees/sql/'>SQL</a>, <a href='http://endormitoire.wordpress.com/category/wordpress-com/trucs/'>trucs</a>, <a href='http://endormitoire.wordpress.com/category/wordpress-com/'>WordPress.com</a> Tagged: <a href='http://endormitoire.wordpress.com/tag/anglais/'>anglais</a>, <a href='http://endormitoire.wordpress.com/tag/echecs/'>échecs</a>, <a href='http://endormitoire.wordpress.com/tag/english/'>English</a>, <a href='http://endormitoire.wordpress.com/tag/francais/'>français</a>, <a href='http://endormitoire.wordpress.com/tag/mysql/'>MySQL</a>, <a href='http://endormitoire.wordpress.com/tag/programmation/'>programmation</a>, <a href='http://endormitoire.wordpress.com/tag/smalltalk/'>Smalltalk</a>, <a href='http://endormitoire.wordpress.com/tag/sql/'>SQL</a>, <a href='http://endormitoire.wordpress.com/tag/trucs/'>trucs</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/endormitoire.wordpress.com/147/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/endormitoire.wordpress.com/147/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/endormitoire.wordpress.com/147/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/endormitoire.wordpress.com/147/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/endormitoire.wordpress.com/147/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/endormitoire.wordpress.com/147/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/endormitoire.wordpress.com/147/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/endormitoire.wordpress.com/147/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/endormitoire.wordpress.com/147/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/endormitoire.wordpress.com/147/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/endormitoire.wordpress.com/147/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/endormitoire.wordpress.com/147/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/endormitoire.wordpress.com/147/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/endormitoire.wordpress.com/147/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=endormitoire.wordpress.com&amp;blog=14420825&amp;post=147&amp;subd=endormitoire&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://endormitoire.wordpress.com/2012/01/06/quelques-trucs-pour-wordpress-com-wordpress-tips/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/167178fdce6304d803372432a3052672?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">endormitoire</media:title>
		</media:content>
	</item>
		<item>
		<title>Comment presser un citron (préambule).</title>
		<link>http://endormitoire.wordpress.com/2012/01/04/comment-presser-un-citron-preambule/</link>
		<comments>http://endormitoire.wordpress.com/2012/01/04/comment-presser-un-citron-preambule/#comments</comments>
		<pubDate>Wed, 04 Jan 2012 19:36:47 +0000</pubDate>
		<dc:creator>endormitoire</dc:creator>
				<category><![CDATA[algorithmes]]></category>
		<category><![CDATA[jeux]]></category>
		<category><![CDATA[mathématiques]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[optimisation]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[Pharo]]></category>
		<category><![CDATA[programmation]]></category>
		<category><![CDATA[Smalltalk]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[sudoku]]></category>
		<category><![CDATA[Sudoku]]></category>

		<guid isPermaLink="false">http://endormitoire.wordpress.com/?p=70</guid>
		<description><![CDATA[&#8220;La simplicité est la sophistication suprême&#8221; (Léonard de Vinci). Problème : vous avez à trouver, en seulement quelques secondes, un enregistrement unique parmi des milliards de milliards de possibilité et les seules informations dont vous disposez pour faire votre recherche sont de 17 à 35 attributs sur les 81 que contiennent la donnée tant convoitée&#8230; [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=endormitoire.wordpress.com&amp;blog=14420825&amp;post=70&amp;subd=endormitoire&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><em>&#8220;La simplicité est la sophistication suprême&#8221;</em> (<a title="Léonard de Vinci" href="http://fr.wikipedia.org/wiki/L%C3%A9onard_de_Vinci" target="_blank">Léonard de Vinci</a>).</p>
<p>Problème : vous avez à trouver, en seulement quelques secondes, un enregistrement unique parmi des milliards de milliards de possibilité et les seules informations dont vous disposez pour faire votre recherche sont de 17 à 35 attributs sur les 81 que contiennent la donnée tant convoitée&#8230; Est-ce possible ? Comment faire? De prime abord, ça semble impossible!</p>
<p><em>&#8220;Impossible n&#8217;est pas français</em>&#8221; comme le dit le dicton (faussement attribué à <a title="Napoléon Bonaparte" href="http://fr.wikipedia.org/wiki/Napol%C3%A9on_Bonaparte" target="_blank">Napoléon Bonaparte</a>, vexé par le pessimisme de <a title="Jean Le Marois" href="http://fr.wikipedia.org/wiki/Jean_Le_Marois" target="_blank">Jean Léonard, comte le Marois</a>).</p>
<p>Il y a bientôt quelques années de cela, un de mes confrères de travail, Claude, m&#8217;introduisait au <a title="Sudoku" href="http://fr.wikipedia.org/wiki/Sudoku" target="_blank">Sudoku</a>. Au tout début, je ne comprenais pas la fascination de celui-ci pour un problème aussi trivial jusqu&#8217;à ce que j&#8217;essaie de résoudre une de ces grilles par moi-même&#8230; Les règles étant si peu nombreuses et si simples, j&#8217;ai rapidement été surpris par la complexité demandée pour résoudre ces puzzles. Et j&#8217;en suis devenu accroc!</p>
<div class="wp-caption aligncenter" style="width: 152px"><img title="Su Doku" src="http://imgs.xkcd.com/comics/su_doku.jpg" alt="Binary Sudoku" width="142" height="170" /><p class="wp-caption-text">Binary Sudoku</p></div>
<p>Non, aucun autre puzzle ne semble, en apparence, aussi simple que le Sudoku! Mais derrière ce petit jeu aux règles minimales se cache un univers de complexité qui englobe une branche complète des mathématiques.</p>
<p>Ce n&#8217;est que lorsque je me suis buté à un problème difficile (sans arriver à le résoudre) que je me suis intéressé à l&#8217;aspect algorithmique de la résolution d&#8217;un Sudoku. Évidemment, j&#8217;aurais pu télécharger des <em>&#8220;sudoku solver&#8221;</em> écrits en Java, en Python, en Ruby, en Smalltalk, en BASIC, en T-SQL, en macros Excel, en n&#8217;importe quoi et trouver la solution mais le défi était d&#8217;écrire moi-même un de ces <em>&#8220;sudoku solver&#8221;</em>.</p>
<p>Malheureusement, après réflexion, la tâche m&#8217;apparaissait trop simple pour être intéressante. Coder un tel outil avec les méthodes de résolution de base et y ajouter une pile de recherche pour y faire du <a title="Backtracking" href="http://fr.wikipedia.org/wiki/Backtracking" target="_blank"><em>&#8220;backtracking&#8221;</em></a> était, en soi, trop facile (du moins, en <a title="Smalltalk" href="http://fr.wikipedia.org/wiki/Smalltalk" target="_blank">Smalltalk</a>) pour valoir la peine. Mais à cette époque, étant plongé dans des requêtes <a title="SQL" href="http://fr.wikipedia.org/wiki/SQL" target="_blank">SQL</a> dignes des pires labyrinthes pour régler une foule de problèmes au niveau de la base de donnée d&#8217;un de nos clients, l&#8217;idée m&#8217;est venue de trouver une solution &#8220;100% SQL&#8221;, sans procédures stockées, sans fonctions, seulement UNE requête SQL. Le défi était lancé!</p>
<p>Il est maintenant établi qu&#8217;il existe <a title="Mathématiques du sudoku" href="http://fr.wikipedia.org/wiki/Math%C3%A9matiques_du_Sudoku" target="_blank">6670903752021072936960</a> grilles différentes pour un Sudoku standard de 9&#215;9. Avec les années, plusieurs raffinements et subtilités ont pris en compte les symétries ainsi que diverses particularités des autres variantes du Sudoku pour mieux comprendre et étudier tous les aspects du Sudoku standard. Diverses techniques de résolution, de plus en plus complexes et élaborées, ont vu le jour puis ont été étudiées et améliorées de fond en comble. Les grilles de Sudoku et les <a title="Carré latin" href="http://fr.wikipedia.org/wiki/Carr%C3%A9_latin" target="_blank">carrés latins</a> ont depuis longtemps tenu les mathématiciens occupés et, encore aujourd&#8217;hui, de nombreux trésors et concepts mathématiques encore cachés ne demandent qu&#8217;à être découverts. Ce petit jeu représente une mine intarissable de surprises pour les mathématiciens et les développeurs : il ne reste qu&#8217;à creuser encore plus creux et plus longtemps!</p>
<p>Cet article, divisé en trois parties, s&#8217;attaquera aux grilles de Sudoku standard de 9&#215;9, question de garder les choses simples. Nous examinerons une manière de résoudre ces grilles à l&#8217;aide d&#8217;une solution n&#8217;impliquant que du SQL, sans procédure stockée ni script ni fonction : seulement du SQL bête et méchant!</p>
<p>En première partie nous verrons comment créer les données et tout ce dont nous avons besoin pour poursuivre. En seconde partie, nous tenterons d&#8217;optimiser notre approche. En troisième partie, nous mesurerons l&#8217;impact des différentes optimisations en les comparant.</p>
<p>Mais avant de débuter, vous devez à tout le moins être familier avec les règles du Sudoku standard, les méthodes de résolution et connaître le jargon du métier!  Tout ce dont vous avez besoin savoir se trouve <a title="Résoudre une grille de sudoku" href="http://naxos.fr.free.fr/sudoku/hints.html" target="_blank">ici</a>.</p>
<p>Matériel nécessaire : une base de données <a title="MySQL" href="http://fr.wikipedia.org/wiki/Mysql" target="_blank">MySQL </a>(bien qu&#8217;avec un peu de débrouillardise, vous pouvez adapter les scripts SQL pour un autre SGBD).</p>
<p>Matériel facultatif: si vous désirez expérimenter vous-même et peut-être pousser l&#8217;aventure plus loin, un langage de programmation vous permettant de générer des données et/ou des requêtes SQL pourrait s&#8217;avérer utile.  Pour vous aider à apprendre Smalltalk (avec Pharo), je vous conseille fortement <a title="Pharo par l'exemple" href="http://pharobyexample.org/fr/" target="_blank">Pharo par l&#8217;exemple</a>.</p>
<p>Dans cette série d&#8217;articles, j&#8217;utiliserai <a title="Télécharger MySQL" href="http://dev.mysql.com/downloads/mysql/" target="_blank">MySQL 5.1.53</a> ainsi que <a title="Pharo 1.2" href="http://www.pharo-project.org/pharo-download/release-1-2" target="_blank">Pharo 1.2a</a>.</p>
<br />Classé dans:<a href='http://endormitoire.wordpress.com/category/algorithmes/'>algorithmes</a>, <a href='http://endormitoire.wordpress.com/category/jeux/'>jeux</a>, <a href='http://endormitoire.wordpress.com/category/mathematiques/'>mathématiques</a>, <a href='http://endormitoire.wordpress.com/category/bases-de-donnees/mysql/'>MySQL</a>, <a href='http://endormitoire.wordpress.com/category/optimisation/'>optimisation</a>, <a href='http://endormitoire.wordpress.com/category/performance/'>performance</a>, <a href='http://endormitoire.wordpress.com/category/smalltalk/pharo/'>Pharo</a>, <a href='http://endormitoire.wordpress.com/category/programmation/'>programmation</a>, <a href='http://endormitoire.wordpress.com/category/smalltalk/'>Smalltalk</a>, <a href='http://endormitoire.wordpress.com/category/bases-de-donnees/sql/'>SQL</a>, <a href='http://endormitoire.wordpress.com/category/jeux/sudoku/'>sudoku</a> Tagged: <a href='http://endormitoire.wordpress.com/tag/algorithmes/'>algorithmes</a>, <a href='http://endormitoire.wordpress.com/tag/jeux/'>jeux</a>, <a href='http://endormitoire.wordpress.com/tag/mathematiques/'>mathématiques</a>, <a href='http://endormitoire.wordpress.com/tag/mysql/'>MySQL</a>, <a href='http://endormitoire.wordpress.com/tag/optimisation/'>optimisation</a>, <a href='http://endormitoire.wordpress.com/tag/performance/'>performance</a>, <a href='http://endormitoire.wordpress.com/tag/pharo/'>Pharo</a>, <a href='http://endormitoire.wordpress.com/tag/programmation/'>programmation</a>, <a href='http://endormitoire.wordpress.com/tag/smalltalk/'>Smalltalk</a>, <a href='http://endormitoire.wordpress.com/tag/sql/'>SQL</a>, <a href='http://endormitoire.wordpress.com/tag/sudoku-2/'>Sudoku</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/endormitoire.wordpress.com/70/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/endormitoire.wordpress.com/70/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/endormitoire.wordpress.com/70/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/endormitoire.wordpress.com/70/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/endormitoire.wordpress.com/70/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/endormitoire.wordpress.com/70/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/endormitoire.wordpress.com/70/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/endormitoire.wordpress.com/70/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/endormitoire.wordpress.com/70/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/endormitoire.wordpress.com/70/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/endormitoire.wordpress.com/70/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/endormitoire.wordpress.com/70/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/endormitoire.wordpress.com/70/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/endormitoire.wordpress.com/70/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=endormitoire.wordpress.com&amp;blog=14420825&amp;post=70&amp;subd=endormitoire&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://endormitoire.wordpress.com/2012/01/04/comment-presser-un-citron-preambule/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/167178fdce6304d803372432a3052672?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">endormitoire</media:title>
		</media:content>

		<media:content url="http://imgs.xkcd.com/comics/su_doku.jpg" medium="image">
			<media:title type="html">Su Doku</media:title>
		</media:content>
	</item>
		<item>
		<title>Résolutions du Nouvel An</title>
		<link>http://endormitoire.wordpress.com/2012/01/01/resolutions-du-nouvel-an/</link>
		<comments>http://endormitoire.wordpress.com/2012/01/01/resolutions-du-nouvel-an/#comments</comments>
		<pubDate>Sun, 01 Jan 2012 08:22:54 +0000</pubDate>
		<dc:creator>endormitoire</dc:creator>
				<category><![CDATA[échecs]]></category>
		<category><![CDATA[Gnochon]]></category>
		<category><![CDATA[Pharo]]></category>
		<category><![CDATA[Smalltalk]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[Squeak]]></category>
		<category><![CDATA[sudoku]]></category>
		<category><![CDATA[FEN]]></category>
		<category><![CDATA[Jean-Christophe Weill]]></category>
		<category><![CDATA[Jonathan Pettersson]]></category>
		<category><![CDATA[Lars Balzer]]></category>
		<category><![CDATA[Mediocre]]></category>
		<category><![CDATA[PGN]]></category>
		<category><![CDATA[Scid]]></category>
		<category><![CDATA[Sudoku]]></category>
		<category><![CDATA[SUnit]]></category>

		<guid isPermaLink="false">http://endormitoire.wordpress.com/?p=101</guid>
		<description><![CDATA[Le Nouvel An amène toujours son lot de bonnes intentions, de promesses et de résolutions.  Le temps des Fêtes est aussi l&#8217;occasion d&#8217;avoir plus de temps pour soi et le loisir de fouiner un peu plus qu&#8217;à l&#8217;habitude sur internet.  C&#8217;est ainsi que, par le plus pur hasard, je me suis retrouvé sur le formidable [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=endormitoire.wordpress.com&amp;blog=14420825&amp;post=101&amp;subd=endormitoire&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Le Nouvel An amène toujours son lot de bonnes intentions, de promesses et de résolutions.  Le temps des Fêtes est aussi l&#8217;occasion d&#8217;avoir plus de temps pour soi et le loisir de <em>fouiner</em> un peu plus qu&#8217;à l&#8217;habitude sur internet.  C&#8217;est ainsi que, par le plus pur hasard, je me suis retrouvé sur le formidable blogue (en anglais) de <a title="Jonathan Pettersson" href="http://www.blogger.com/profile/03152085169762414586" target="_blank">Jonathan Pettersson</a> détaillant sa longue aventure dans la construction de son programme d&#8217;échecs, <a title="Mediocre Chess" href="http://mediocrechess.blogspot.com/" target="_blank">Médiocre</a>.</p>
<p>Il n&#8217;en fallait pas plus à l&#8217;informaticien que je suis et au joueur d&#8217;échecs que j&#8217;étais pour me donner, à moi aussi, le goût de me lancer dans l&#8217;aventure!  Restait à choisir l&#8217;orientation que je donnerai au programme, le langage de programmation que j&#8217;utiliserai et le nom du programme!</p>
<p>Ces trois aspects déterminants ont été fixés en l&#8217;espace d&#8217;un instant : afin de privilégier la simplicité et de préserver l&#8217;aspect didactique de la chose (j&#8217;ai l&#8217;intention d&#8217;étaler mes progrès et les obstacles rencontrés dans la construction de ce programme tout autant que les aspects spécifiques à Smalltalk ici, sur ce blogue!), le programme sera construit autour d&#8217;un générateur de coups valides (sans <em>bitoards</em>), en Smalltalk (<a title="Squeak Smalltalk" href="http://www.squeak.org/" target="_blank">Squeak </a>ou <a title="Pharo Smalltalk" href="http://www.pharo-project.org/home" target="_blank">Pharo</a>).  De plus, pour l&#8217;instant tout porte à croire que le nom de <em>Gnochon</em> lui irait à ravir!  Pour les non-initiés, <em>gnochon</em> est une expression typiquement québécoise signifiant un imbécile, un idiot sans jugement.</p>
<p>Outre ces considérations de base, j&#8217;ai établi quelques priorités.  Premièrement, me construire une bibliothèque de positions de tests (gains de matériel, mat en n coups, finales, études, milieux de partie, pièges dans les ouvertures, positions mettant en évidence les effets d&#8217;horizon, les positions de Bratko-Kopec, etc) dans le format <a title="Notation Forsyth-Edwards" href="http://fr.wikipedia.org/wiki/Notation_Forsyth-Edwards" target="_blank">FEN</a> avec laquelle je pourrai tester<em> ad nauseam </em>mon programme en utilisant <a title="SUnit" href="http://www.esug.org/data/Articles/ColumnsSqueakInFrench/Art8-SUnit.pdf" target="_blank">SUnit</a>.  En parallèle, il me faudra recueillir le maximum de parties d&#8217;échecs en format <a title="Portable Game Notation" href="http://fr.wikipedia.org/wiki/Portable_Game_Notation" target="_blank">PGN</a> et consolider celles-ci dans une immense base de données avec <a title="Shane's Chess Information Database" href="http://scid.sourceforge.net/" target="_blank">Scid</a> pour un jour me bâtir une bibliothèque d&#8217;ouverture décente et efficace.  Le <a title="Lars Balzer Chess Games" href="http://www.chessgameslinks.lars-balzer.info/" target="_blank">site de Lars Balzer</a> me semble tout-à-fait indiqué pour cette tâche!</p>
<p>Le  premier objectif que je me suis fixé à court terme est d&#8217;arriver à obtenir un programme pouvant jouer une partie complète, avec toutes les règles des échecs, et un algorithme alpha-beta ayant une fonction d&#8217;évaluation minimale (probablement seulement matérielle au départ).</p>
<p>Il me faudra aussi trouver un <em>plugin</em> pour afficher des parties et/ou des diagrammes d&#8217;échecs dans WordPress.  Les <a title="Plugins d'échecs pour WordPress" href="http://wordpress.org/search/chess" target="_blank">options</a> ne semblent pas manquer mais j&#8217;aimerais avoir votre opinion!</p>
<p>Comme j&#8217;ai l&#8217;intention me lancer en solo dans ce projet, la documentation et/ou les codes source de programmes d&#8217;échecs ne sont pas importants pour l&#8217;instant.  Il faut dire que je lis sur le sujet depuis bon nombre d&#8217;années et que mon but n&#8217;est pas de produire un clone de Crafty, de Médiocre ou de tout autre engin mais bien de réaliser <em>le mien</em>, qu&#8217;il joue bien ou pas!</p>
<p>Pour ceux qui aimeraient bénéficier d&#8217;un coup de main, la seule référence francophone que je connaisse est l&#8217;excellent papier de <a title="Programmes d'échecs de championnat" href="http://www.recherche.enac.fr/~weill/publications/phdJCW.ps.gz" target="_blank">Jean-Christophe Weill</a>.  Si toutefois vous pouvez lire l&#8217;anglais, il existe une multitude de programmes d&#8217;échecs dans à peu près tous les langages de programmation et la littérature sur le sujet est plus qu&#8217;abondante!</p>
<p>Si vous connaissez des blogues, des sites web ou des ouvrages en français sur le sujet, n&#8217;hésitez pas à m&#8217;en faire part pour que je puisse en faire profiter tous les lecteurs de ce blogue en les publiant!  La francophonie est grande et il est temps de nous connaître et de nous faire voir et lire!</p>
<p>Sur un tout autre sujet, je devrais bientôt terminer une série d&#8217;articles sérieux sur un sujet léger : comment résoudre une grille Sudoku en SQL!  Autres sujets à venir : beaucoup de Smalltalk et de bases de données en vue.  Et depuis 3-4 jours, il est clair que ce blogue traitera aussi beaucoup de programmes d&#8217;échecs&#8230; et d&#8217;un certain gnochon!</p>
<p>1. e4</p>
<p>Que répondras-tu Gnochon ?</p>
<br />Classé dans:<a href='http://endormitoire.wordpress.com/category/jeux/echecs/'>échecs</a>, <a href='http://endormitoire.wordpress.com/category/programmation/gnochon/'>Gnochon</a>, <a href='http://endormitoire.wordpress.com/category/smalltalk/pharo/'>Pharo</a>, <a href='http://endormitoire.wordpress.com/category/smalltalk/'>Smalltalk</a>, <a href='http://endormitoire.wordpress.com/category/bases-de-donnees/sql/'>SQL</a>, <a href='http://endormitoire.wordpress.com/category/smalltalk/squeak/'>Squeak</a>, <a href='http://endormitoire.wordpress.com/category/jeux/sudoku/'>sudoku</a> Tagged: <a href='http://endormitoire.wordpress.com/tag/echecs/'>échecs</a>, <a href='http://endormitoire.wordpress.com/tag/fen/'>FEN</a>, <a href='http://endormitoire.wordpress.com/tag/gnochon/'>Gnochon</a>, <a href='http://endormitoire.wordpress.com/tag/jean-christophe-weill/'>Jean-Christophe Weill</a>, <a href='http://endormitoire.wordpress.com/tag/jonathan-pettersson/'>Jonathan Pettersson</a>, <a href='http://endormitoire.wordpress.com/tag/lars-balzer/'>Lars Balzer</a>, <a href='http://endormitoire.wordpress.com/tag/mediocre/'>Mediocre</a>, <a href='http://endormitoire.wordpress.com/tag/pgn/'>PGN</a>, <a href='http://endormitoire.wordpress.com/tag/pharo/'>Pharo</a>, <a href='http://endormitoire.wordpress.com/tag/scid/'>Scid</a>, <a href='http://endormitoire.wordpress.com/tag/smalltalk/'>Smalltalk</a>, <a href='http://endormitoire.wordpress.com/tag/sql/'>SQL</a>, <a href='http://endormitoire.wordpress.com/tag/squeak/'>Squeak</a>, <a href='http://endormitoire.wordpress.com/tag/sudoku-2/'>Sudoku</a>, <a href='http://endormitoire.wordpress.com/tag/sunit/'>SUnit</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/endormitoire.wordpress.com/101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/endormitoire.wordpress.com/101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/endormitoire.wordpress.com/101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/endormitoire.wordpress.com/101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/endormitoire.wordpress.com/101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/endormitoire.wordpress.com/101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/endormitoire.wordpress.com/101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/endormitoire.wordpress.com/101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/endormitoire.wordpress.com/101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/endormitoire.wordpress.com/101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/endormitoire.wordpress.com/101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/endormitoire.wordpress.com/101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/endormitoire.wordpress.com/101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/endormitoire.wordpress.com/101/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=endormitoire.wordpress.com&amp;blog=14420825&amp;post=101&amp;subd=endormitoire&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://endormitoire.wordpress.com/2012/01/01/resolutions-du-nouvel-an/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/167178fdce6304d803372432a3052672?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">endormitoire</media:title>
		</media:content>
	</item>
		<item>
		<title>Préambule</title>
		<link>http://endormitoire.wordpress.com/2010/08/09/preambule/</link>
		<comments>http://endormitoire.wordpress.com/2010/08/09/preambule/#comments</comments>
		<pubDate>Mon, 09 Aug 2010 12:22:43 +0000</pubDate>
		<dc:creator>endormitoire</dc:creator>
				<category><![CDATA[échecs]]></category>
		<category><![CDATA[littérature]]></category>
		<category><![CDATA[mathématiques]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[Pharo]]></category>
		<category><![CDATA[Smalltalk]]></category>
		<category><![CDATA[Squeak]]></category>

		<guid isPermaLink="false">http://endormitoire.wordpress.com/?p=15</guid>
		<description><![CDATA[De quoi traite ce blogue? J&#8217;aborderai différents sujets, surtout reliés à l&#8217;informatique.  Comme mes intérets portent surtout sur Smalltalk et les technologies orientées-objet ainsi que sur les bases de données, vous entendrez souvent parler de Pharo, de Squeak et de MySQL.  J&#8217;y traiterai aussi de littérature, des échecs, de logiciels open source, de mathématiques, de [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=endormitoire.wordpress.com&amp;blog=14420825&amp;post=15&amp;subd=endormitoire&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong>De quoi traite ce blogue? </strong></p>
<p>J&#8217;aborderai différents sujets, surtout reliés à l&#8217;informatique.  Comme mes intérets portent surtout sur Smalltalk et les technologies orientées-objet ainsi que sur les bases de données, vous entendrez souvent parler de Pharo, de Squeak et de MySQL.  J&#8217;y traiterai aussi de littérature, des échecs, de logiciels open source, de mathématiques, de musique et d&#8217;une foule d&#8217;autres sujets.  Bref, je vous ferai part de mes découvertes!</p>
<p><strong>Pourquoi ce blogue?</strong></p>
<p>Parce que j&#8217;aime bien partager mes expériences avec les autres et surtout découvrir de nouvelles façons de faire et de nouvelles idées.  Ce blogue servira surtout à présenter des problèmes pratiques et des façons de résoudre ceux-ci.</p>
<p><strong>Pourquoi en français?</strong></p>
<p>Parce que, malheureusement, les ressources disponibles sur internet sont rarement en français.  Il est plus que temps d&#8217;y remédier et d&#8217;apporter mon infime contribution.  Aussi, il n&#8217;est pas donné à tous de comprendre et de lire l&#8217;anglais.</p>
<p><strong>Endormitoire?</strong></p>
<p>J&#8217;ai voulu apporter une touche à la fois francophone et bien québécoise à ce blogue.  Le nom du blogue vient du fait que 99% de mon entourage ne comprend rien (ou très peu) à ce que je fais et que j&#8217;ai souvent l&#8217;impression que mes histoires &#8220;informatiques&#8221;, &#8220;mathématiques&#8221; ou &#8220;littéraires&#8221; les ennuient à mourir.  Pour ceux qui ne le savent pas, &#8220;endormitoire&#8221; est une expression typiquement québécoise signifiant &#8220;une soudaine et grande envie de dormir&#8221;.</p>
<p>En espérant vous tenir bien éveillés chers lecteurs!</p>
<br />Classé dans:<a href='http://endormitoire.wordpress.com/category/jeux/echecs/'>échecs</a>, <a href='http://endormitoire.wordpress.com/category/litterature/'>littérature</a>, <a href='http://endormitoire.wordpress.com/category/mathematiques/'>mathématiques</a>, <a href='http://endormitoire.wordpress.com/category/bases-de-donnees/mysql/'>MySQL</a>, <a href='http://endormitoire.wordpress.com/category/open-source/'>open source</a>, <a href='http://endormitoire.wordpress.com/category/smalltalk/pharo/'>Pharo</a>, <a href='http://endormitoire.wordpress.com/category/smalltalk/'>Smalltalk</a>, <a href='http://endormitoire.wordpress.com/category/smalltalk/squeak/'>Squeak</a> Tagged: <a href='http://endormitoire.wordpress.com/tag/echecs/'>échecs</a>, <a href='http://endormitoire.wordpress.com/tag/litterature/'>littérature</a>, <a href='http://endormitoire.wordpress.com/tag/mathematiques/'>mathématiques</a>, <a href='http://endormitoire.wordpress.com/tag/mysql/'>MySQL</a>, <a href='http://endormitoire.wordpress.com/tag/pharo/'>Pharo</a>, <a href='http://endormitoire.wordpress.com/tag/smalltalk/'>Smalltalk</a>, <a href='http://endormitoire.wordpress.com/tag/squeak/'>Squeak</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/endormitoire.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/endormitoire.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/endormitoire.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/endormitoire.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/endormitoire.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/endormitoire.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/endormitoire.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/endormitoire.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/endormitoire.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/endormitoire.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/endormitoire.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/endormitoire.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/endormitoire.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/endormitoire.wordpress.com/15/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=endormitoire.wordpress.com&amp;blog=14420825&amp;post=15&amp;subd=endormitoire&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://endormitoire.wordpress.com/2010/08/09/preambule/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/167178fdce6304d803372432a3052672?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">endormitoire</media:title>
		</media:content>
	</item>
	</channel>
</rss>
