{"id":639,"date":"2012-07-30T00:00:15","date_gmt":"2012-07-29T22:00:15","guid":{"rendered":"http:\/\/www.sqlserver.fr\/blog\/?p=639"},"modified":"2012-07-25T00:52:28","modified_gmt":"2012-07-24T22:52:28","slug":"doublons-dindex","status":"publish","type":"post","link":"https:\/\/www.sqlserver.fr\/blog\/doublons-dindex\/","title":{"rendered":"Doublons d&rsquo;index"},"content":{"rendered":"<p>Sous SQL Server, les index permettent d&rsquo;optimiser l&rsquo;acc\u00e8s aux donn\u00e9es, notamment dans le contexte des lectures.<\/p>\n<p>N\u00e9anmoins, il ne faut pas en abuser, car il sont maintenus \u00e0 jour en mode synchrone lors des op\u00e9rations de modification de donn\u00e9es (ajout \/ suppression \/ modification). Il convient notament de v\u00e9rifier qu&rsquo;il n&rsquo;y a pas de doublons d&rsquo;index ce qui comprend notamment les cas d&rsquo;index \u00e0 plusieurs colonnes dont la ou les premi\u00e8res constituent d\u00e9j\u00e0 la d\u00e9finition d&rsquo;un autre index.<!--more--><\/p>\n<p>Voici donc un script permettant de d\u00e9tecter ce genre de situations, p\u00e9nalisantes pour les \u00e9critures et n&rsquo;apportant quasiment aucune am\u00e9lioration aux lectures.<\/p>\n<pre class=\"brush: sql; gutter: false; first-line: 1\">-- Liste des doublons d'index\r\n-- Auteur : Jean-Nicolas BERGER (www.sqlserver.fr)\r\n\r\n-- Declaration des variables\r\ndeclare @Index table (object_id int, index_id int, name sysname, colonnes varchar(max) DEFAULT '')\r\n\r\ndeclare @id1 int, @id2 int, @id3 int\r\n\r\n-- Initialisation\r\ninsert into @Index (object_id,index_id,name)\r\n\tselect i.object_id,i.index_id,i.name\r\n\tfrom sys.indexes i\r\n\twhere index_id&gt;0\r\n\r\n-- Liste des colonnes des index\r\nDECLARE ind CURSOR FOR \r\nSELECT ic.object_id,ic.index_id,ic.column_id\r\nFROM sys.index_columns ic\r\nwhere key_ordinal&gt;0\r\norder by ic.key_ordinal\r\n\r\nOPEN ind\r\nFETCH NEXT FROM ind INTO @id1,@id2,@id3\r\n\r\nWHILE @@FETCH_STATUS = 0\r\nBEGIN\r\n\r\n\tupdate @Index\r\n\tset colonnes+=convert(varchar(max),@id3)+','\r\n\twhere object_id=@id1 and index_id=@id2\r\n\r\n\tFETCH NEXT FROM ind INTO @id1,@id2,@id3\r\nEND\r\n\r\nCLOSE ind\r\nDEALLOCATE ind\r\n\r\n-- D\u00e9tection des doublons\r\nselect distinct QUOTENAME(s.name)+'.'+QUOTENAME(t.name) as [Table], \r\n                QUOTENAME(contenant.name) as [Index contenant], \r\n                QUOTENAME(contenu.name) as [Index contenu] \r\nfrom @Index contenant\r\njoin @Index contenu on contenant.object_id=contenu.object_id\r\n\t\t\t\t\tand contenant.index_id&lt;&gt;contenu.index_id\r\n\t\t\t\t\tand contenant.colonnes like contenu.colonnes+'%'\r\njoin sys.tables t on t.object_id=contenu.object_id\r\njoin sys.schemas s on s.schema_id=t.schema_id<\/pre>\n<p>A noter que ce script ne s&rsquo;occupe que des index \u00ab\u00a0standards\u00a0\u00bb (pas des index XML, g\u00e9o-spatiaux, &#8230;), et ne consid\u00e8re que les colonnes de tri des index, sans prendre en compte les colonnes incluses ni les filtres.<\/p>\n<p>J&rsquo;esp\u00e8re qu&rsquo;il vous sera utile autant qu&rsquo;il me l&rsquo;a \u00e9t\u00e9&#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Sous SQL Server, les index permettent d&rsquo;optimiser l&rsquo;acc\u00e8s aux donn\u00e9es, notamment dans le contexte des lectures. N\u00e9anmoins, il ne faut pas en abuser, car il sont maintenus \u00e0 jour en mode synchrone lors des op\u00e9rations de modification de donn\u00e9es (ajout &hellip; <a href=\"https:\/\/www.sqlserver.fr\/blog\/doublons-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":[5],"tags":[],"class_list":["post-639","post","type-post","status-publish","format-standard","hentry","category-outils"],"_links":{"self":[{"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/posts\/639","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=639"}],"version-history":[{"count":4,"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/posts\/639\/revisions"}],"predecessor-version":[{"id":654,"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/posts\/639\/revisions\/654"}],"wp:attachment":[{"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/media?parent=639"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/categories?post=639"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/tags?post=639"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}