<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Optimiseur on Rudi Bruchez</title><link>https://www.pachadata.com/tags/optimiseur/</link><description>Recent content in Optimiseur on Rudi Bruchez</description><generator>Hugo</generator><language>fr</language><lastBuildDate>Tue, 20 Oct 2026 08:22:24 +0200</lastBuildDate><atom:link href="https://www.pachadata.com/tags/optimiseur/index.xml" rel="self" type="application/rss+xml"/><item><title>Les statistiques de chaîne de SQL Server</title><link>https://www.pachadata.com/docs/articles/sqlserver/performances/statistiques-de-chaines/</link><pubDate>Tue, 20 Oct 2026 00:00:00 +0000</pubDate><guid>https://www.pachadata.com/docs/articles/sqlserver/performances/statistiques-de-chaines/</guid><description>&lt;p&gt;&lt;em&gt;Article coécrit avec Claude, qui a mené une grande partie des tests et des recherches.&lt;/em&gt;&lt;/p&gt;&#10;&lt;div class="alert alert-success" role="alert"&gt;&lt;div class="h4 alert-heading" role="heading"&gt;TL;DR&lt;/div&gt;&#10;&lt;p&gt;Les statistiques de chaîne (&lt;em&gt;string statistics&lt;/em&gt; en anglais) existent dans SQL Server depuis la version 2005. Elles servent à estimer la cardinalité des recherches avec &lt;code&gt;LIKE&lt;/code&gt;, par exemple &lt;code&gt;Email LIKE '%.org'&lt;/code&gt;. Quand la première colonne d&amp;rsquo;une statistique est de type caractère, c&amp;rsquo;est-à-dire &lt;code&gt;char&lt;/code&gt;, &lt;code&gt;varchar&lt;/code&gt;, &lt;code&gt;nchar&lt;/code&gt; ou &lt;code&gt;nvarchar&lt;/code&gt;, y compris &lt;code&gt;varchar(max)&lt;/code&gt;, &lt;code&gt;nvarchar(max)&lt;/code&gt;, &lt;code&gt;text&lt;/code&gt; et &lt;code&gt;ntext&lt;/code&gt;, la statistique contient, en plus de l&amp;rsquo;histogramme, un résumé de chaîne. Vous le voyez dans &lt;code&gt;DBCC SHOW_STATISTICS&lt;/code&gt;, à la propriété &lt;code&gt;String Index&lt;/code&gt;, qui vaut alors &lt;code&gt;YES&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;Ce résumé est un échantillon des valeurs de la colonne, pris à intervalle régulier dans l&amp;rsquo;ordre de tri. Sa taille vaut 5 % des lignes lues par la statistique, plus 10 ; en &lt;code&gt;FULLSCAN&lt;/code&gt;, 5 % des lignes de la table : 510 chaînes pour 10 000 lignes, 2 510 pour 50 000. Mais, à partir de 56 000 lignes lues environ, elle ne grandit plus et reste vers 2 800 chaînes, quelle que soit la taille de la table, et moins encore pour les &lt;code&gt;nvarchar&lt;/code&gt; et les chaînes longues. Les chaînes sont rangées dans un &lt;a href="https://fr.wikipedia.org/wiki/Trie_%28informatique%29"&gt;trie&lt;/a&gt; (arbre préfixe) : chaque nœud contient un morceau de chaîne, et les chaînes qui commencent de la même façon partagent les nœuds de ce début.&lt;/p&gt;&#10;&lt;p&gt;Pour estimer un &lt;code&gt;LIKE&lt;/code&gt; à jokers, l&amp;rsquo;optimiseur applique le motif à chaque chaîne de l&amp;rsquo;échantillon, puis multiplie la proportion trouvée par le nombre de lignes de la table. Quand aucune chaîne de l&amp;rsquo;échantillon ne satisfait le motif, la proportion vaudrait zéro, et l&amp;rsquo;estimation aussi. L&amp;rsquo;optimiseur fait alors comme si un dixième de chaîne le satisfaisait : sur le million de lignes de &lt;code&gt;Contact.ProspectUS&lt;/code&gt;, dont l&amp;rsquo;échantillon compte 2 825 chaînes, un motif introuvable dans l&amp;rsquo;échantillon est estimé à 1 000 000 × 0,1 / 2 825, soit 35,4 lignes. C&amp;rsquo;est le plancher de l&amp;rsquo;estimation.&lt;/p&gt;&#10;&lt;p&gt;Les motifs fréquents sont correctement estimés, et les motifs rares sont estimés avec une valeur plancher, environ le nombre de lignes divisé par 28 000. Le résumé n&amp;rsquo;est pas utilisé pour estimer la cardinalité quand la colonne est passée dans une expression, comme un appel de fonction, que le motif utilise &lt;code&gt;ESCAPE&lt;/code&gt;, vient d&amp;rsquo;une variable locale ou est de type &lt;code&gt;nvarchar&lt;/code&gt; face à une colonne &lt;code&gt;varchar&lt;/code&gt; (donc conversion implicite), ou que la colonne est un &lt;code&gt;varchar&lt;/code&gt; en collation UTF-8. Dans ces cas, un motif qui commence par un joker est estimé à 9 % du nombre de lignes de la table, et un préfixe est estimé par l&amp;rsquo;histogramme. Au-delà de 80 caractères, seuls les 40 premiers et les 40 derniers sont conservés, mis bout à bout.&lt;/p&gt;&#10;&lt;/div&gt;</description></item></channel></rss>