{"id":484,"date":"2011-02-26T19:56:57","date_gmt":"2011-02-26T21:56:57","guid":{"rendered":"http:\/\/fabriciolima.net\/blog\/?p=484"},"modified":"2016-07-23T22:49:55","modified_gmt":"2016-07-24T01:49:55","slug":"qual-o-valor-ideal-para-o-fillfactor-de-um-indice","status":"publish","type":"post","link":"https:\/\/fabriciolima.net\/blog\/2011\/02\/26\/qual-o-valor-ideal-para-o-fillfactor-de-um-indice\/","title":{"rendered":"Qual o valor ideal para o FILLFACTOR de um \u00cdndice?"},"content":{"rendered":"<p>Fala Pessoal,<\/p>\n<p>Voc\u00ea que \u00e9 um DBA, algum dia j\u00e1 deve ter feito essa pergunta para algu\u00e9m ou para o google. A resposta deve ter sido que n\u00e3o existe uma receita de bolo para definir o valor do fillfactor de um \u00edndice, seu valor depende do ambiente ser OLTP (Online Transaction Processing) ou OLAP (Online Analytical Processing), da quantidade de INSERT, UPDATE e DELETE do \u00edndice, do tipo de dados da coluna chave do \u00edndice, dentre outros fatores.<\/p>\n<p>Infelizmente tamb\u00e9m darei a mesma resposta, que n\u00e3o existe um valor de fillfactor ideal para todos os \u00edndices. Possuo \u00edndices que v\u00e3o desde 75% de fillfactor at\u00e9 \u00edndices com 97%. Entretanto, vou mostrar uma query que utilizo para tentar aproximar cada um dos meus principais \u00edndices dos seus valores ideais.<\/p>\n<p>No meu \u00faltimo post t\u00e9cnico mostrei <a title=\"Monitorando a Fragmenta\u00e7\u00e3o dos \u00cdndices\" href=\"https:\/\/www.fabriciolima.net\/blog\/2011\/02\/16\/monitorando-a-fragmentacao-dos-indices\/\" target=\"_blank\">como armazenar um hist\u00f3rico de fragmenta\u00e7\u00e3o dos \u00edndices <\/a>e \u00e9 com essa informa\u00e7\u00e3o que verifico o quanto cada \u00edndice se fragmenta individualmente para verificar se o fillfactor desse \u00edndice deve ser alterado para um valor diferente.<!--more--><\/p>\n<p>Para ilustrar essa situa\u00e7\u00e3o vou popular minha tabela de hist\u00f3rico(criada no post anterior) com dados fict\u00edcios para dois \u00edndices.<\/p>\n<p>&#8211;Segue novamente o script para a cria\u00e7\u00e3o da tabela:<\/p>\n<p>CREATE TABLE [dbo].[Hitorico_Fragmentacao_Indice](<br \/>\n[Id_Hitorico_Fragmentacao_Indice] [int] IDENTITY(1,1) NOT NULL,<br \/>\n[Dt_Referencia] [datetime] NULL,<br \/>\n[Nm_Servidor] [varchar](20) NULL,<br \/>\n[Nm_Database] [varchar](20) NULL,<br \/>\n[Nm_Tabela] [varchar](50) NULL,<br \/>\n[Nm_Indice] [varchar](70) NULL,<br \/>\n[Avg_Fragmentation_In_Percent] [numeric](5, 2) NULL,<br \/>\n[Page_Count] [int] NULL,<br \/>\n[Fill_Factor] [tinyint] NULL)<br \/>\nINSERT INTO\u00a0Hitorico_Fragmentacao_Indice(Dt_Referencia,Nm_Servidor,<br \/>\nNm_Database,Nm_Tabela,Nm_Indice,Avg_Fragmentation_In_Percent,<br \/>\nPage_Count,Fill_Factor)<br \/>\nselect getdate()-3,&#8217;FABRICIONOTE&#8217;,&#8217;FabricioLima&#8217;,&#8217;Teste_Fragmentacao&#8217;,<br \/>\n&#8216;SK01_Teste_Fragmentacao&#8217;,5.60,1500,90<\/p>\n<p>INSERT INTO\u00a0Hitorico_Fragmentacao_Indice(Dt_Referencia,<br \/>\nNm_Servidor,Nm_Database,Nm_Tabela,Nm_Indice,Avg_Fragmentation_In_Percent, Page_Count,Fill_Factor)<br \/>\nselect getdate()-2,&#8217;FABRICIONOTE&#8217;,&#8217;FabricioLima&#8217;,&#8217;Teste_Fragmentacao&#8217;,<br \/>\n&#8216;SK01_Teste_Fragmentacao&#8217;,\u00a08.67,1500,90<\/p>\n<p>INSERT INTO\u00a0Hitorico_Fragmentacao_Indice(Dt_Referencia,<br \/>\nNm_Servidor,Nm_Database,Nm_Tabela,Nm_Indice,Avg_Fragmentation_In_Percent,<br \/>\nPage_Count,Fill_Factor)<br \/>\nselect getdate()-1,&#8217;FABRICIONOTE&#8217;,&#8217;FabricioLima&#8217;,&#8217;Teste_Fragmentacao&#8217;,<br \/>\n&#8216;SK01_Teste_Fragmentacao&#8217;,10.78,1500,90<\/p>\n<p>INSERT INTO\u00a0Hitorico_Fragmentacao_Indice(Dt_Referencia,<br \/>\nNm_Servidor,Nm_Database,Nm_Tabela,Nm_Indice,Avg_Fragmentation_In_Percent,<br \/>\nPage_Count,Fill_Factor)<br \/>\nselect getdate()-3,&#8217;FABRICIONOTE&#8217;,&#8217;FabricioLima&#8217;,&#8217;Teste_Fragmentacao&#8217;,<br \/>\n&#8216;SK02_Teste_Fragmentacao&#8217;,15.60,1500,90<\/p>\n<p>INSERT INTO\u00a0Hitorico_Fragmentacao_Indice(Dt_Referencia,<br \/>\nNm_Servidor,Nm_Database,Nm_Tabela,Nm_Indice,Avg_Fragmentation_In_Percent,<br \/>\nPage_Count,Fill_Factor)<br \/>\nselect getdate()-2,&#8217;FABRICIONOTE&#8217;,&#8217;FabricioLima&#8217;,&#8217;Teste_Fragmentacao&#8217;,<br \/>\n&#8216;SK02_Teste_Fragmentacao&#8217;,18.67,1500,90<\/p>\n<p>INSERT INTO\u00a0Hitorico_Fragmentacao_Indice(Dt_Referencia,<br \/>\nNm_Servidor,Nm_Database,Nm_Tabela,Nm_Indice,Avg_Fragmentation_In_Percent,<br \/>\nPage_Count,Fill_Factor)<br \/>\nselect getdate()-1,&#8217;FABRICIONOTE&#8217;,&#8217;FabricioLima&#8217;,&#8217;Teste_Fragmentacao&#8217;,<br \/>\n&#8216;SK02_Teste_Fragmentacao&#8217;,23.78,1500,90<\/p>\n<p>Verificando os valores que foram inseridos:<\/p>\n<p>SELECT Dt_Referencia,Nm_Indice,Avg_Fragmentation_In_Percent Fragmentacao<br \/>\nFROM Hitorico_Fragmentacao_Indice<br \/>\nORDER BY Dt_Referencia<\/p>\n<p>Temos como resultado:<\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2011\/02\/Tabela-Historico-Fragmentacao.jpg\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-485  aligncenter\" title=\"Tabela Historico Fragmentacao\" src=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2011\/02\/Tabela-Historico-Fragmentacao-300x90.jpg\" alt=\"\" width=\"373\" height=\"133\" \/><\/a><\/p>\n<p>Como pode ser verificado no select acima, simulei uma poss\u00edvel fragmenta\u00e7\u00e3o de dois \u00edndices durante 3 dias.<\/p>\n<p>Com a query abaixo podemos verificar a fragmenta\u00e7\u00e3o dos \u00edndices em um determinado per\u00edodo, como por exemplo, no \u00ednicio do m\u00eas, no fim do m\u00eas, no m\u00eas inteiro, no ano todo e etc.<\/p>\n<p>SELECT\u00a0 A.Nm_Database, A.Nm_Tabela, A.Nm_Indice,<br \/>\nSUM(B.Avg_Fragmentation_In_Percent &#8211; A.Avg_Fragmentation_In_Percent) Total_Fragmentacao<br \/>\nFROM Hitorico_Fragmentacao_Indice A (nolock)<br \/>\njoin Hitorico_Fragmentacao_Indice B (nolock) on A.Nm_Indice = B.Nm_Indice<br \/>\nand A.Nm_Tabela = B.Nm_Tabela and A.Nm_Database = B.Nm_Database<br \/>\nand A.Avg_Fragmentation_In_Percent &lt; B.Avg_Fragmentation_In_Percent<br \/>\nand cast(floor(cast(A.Dt_Referencia+1 as float)) as datetime) = cast(floor(cast(B.Dt_Referencia as float)) as datetime)<br \/>\nWHERE\u00a0 A.page_count &gt; 1000 &#8212; Eliminar \u00edndices pequenos<br \/>\nand A.Dt_Referencia &gt;= &#8216;20110223&#8217; and A.Dt_Referencia &lt; &#8216;20110227&#8217;<br \/>\nGROUP BY A.Nm_Database,A.Nm_Tabela,A.Nm_Indice<br \/>\nORDER BY 4 DESC<\/p>\n<p>Segue o resultado:<\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2011\/02\/Query-Fillfactor1.jpg\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-487\" title=\"Query Fillfactor\" src=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2011\/02\/Query-Fillfactor1-300x31.jpg\" alt=\"\" width=\"320\" height=\"47\" \/><\/a><\/p>\n<p>Vemos agora sumarizadamente que o \u00edndice SK02_Teste_Fragmentacao se fragmentou 8,18% e o \u00edndice SK01_Teste_Fragmentacao se fragmentou 5.18% durante 3 dias. Reparem que eu\u00a0adicionei uma cl\u00e1usula no join (A.Avg_Fragmentation_In_Percent &lt; B.Avg_Fragmentation_In_Percent) para n\u00e3o incluir na query o dia que a fragmenta\u00e7\u00e3o de um \u00edndice diminuir, que \u00e9 o que acontece quando\u00a0\u00e9 realizado\u00a0um REORGANIZE ou um REBUILD no \u00edndice.<\/p>\n<p>Assim voc\u00ea identifica facilmente os \u00edndices que possuem uma maior fragmenta\u00e7\u00e3o e pode alterar o fillfactor desses \u00edndices individualmente, ou aumentar a frequ\u00eancia com que esses \u00edndices s\u00e3o\u00a0desfragmentado.\u00a0Com esse\u00a0procedimento\u00a0tamb\u00e9m temos\u00a0ganhos de performance e espa\u00e7o em disco, pois\u00a0identificamos os \u00edndices que pouco se fragmentam durante um certo per\u00edodo(1 m\u00eas por exemplo) e , com isso,\u00a0esses \u00edndices podem ter seu fillfactor aumentado para economizar espa\u00e7o em disco e aumentar o desempenho do ambiente.<\/p>\n<p>Foi com essa rotina que alterei o valor do fillfactor de quase todos os \u00edndices das minhas principais tabelas, economizando um grande espa\u00e7o em disco (mais de 20 GB)\u00a0e aumentando a performance do meu banco de dados, pois quanto maior for o fillfactor de um \u00edndice, mais registros s\u00e3o armazenados em uma p\u00e1gina desse \u00edndice, o que ocasiona um n\u00famero menor de p\u00e1ginas no tamanho do mesmo, ocupando menos espa\u00e7o na mem\u00f3ria e aumentando o desempenho de todo o ambiente.<\/p>\n<p>Tamb\u00e9m tive que diminiur o fillfactor de alguns \u00edndices para diminuir a fragmenta\u00e7\u00e3o e tamb\u00e9m o n\u00famero de page split das p\u00e1ginas desses \u00edndices.<\/p>\n<p>Ent\u00e3o, caso voc\u00ea seja respons\u00e1vel por um ambiente de banco de dados, monitorar a fragmenta\u00e7\u00e3o dos seus \u00edndices pode te ajudar a ter um grande ganho de performance.<\/p>\n<p><b>Gostou desse Post?<\/b><\/p>\n<p>Cadastre seu e-mail para receber novos Posts e curta minha <a href=\"https:\/\/www.facebook.com\/FabricioLimaSolucoesemBancodeDados\/\" target=\"_blank\">P\u00e1gina no Facebook<\/a> para receber Dicas de Leituras e Eventos sobre SQL Server.<\/p>\n<p>Abra\u00e7os,<\/p>\n<p>Fabr\u00edcio Lima<\/p>\n<p>MCITP \u2013 Database Administrator<\/p>\n<p>Consultor e Instrutor SQL Server<\/p>\n<p>Trabalha com SQL Server desde 2006<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Fala Pessoal, Voc\u00ea que \u00e9 um DBA, algum dia j\u00e1 deve ter feito essa pergunta para algu\u00e9m ou para o google. A resposta deve ter sido que n\u00e3o existe uma receita de bolo para definir o valor do fillfactor de um \u00edndice, seu valor depende do ambiente ser OLTP (Online Transaction Processing) ou OLAP (Online [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"footnotes":""},"categories":[3,280],"tags":[18,190,191,93,23,185,186,189,192,215,184,110,187,89,188,49,33,50,34,35,193,40],"class_list":["post-484","post","type-post","status-publish","format-standard","hentry","category-administracao-de-bd","category-virtual-pass-br","tag-checklist","tag-checklist-diario","tag-checklist-do-banco-de-dados","tag-create-table","tag-dba","tag-desfragmentacao-de-um-indice","tag-desfragmentar-um-indice","tag-dm_db_index_physical_stats","tag-fill-factor","tag-fillfactor-ideal-para-um-indice","tag-fragmentacao-de-indices","tag-indice","tag-monitoramento-fragmentacao","tag-rebuild","tag-reorganize","tag-sql","tag-sql-server","tag-sql-server-2005","tag-sql-server-2008","tag-sql-server-2008-r2","tag-tamanho-fill-factor","tag-tuning"],"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts\/484","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/comments?post=484"}],"version-history":[{"count":0,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts\/484\/revisions"}],"wp:attachment":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/media?parent=484"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/categories?post=484"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/tags?post=484"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}