{"id":375,"date":"2012-03-26T00:00:59","date_gmt":"2012-03-26T00:00:59","guid":{"rendered":"http:\/\/www.sqlserver.fr\/blog\/?p=375"},"modified":"2026-05-02T14:31:15","modified_gmt":"2026-05-02T12:31:15","slug":"forcage-de-parcours-dindex","status":"publish","type":"post","link":"https:\/\/www.sqlserver.fr\/blog\/forcage-de-parcours-dindex\/","title":{"rendered":"For\u00e7age de parcours d&rsquo;index"},"content":{"rendered":"<p>SQL Server 2008 a quelque peu facilit\u00e9 le contr\u00f4le des plans d\u2019ex\u00e9cutions de requ\u00eates gr\u00e2ce au \u00ab conseil \u00bb FORCESEEK. Ce mot cl\u00e9 permet d\u2019indiquer au moteur que l\u2019on souhaite utiliser pleinement la structure des index pour aller chercher les donn\u00e9es, au lieu de parcourir l\u2019ensemble de la table.<\/p>\n<p>SQL Server 2012 apporte d\u00e9sormais le mot cl\u00e9 sym\u00e9trique, FORCESCAN, qui permet d\u2019indiquer au moteur qu\u2019il n\u2019est pas question d\u2019aller chercher les \u00e9l\u00e9ments un par un, mais qu\u2019il est, selon l\u2019avis du d\u00e9veloppeur en tout cas, pr\u00e9f\u00e9rable de parcourir l\u2019ensemble de la table.<!--more--><\/p>\n<p>Tout d\u2019abord, revenons bri\u00e8vement sur ce que sont un SEEK et un SCAN. Pour cela, au final, le plus simple est de s\u2019appuyer sur les ic\u00f4nes repr\u00e9sentant ces op\u00e9rations dans un plan d\u2019ex\u00e9cution.<\/p>\n<p>Dans un premier temps, l\u2019Index Scan (<a href=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2012\/03\/image0012.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-376\" title=\"image001\" src=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2012\/03\/image0012.png\" alt=\"\" width=\"31\" height=\"28\" \/><\/a>) consiste \u00e0 commencer \u00e0 la premi\u00e8re page de niveau feuille de l\u2019index, et ensuite \u00e0 parcourir l\u2019ensemble des donn\u00e9es, de page en page suivante, jusqu\u2019au bout de l\u2019ensemble de donn\u00e9es.<\/p>\n<p>L\u2019Index Seek (<a href=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2012\/03\/image0022.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-377\" title=\"image002\" src=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2012\/03\/image0022.png\" alt=\"\" width=\"32\" height=\"31\" \/><\/a>), quant \u00e0 lui, exploite pleinement l\u2019arbre B de l\u2019index et atteint directement le ou les enregistrements recherch\u00e9s, \u00e0 partir du pr\u00e9dicat de recherche qui correspond \u00e0 la cl\u00e9 de l\u2019index (ou au moins \u00e0 son d\u00e9but).<\/p>\n<p>Ce nouvel hint, FORCESCAN, peut donc forcer un plan d\u2019ex\u00e9cution \u00e0 utiliser un scan, l\u00e0 o\u00f9 le moteur choisirait \u00e9ventuellement un Seek.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"sql\">USE tempdb\r\nSET NOCOUNT ON\r\nCREATE TABLE TableTest (Id int PRIMARY KEY, Valeur varchar(Max))\r\nGO\r\nINSERT INTO TableTest (Id, Valeur) select isnull(Max(Id),0)+1,convert(varchar(max),isnull(Max(Id),0)+1) FROM TableTest\r\nGO 100000<\/pre>\n<p style=\"text-align: center;\"><a href=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2012\/03\/image0033.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-378 aligncenter\" title=\"image003\" src=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2012\/03\/image0033.png\" alt=\"\" width=\"418\" height=\"118\" srcset=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2012\/03\/image0033.png 418w, https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2012\/03\/image0033-300x84.png 300w\" sizes=\"auto, (max-width: 418px) 100vw, 418px\" \/><\/a><\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2012\/03\/image0042.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-379 aligncenter\" title=\"image004\" src=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2012\/03\/image0042.png\" alt=\"\" width=\"460\" height=\"120\" srcset=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2012\/03\/image0042.png 460w, https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2012\/03\/image0042-300x78.png 300w\" sizes=\"auto, (max-width: 460px) 100vw, 460px\" \/><\/a><\/p>\n<p>Bien s\u00fbr, sur cet exemple, je tairai le comparatif des performances dans ce cas d\u2019\u00e9cole.<\/p>\n<p>Mais dans des cas de statistiques ne refl\u00e9tant pas certaines particularit\u00e9s de r\u00e9partition des donn\u00e9es, il est tout \u00e0 fait possible que ce mot-cl\u00e9 puisse am\u00e9liorer les performances d\u2019une requ\u00eate particuli\u00e8re\u2026<\/p>\n","protected":false},"excerpt":{"rendered":"<p>SQL Server 2008 a quelque peu facilit\u00e9 le contr\u00f4le des plans d\u2019ex\u00e9cutions de requ\u00eates gr\u00e2ce au \u00ab conseil \u00bb FORCESEEK. Ce mot cl\u00e9 permet d\u2019indiquer au moteur que l\u2019on souhaite utiliser pleinement la structure des index pour aller chercher les &hellip; <a href=\"https:\/\/www.sqlserver.fr\/blog\/forcage-de-parcours-dindex\/\">Continuer la lecture <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":7,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-375","post","type-post","status-publish","format-standard","hentry","category-article_sql"],"_links":{"self":[{"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/posts\/375","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/comments?post=375"}],"version-history":[{"count":11,"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/posts\/375\/revisions"}],"predecessor-version":[{"id":1957,"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/posts\/375\/revisions\/1957"}],"wp:attachment":[{"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/media?parent=375"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/categories?post=375"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/tags?post=375"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}