{"id":3950,"date":"2013-06-18T15:46:20","date_gmt":"2013-06-18T14:46:20","guid":{"rendered":"http:\/\/blog.capdata.fr\/?p=3950"},"modified":"2019-09-13T14:05:03","modified_gmt":"2019-09-13T13:05:03","slug":"oracle-et-sql-server-la-fragmentation","status":"publish","type":"post","link":"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-la-fragmentation\/","title":{"rendered":"Oracle et SQL Server: La Fragmentation"},"content":{"rendered":"<a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-twitter nolightbox\" data-provider=\"twitter\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Twitter\" href=\"https:\/\/twitter.com\/intent\/tweet?url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F3950&#038;text=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"twitter\" title=\"Share on Twitter\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/twitter.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-linkedin nolightbox\" data-provider=\"linkedin\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Linkedin\" href=\"https:\/\/www.linkedin.com\/shareArticle?mini=true&#038;url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F3950&#038;title=Oracle%20et%20SQL%20Server%3A%20La%20Fragmentation\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"linkedin\" title=\"Share on Linkedin\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/linkedin.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-mail nolightbox\" data-provider=\"mail\" rel=\"nofollow\" title=\"Share by email\" href=\"mailto:?subject=Oracle%20et%20SQL%20Server%3A%20La%20Fragmentation&#038;body=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20:%20https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F3950\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"mail\" title=\"Share by email\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/mail.png\" \/><\/a><p>Si les m\u00e9canismes vus pr\u00e9c\u00e9demment dans la s\u00e9rie sont\u00a0relativement similaires, la fragmentation est per\u00e7ue et g\u00e9r\u00e9e de mani\u00e8re radicalement diff\u00e9rente entre SQL Server et Oracle.<\/p>\n<p>&nbsp;<\/p>\n<h2>Qu&#8217;est-ce que la fragmentation ?<\/h2>\n<p>On parle d&#8217;une fragmentation, mais il existe deux \u00a0fragmentations sur les objets de bases de donn\u00e9es relationnelles.<\/p>\n<h3>La fragmentation &#8220;externe&#8221;<\/h3>\n<p>Lorsqu&#8217;un ensemble de donn\u00e9es est lu sur un disque dur &#8220;\u00e0 plateaux&#8221;, cette lecture est infiniment plus rapide lorsque les donn\u00e9es sont positionn\u00e9es physiquement les unes \u00e0 la suite des autres (on parle de donn\u00e9es contigu\u00ebs). Ceci tient au fait que la t\u00eate de lecture du disque ne doit pas se d\u00e9placer apr\u00e8s chaque donn\u00e9e lue. Lorsque les donn\u00e9es ne sont pas contigu\u00ebs, on parle de fragmentation externe.<\/p>\n<p>Lorsqu&#8217;une table (ou un indexe) est fragment\u00e9e, sa lecture depuis le disque est donc plus lente que s&#8217;il ne l&#8217;\u00e9tait pas. Potentiellement beaucoup plus lente&#8230;<\/p>\n<h3>\u00a0 La fragmentation &#8220;interne&#8221;<\/h3>\n<p>Ce ph\u00e9nom\u00e8ne se produit lorsque les blocs (ou pages) de donn\u00e9es ne sont pas compl\u00e8tement remplis. L&#8217;objet occupe plus de place que n\u00e9cessaire, \u00a0parcourir l&#8217;objet est donc plus co\u00fbteux en terme d&#8217;op\u00e9rations (sur disque ou en m\u00e9moire).<\/p>\n<p>&nbsp;<\/p>\n<h2>R\u00e9duire la fragmentation<\/h2>\n<p>Cette op\u00e9ration permettra de r\u00e9duire le volume de donn\u00e9es brass\u00e9es pour un objet (table ou indexe), et de r\u00e9duire le temps de ces op\u00e9rations sur disque.<\/p>\n<p>Elle consiste \u00e0<\/p>\n<ul>\n<li>compacter les donn\u00e9es pour que les pages soient remplies<\/li>\n<li>d\u00e9placer certaines pages utilis\u00e9es pour r\u00e9tablir la contiguit\u00e9<\/li>\n<li>Supprimer les pages vides<\/li>\n<\/ul>\n<p>On parle alors de r\u00e9organisation<\/p>\n<p>&nbsp;<\/p>\n<h2><span style=\"color: #ff0000;\">Pourquoi la r\u00e9organisation est elle syst\u00e9matis\u00e9e sur SQL Server, alors qu&#8217;elle n&#8217;est effectu\u00e9e que de mani\u00e8re exceptionnelle sur Oracle ?<\/span><\/h2>\n<p>Ceci tient \u00e0 l&#8217;existence d&#8217;un objet sur la quasi totalit\u00e9 des tables SQL Server: L&#8217;indexe Clusteris\u00e9<\/p>\n<p>&nbsp;<\/p>\n<p>Pour bien comprendre en quoi l&#8217;indexe clusteris\u00e9 influence la fragmentation, voici quelques rappels sur l&#8217;organisation des tables et indexes, et sur la r\u00e9allocation des pages.<\/p>\n<h3>L&#8217;organisation d&#8217;une table<\/h3>\n<p>Une table &#8220;classique&#8221; suit une organisation dite &#8220;Heap&#8221;. Les donn\u00e9es ins\u00e9r\u00e9es sont ajout\u00e9es &#8220;en tas&#8221; \u00e0 la table, sans aucune notion de classement. S&#8217;il n&#8217;existe pas d&#8217;espace disponible dans les pages allou\u00e9es, le moteur en alloue de nouvelles. S&#8217;il existe de l&#8217;espace disponible (parce que des donn\u00e9es ont \u00e9t\u00e9 supprim\u00e9es par exemple), le moteur sait r\u00e9utiliser les pages libres.<\/p>\n<p>L&#8217;exemple suivant, sur SQL Server, illustre ce concept de r\u00e9utilisation d&#8217;espace libre.<\/p>\n<pre name=\"code\" class=\"sql\">--Cr\u00e9ation d'une table de 4000 octets par ligne (4o pour la colonne INT, 3989 pour la colonne char, et 7 pour le descripteur de ligne)\r\nCREATE TABLE TEST_FRAG(ID int identity PRIMARY KEY NONCLUSTERED, COL char(3989) DEFAULT ' ')\r\nGO\r\n--Ajout de 1000 lignes dans cette table\r\nINSERT INTO TEST_FRAG DEFAULT VALUES\r\nGO 1000\r\n--On regarde le nombre de pages de la table\r\nselect I.type_desc,total_pages\r\nfrom sys.allocation_units AU\r\ninner join sys.partitions P ON P.hobt_id = AU.container_id\r\ninner join sys.indexes I ON (I.object_id =P.object_id AND I.index_id = P.index_id)\r\nWHERE P.object_id = OBJECT_ID('TEST_FRAG')\r\n\/*\r\ntype_desc total_pages\r\n------------------------------------------------------------ --------------------\r\nHEAP 505\r\nNONCLUSTERED 5\r\n*\/\r\nGO\r\n--Les 10 premi\u00e8res lignes de la table (donc les 5 premi\u00e8res pages) sont bien les 10 premi\u00e8res ins\u00e9r\u00e9es.\r\nselect top 10 * FROM TEST_FRAG\r\n\/*\r\nID\r\n1\r\n2\r\n3\r\n4\r\n5\r\n6\r\n7\r\n8\r\n9\r\n10\r\n*\/\r\nGO\r\n--Suppression de la moiti\u00e9 des lignes (celles correspondant \u00e0 un ID pair)\r\ndelete FROM TEST_FRAG WHERE ID%2=0\r\nGO\r\n--Le nombre de pages n'a pas baiss\u00e9.\r\nselect I.type_desc,total_pages\r\nfrom sys.allocation_units AU\r\ninner join sys.partitions P ON P.hobt_id = AU.container_id\r\ninner join sys.indexes I ON (I.object_id =P.object_id AND I.index_id = P.index_id)\r\nWHERE P.object_id = OBJECT_ID('TEST_FRAG')\r\nGO\r\n\/*\r\ntype_desc total_pages\r\n------------------------------------------------------------ --------------------\r\nHEAP 505\r\nNONCLUSTERED 5\r\n*\/\r\n\r\n--On ins\u00e8re de nouveau 500 lignes dans la table\r\nINSERT INTO TEST_FRAG DEFAULT VALUES\r\nGO 500\r\n\r\n--Nouveau coup d'oeil \u00e0 l'occupation de l'objet, pas de nouvelle allocation de page sur la table, et une nouvelle page sur l'indexe\r\nselect I.type_desc,total_pages\r\nfrom sys.allocation_units AU\r\ninner join sys.partitions P ON P.hobt_id = AU.container_id\r\ninner join sys.indexes I ON (I.object_id =P.object_id AND I.index_id = P.index_id)\r\nWHERE P.object_id = OBJECT_ID('TEST_FRAG')\r\n\/*\r\ntype_desc total_pages\r\n------------------------------------------------------------ --------------------\r\nHEAP 505\r\nNONCLUSTERED 6\r\n*\/\r\nGO\r\n--On constate que les nouvelles donn\u00e9es se sont intercal\u00e9es avec les 10 premi\u00e8res lignes de la table (donc les 5 premi\u00e8res pages).\r\nselect top 10 * FROM TEST_FRAG\r\n\/*\r\nID\r\n1\r\n1002\r\n3\r\n1004\r\n5\r\n1006\r\n7\r\n1008\r\n9\r\n1010\r\n*\/\r\nGO\r\nDROP TABLE TEST_FRAG\r\nGO<\/pre>\n<p>Lorsqu&#8217;il existe un indexe Clusteris\u00e9 sur SQL Server, ou que la table suit l&#8217;organisation Index Organized sur Oracle, cette r\u00e9utilisation d&#8217;espace ne peut s&#8217;effectuer puisque (par d\u00e9finition) les donn\u00e9es doivent \u00eatre physiquement tri\u00e9es selon la cl\u00e9 de l&#8217;indexe.L&#8217;espace libre d&#8217;une page ne pourra donc pas(sauf cas exceptionnels) \u00eatre allou\u00e9 \u00e0 une nouvelle ligne.<\/p>\n<p>Concr\u00e8tement, dans ce type d&#8217;organisation de table, si des donn\u00e9es sont r\u00e9guli\u00e8rement supprim\u00e9es de mani\u00e8re &#8220;al\u00e9atoire&#8221;, la fragmentation interne peut \u00eatre tr\u00e8s grande.<\/p>\n<p>L&#8217;exemple suivant correspond \u00e0 l&#8217;exemple pr\u00e9c\u00e9dent, mais la cl\u00e9 primaire est maintenant un indexe clusteris\u00e9&#8230;<\/p>\n<pre name=\"code\" class=\"sql\">\r\n--Cr\u00e9ation d'une table de 4000 octets par ligne (4o pour la colonne INT, 3989 pour la colonne char, et 7 pour le descripteur de ligne)\r\nCREATE TABLE TEST_FRAG_CLUSTERED(ID int identity PRIMARY KEY CLUSTERED, COL char(3989) DEFAULT ' ')\r\nGO\r\n--Ajout de 1000 lignes dans cette table\r\nINSERT INTO TEST_FRAG_CLUSTERED DEFAULT VALUES\r\nGO 1000\r\n--On regarde le nombre de pages de la table\r\nselect I.type_desc,total_pages\r\nfrom sys.allocation_units AU\r\ninner join sys.partitions P ON P.hobt_id = AU.container_id\r\ninner join sys.indexes I ON (I.object_id =P.object_id AND I.index_id = P.index_id)\r\nWHERE P.object_id = OBJECT_ID('TEST_FRAG_CLUSTERED')\r\n\/*\r\ntype_desc total_pages\r\n------------------------------------------------------------ --------------------\r\nCLUSTERED 505\r\n*\/\r\nGO\r\n--On regarde l'indexe:\r\nselect index_depth,index_level,page_count from sys.dm_db_index_physical_stats(DB_ID(),OBJECT_ID('TEST_FRAG_CLUSTERED'),1,0,'DETAILED')\r\n\/*\r\nindex_depth index_level page_count\r\n----------- ----------- --------------------\r\n2 0 500\r\n2 1 1\r\n*\/\r\n--Les 10 premi\u00e8res lignes de la table (donc les 5 premi\u00e8res pages) sont bien les 10 premi\u00e8res ins\u00e9r\u00e9es.\r\nselect top 10 * FROM TEST_FRAG_CLUSTERED\r\n\/*\r\nID\r\n1\r\n2\r\n3\r\n4\r\n5\r\n6\r\n7\r\n8\r\n9\r\n10\r\n*\/\r\nGO\r\n--Suppression de la moiti\u00e9 des lignes (celles correspondant \u00e0 un ID pair)\r\ndelete FROM TEST_FRAG_CLUSTERED WHERE ID%2=0\r\nGO\r\n--Le nombre de pages n'a pas baiss\u00e9.\r\nselect I.type_desc,total_pages\r\nfrom sys.allocation_units AU\r\ninner join sys.partitions P ON P.hobt_id = AU.container_id\r\ninner join sys.indexes I ON (I.object_id =P.object_id AND I.index_id = P.index_id)\r\nWHERE P.object_id = OBJECT_ID('TEST_FRAG_CLUSTERED')\r\nGO\r\n\/*\r\ntype_desc total_pages\r\n------------------------------------------------------------ --------------------\r\nCLUSTERED 505\r\n*\/\r\n\r\n--On ins\u00e8re de nouveau 500 lignes dans la table\r\nINSERT INTO TEST_FRAG_CLUSTERED DEFAULT VALUES\r\nGO 500\r\n\r\n--Nouveau coup d'oeil \u00e0 l'occupation de l'objet, 256 nouvelles pages ont \u00e9t\u00e9 allou\u00e9es (254 pour les donn\u00e9es de la table, et 2 pour les branches de l'indexe)\r\nselect I.type_desc,total_pages\r\nfrom sys.allocation_units AU\r\ninner join sys.partitions P ON P.hobt_id = AU.container_id\r\ninner join sys.indexes I ON (I.object_id =P.object_id AND I.index_id = P.index_id)\r\nWHERE P.object_id = OBJECT_ID('TEST_FRAG_CLUSTERED')\r\n\/*\r\ntype_desc total_pages\r\n------------------------------------------------------------ --------------------\r\nCLUSTERED 761\r\n*\/\r\n-- L'indexe a grossi, puisque la page de racine ne peut adresser seule les 750 pages de donn\u00e9es\r\nselect index_depth,index_level,page_count from sys.dm_db_index_physical_stats(DB_ID(),OBJECT_ID('TEST_FRAG_CLUSTERED'),1,0,'DETAILED')\r\n\/*\r\nindex_depth index_level page_count\r\n----------- ----------- --------------------\r\n3 0 750\r\n3 1 2\r\n3 2 1\r\n*\/\r\nGO\r\n--bien entendu, les donn\u00e9es sont rest\u00e9es tri\u00e9es...\r\nselect top 10 * FROM TEST_FRAG_CLUSTERED\r\n\/*\r\nID\r\n1\r\n3\r\n5\r\n7\r\n9\r\n11\r\n13\r\n15\r\n17\r\n19\r\n*\/\r\nGO\r\n--La reconstruction de l'indexe permet de r\u00e9duire le nombre de pages allou\u00e9es\r\nALTER INDEX ALL ON TEST_FRAG_CLUSTERED REBUILD\r\nGO\r\nselect index_depth,index_level,page_count from sys.dm_db_index_physical_stats(DB_ID(),OBJECT_ID('TEST_FRAG_CLUSTERED'),1,0,'DETAILED')\r\n\/*\r\nindex_depth index_level page_count\r\n----------- ----------- --------------------\r\n2 0 501\r\n2 1 1\r\n*\/\r\nGO\r\nDROP TABLE TEST_FRAG_CLUSTERED\r\nGO<\/pre>\n<p>&nbsp;<\/p>\n<p>Sur SQL Server, lorsqu&#8217;une cl\u00e9 primaire est cr\u00e9e, celle-ci correspond par d\u00e9faut \u00e0 un indexe clusteris\u00e9. Et comme la normalisation d&#8217;un mod\u00e8le de donn\u00e9es impose l&#8217;utilisation syst\u00e9matique d&#8217;une cl\u00e9 primaire, la quasi totalit\u00e9 des tables d&#8217;une base SQL Server aura un indexe clusteris\u00e9.<\/p>\n<h2>Donc, par d\u00e9faut, les tables qui voient leur donn\u00e9es modifi\u00e9es sur SQL Server se fragmentent avec le temps, et les tables sur Oracle restent en g\u00e9n\u00e9ral non fragment\u00e9es.<\/h2>\n<p>&nbsp;<\/p>\n<h3>L&#8217;organisation d&#8217;un indexe<\/h3>\n<p>L&#8217;indexe classique sur Oracle et SQL Server suit une organisation dite &#8220;Balanced Tree&#8221;. Un indexe est toujours \u00e9quilibr\u00e9, c&#8217;est \u00e0 dire que sa profondeur (le nombre de pages \u00e0 brasser depuis la racine jusqu&#8217;aux feuilles) est la m\u00eame quelque soit la valeur de la cl\u00e9.<\/p>\n<p>Afin de maintenir cet \u00e9quilibre tout en pr\u00e9servant l&#8217;ordre des valeurs de cl\u00e9, les moteurs ont recours au m\u00e9canisme de &#8220;Page Split&#8221; lors d&#8217;insertions ou modifications de donn\u00e9es. En deux mots, lorsqu&#8217;une page d&#8217;indexe d\u00e9j\u00e0 pleine doit contenir une nouvelle entr\u00e9e:<\/p>\n<ul>\n<li>la page est s\u00e9par\u00e9e\u00a0en deux moiti\u00e9s \u00e9galement remplies lorsque la valeur ins\u00e9r\u00e9e n&#8217;est pas la plus grande valeur (on parle de split 50\/50, et les deux pages sont \u00e0 moiti\u00e9 vides)<\/li>\n<li>ou une nouvelle page est cr\u00e9\u00e9e contenant uniquement la nouvelle valeur et la plus haute ancienne valeur lorsque la nouvelle valeur est \u00a0 la plus grande (on parle alors de split 90\/10, l&#8217;ancienne page est presque pleine alors que la nouvelle est presque vide).<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>Les r\u00e9f\u00e9rences aux donn\u00e9es dans l&#8217;indexe sont toujours tri\u00e9es selon la cl\u00e9 de l&#8217;indexe. L&#8217;espace libre dans une page ne peut donc pas \u00eatre r\u00e9utilis\u00e9 par d\u00e9faut. A noter que lorsqu&#8217;une page est compl\u00e8tement vid\u00e9e, elle n&#8217;est pas d\u00e9sallou\u00e9e et pourra \u00eatre r\u00e9utilis\u00e9e par le moteur (il s&#8217;agit des fameuses Deleted Leafs d&#8217; indexe sur Oracle).<\/p>\n<p>Lorsqu&#8217;une table est tr\u00e8s fortement modifi\u00e9e, ses indexes peuvent avoir subit beaucoup de Page Splits et poss\u00e9der un grand nombre de pages vides non d\u00e9sallou\u00e9es. La profondeur de chaque indexe peut donc \u00eatre plus grande que sa valeur optimale et l&#8217;indexe peut occuper plus de place que n\u00e9cessaire.<\/p>\n<p>Pour un indexe classique, la perte de performance li\u00e9e \u00e0 la fragmentation d&#8217;un indexe est a priori tr\u00e8s faible.<\/p>\n<ul>\n<li>Un indexe n&#8217;occupe qu&#8217;exceptionnellement plus de quelques centaines de m\u00e9ga octets, il r\u00e9sidera donc tr\u00e8s souvent dans le Buffer Pool<\/li>\n<li>Lorsque la profondeur de l&#8217;indexe est plus grande que sa valeur optimale, elle ne d\u00e9passera qu&#8217;exceptionnellement \u00a0de 2 cette valeur. Une recherche dans un indexe fragment\u00e9 consistera donc \u00e0 deux acc\u00e8s en m\u00e9moire de plus que pour un indexe non fragment\u00e9.<\/li>\n<\/ul>\n<div>Mais lorsque l&#8217;indexe est un indexe clusteris\u00e9, les choses sont diff\u00e9rentes:<\/div>\n<div>\n<ul>\n<li>L&#8217;indexe peut \u00eatre tr\u00e8s grand, puisqu&#8217;il contient les pages de donn\u00e9es<\/li>\n<li>Une \u00a0recherche dans un indexe non clusteris\u00e9 sera syst\u00e9matiquement suivie d&#8217;une recherche dans l&#8217;indexe clusteris\u00e9 lorsqu&#8217;il est n\u00e9cessaire de lire la ligne de la table correspondante. Le surco\u00fbt d\u00fb \u00e0 la profondeur trop grande sera donc \u00e0 payer plus souvent.<\/li>\n<\/ul>\n<\/div>\n<p>&nbsp;<\/p>\n<h2>La perte de performance li\u00e9e \u00e0 une forte fragmentation est donc g\u00e9n\u00e9ralement plus grande sur SQL Server que sur Oracle.<\/h2>\n<p>&nbsp;<\/p>\n<h2>\u00a0R\u00e9organisation<\/h2>\n<p>Les m\u00e9canismes de r\u00e9duction de la fragmentation sont diff\u00e9rents selon les moteurs.<\/p>\n<h3>Oracle<\/h3>\n<p>Un indexe peut \u00eatre reconstruit int\u00e9gralement gr\u00e2ce \u00e0 la commande ALTER INDEX REBUILD.<\/p>\n<p>Ses blocs vides peuvent \u00eatre d\u00e9sallou\u00e9s gr\u00e2ce \u00e0 la commande ALTER INDEX SHRINK SPACE (qui d\u00e9place les cl\u00e9s de l&#8217;indexe pour remplir au maximum les blocs, puis d\u00e9place les blocs allou\u00e9s vers le &#8220;d\u00e9but&#8221; de l&#8217;indexe, puis d\u00e9salloue les extensions vid\u00e9es).<\/p>\n<p>Les donn\u00e9es d&#8217;une table classique n&#8217;\u00e9tant pas tri\u00e9es, la d\u00e9fragmentation d&#8217;une table peut s&#8217;effectuer en d\u00e9pla\u00e7ant des lignes dans certains blocs afin de les remplir, puis \u00e9ventuellement de d\u00e9sallouer les blocs vides.<\/p>\n<p>La commande ALTER TABLE SHRINK SPACE permet d&#8217;effectuer ces op\u00e9rations.<\/p>\n<p>Attention, cette op\u00e9ration modifie l&#8217;identifiant physique de ligne d&#8217;une table ( ROWID); Les indexes utilisant cet identifiant, ils sont rendus invalides par cette op\u00e9ration et n\u00e9cessitent d&#8217;\u00eatre reconstruits.<\/p>\n<p>La vue <a href=\"http:\/\/docs.oracle.com\/cd\/B28359_01\/server.111\/b28320\/statviews_5119.htm\" target=\"_blank\" rel=\"noopener noreferrer\">V$INDEX_STATS<\/a> donne un grand nombre d&#8217;informations sur la fragmentation des indexes (ALTER INDEX VALIDATE STRUCTURE est n\u00e9cessaire pour que les informations concernant un indexe apparaissent dans cette vue).<\/p>\n<p>&nbsp;<\/p>\n<h3>SQL Server<\/h3>\n<p>Un indexe (ou une table ayant un indexe clusteris\u00e9) peut \u00eatre reconstruit avec la commande ALTER INDEX REBUILD.<\/p>\n<p>Lorsque la fragmentation n&#8217;est pas trop grande, il est possible d&#8217;effectuer une r\u00e9organisation (commande ALTER INDEX REORGANIZE). Cette op\u00e9ration ne va travailler que sur les feuilles de l&#8217;indexe. Elle est moins co\u00fbteuse en ressources mais moins performante que la reconstruction.<\/p>\n<p>La fragmentation d&#8217;un indexe peut \u00eatre mesur\u00e9e via la fonction dynamique de gestion <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/ms188917.aspx\"target=\"_blank\" rel=\"noopener noreferrer\">sys.dm_db_index_physical_stats<\/a>. Attention, l&#8217;utilisation de cette fonction peut \u00eatre co\u00fbteuse en ressources puisqu&#8217;elle n\u00e9cessite la lecture d&#8217;un tr\u00e8s grand nombre de pages d&#8217;indexes dans la base de donn\u00e9es.<\/p>\n<p>&nbsp;<\/p>\n<a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-twitter nolightbox\" data-provider=\"twitter\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Twitter\" href=\"https:\/\/twitter.com\/intent\/tweet?url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F3950&#038;text=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"twitter\" title=\"Share on Twitter\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/twitter.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-linkedin nolightbox\" data-provider=\"linkedin\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Linkedin\" href=\"https:\/\/www.linkedin.com\/shareArticle?mini=true&#038;url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F3950&#038;title=Oracle%20et%20SQL%20Server%3A%20La%20Fragmentation\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"linkedin\" title=\"Share on Linkedin\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/linkedin.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-mail nolightbox\" data-provider=\"mail\" rel=\"nofollow\" title=\"Share by email\" href=\"mailto:?subject=Oracle%20et%20SQL%20Server%3A%20La%20Fragmentation&#038;body=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20:%20https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F3950\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"mail\" title=\"Share by email\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/mail.png\" \/><\/a>","protected":false},"excerpt":{"rendered":"<p>Si les m\u00e9canismes vus pr\u00e9c\u00e9demment dans la s\u00e9rie sont\u00a0relativement similaires, la fragmentation est per\u00e7ue et g\u00e9r\u00e9e de mani\u00e8re radicalement diff\u00e9rente entre SQL Server et Oracle. &nbsp; Qu&#8217;est-ce que la fragmentation ? On parle d&#8217;une fragmentation, mais il existe deux \u00a0fragmentations&hellip; <a href=\"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-la-fragmentation\/\" class=\"more-link\">Continuer la lecture <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":14,"featured_media":7863,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,5],"tags":[146,221,192,237],"class_list":["post-3950","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-oracle","category-sqlserver","tag-fragmentation","tag-performance","tag-rebuild","tag-reorg"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Oracle et SQL Server: La Fragmentation - Capdata TECH BLOG<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-la-fragmentation\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Oracle et SQL Server: La Fragmentation - Capdata TECH BLOG\" \/>\n<meta property=\"og:description\" content=\"Si les m\u00e9canismes vus pr\u00e9c\u00e9demment dans la s\u00e9rie sont\u00a0relativement similaires, la fragmentation est per\u00e7ue et g\u00e9r\u00e9e de mani\u00e8re radicalement diff\u00e9rente entre SQL Server et Oracle. &nbsp; Qu&#8217;est-ce que la fragmentation ? On parle d&#8217;une fragmentation, mais il existe deux \u00a0fragmentations&hellip; Continuer la lecture &rarr;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-la-fragmentation\/\" \/>\n<meta property=\"og:site_name\" content=\"Capdata TECH BLOG\" \/>\n<meta property=\"article:published_time\" content=\"2013-06-18T14:46:20+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-09-13T13:05:03+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2013\/06\/frag.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"880\" \/>\n\t<meta property=\"og:image:height\" content=\"657\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Benjamin VESAN\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Benjamin VESAN\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-la-fragmentation\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-la-fragmentation\/\"},\"author\":{\"name\":\"Benjamin VESAN\",\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/person\/ae56d1d3d5680d95ccc2c927e44bdc3e\"},\"headline\":\"Oracle et SQL Server: La Fragmentation\",\"datePublished\":\"2013-06-18T14:46:20+00:00\",\"dateModified\":\"2019-09-13T13:05:03+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-la-fragmentation\/\"},\"wordCount\":1406,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/blog.capdata.fr\/#organization\"},\"keywords\":[\"fragmentation\",\"performance\",\"rebuild\",\"REORG\"],\"articleSection\":[\"Oracle\",\"SQL Server\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-la-fragmentation\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-la-fragmentation\/\",\"url\":\"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-la-fragmentation\/\",\"name\":\"Oracle et SQL Server: La Fragmentation - Capdata TECH BLOG\",\"isPartOf\":{\"@id\":\"https:\/\/blog.capdata.fr\/#website\"},\"datePublished\":\"2013-06-18T14:46:20+00:00\",\"dateModified\":\"2019-09-13T13:05:03+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-la-fragmentation\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-la-fragmentation\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-la-fragmentation\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/blog.capdata.fr\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Oracle et SQL Server: La Fragmentation\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.capdata.fr\/#website\",\"url\":\"https:\/\/blog.capdata.fr\/\",\"name\":\"Capdata TECH BLOG\",\"description\":\"Le blog technique sur les bases de donn\u00e9es de CAP DATA Consulting\",\"publisher\":{\"@id\":\"https:\/\/blog.capdata.fr\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.capdata.fr\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/blog.capdata.fr\/#organization\",\"name\":\"Capdata TECH BLOG\",\"url\":\"https:\/\/blog.capdata.fr\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp\",\"contentUrl\":\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp\",\"width\":800,\"height\":254,\"caption\":\"Capdata TECH BLOG\"},\"image\":{\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.linkedin.com\/company\/cap-data-consulting\/mycompany\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/person\/ae56d1d3d5680d95ccc2c927e44bdc3e\",\"name\":\"Benjamin VESAN\",\"url\":\"https:\/\/blog.capdata.fr\/index.php\/author\/bvesan\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Oracle et SQL Server: La Fragmentation - Capdata TECH BLOG","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-la-fragmentation\/","og_locale":"fr_FR","og_type":"article","og_title":"Oracle et SQL Server: La Fragmentation - Capdata TECH BLOG","og_description":"Si les m\u00e9canismes vus pr\u00e9c\u00e9demment dans la s\u00e9rie sont\u00a0relativement similaires, la fragmentation est per\u00e7ue et g\u00e9r\u00e9e de mani\u00e8re radicalement diff\u00e9rente entre SQL Server et Oracle. &nbsp; Qu&#8217;est-ce que la fragmentation ? On parle d&#8217;une fragmentation, mais il existe deux \u00a0fragmentations&hellip; Continuer la lecture &rarr;","og_url":"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-la-fragmentation\/","og_site_name":"Capdata TECH BLOG","article_published_time":"2013-06-18T14:46:20+00:00","article_modified_time":"2019-09-13T13:05:03+00:00","og_image":[{"width":880,"height":657,"url":"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2013\/06\/frag.jpg","type":"image\/jpeg"}],"author":"Benjamin VESAN","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"Benjamin VESAN","Dur\u00e9e de lecture estim\u00e9e":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-la-fragmentation\/#article","isPartOf":{"@id":"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-la-fragmentation\/"},"author":{"name":"Benjamin VESAN","@id":"https:\/\/blog.capdata.fr\/#\/schema\/person\/ae56d1d3d5680d95ccc2c927e44bdc3e"},"headline":"Oracle et SQL Server: La Fragmentation","datePublished":"2013-06-18T14:46:20+00:00","dateModified":"2019-09-13T13:05:03+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-la-fragmentation\/"},"wordCount":1406,"commentCount":0,"publisher":{"@id":"https:\/\/blog.capdata.fr\/#organization"},"keywords":["fragmentation","performance","rebuild","REORG"],"articleSection":["Oracle","SQL Server"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-la-fragmentation\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-la-fragmentation\/","url":"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-la-fragmentation\/","name":"Oracle et SQL Server: La Fragmentation - Capdata TECH BLOG","isPartOf":{"@id":"https:\/\/blog.capdata.fr\/#website"},"datePublished":"2013-06-18T14:46:20+00:00","dateModified":"2019-09-13T13:05:03+00:00","breadcrumb":{"@id":"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-la-fragmentation\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-la-fragmentation\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/blog.capdata.fr\/index.php\/oracle-et-sql-server-la-fragmentation\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/blog.capdata.fr\/"},{"@type":"ListItem","position":2,"name":"Oracle et SQL Server: La Fragmentation"}]},{"@type":"WebSite","@id":"https:\/\/blog.capdata.fr\/#website","url":"https:\/\/blog.capdata.fr\/","name":"Capdata TECH BLOG","description":"Le blog technique sur les bases de donn\u00e9es de CAP DATA Consulting","publisher":{"@id":"https:\/\/blog.capdata.fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.capdata.fr\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/blog.capdata.fr\/#organization","name":"Capdata TECH BLOG","url":"https:\/\/blog.capdata.fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/","url":"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp","contentUrl":"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp","width":800,"height":254,"caption":"Capdata TECH BLOG"},"image":{"@id":"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.linkedin.com\/company\/cap-data-consulting\/mycompany\/"]},{"@type":"Person","@id":"https:\/\/blog.capdata.fr\/#\/schema\/person\/ae56d1d3d5680d95ccc2c927e44bdc3e","name":"Benjamin VESAN","url":"https:\/\/blog.capdata.fr\/index.php\/author\/bvesan\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts\/3950","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/users\/14"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/comments?post=3950"}],"version-history":[{"count":48,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts\/3950\/revisions"}],"predecessor-version":[{"id":7864,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts\/3950\/revisions\/7864"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/media\/7863"}],"wp:attachment":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/media?parent=3950"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/categories?post=3950"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/tags?post=3950"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}