{"id":133,"date":"2010-10-15T21:59:19","date_gmt":"2010-10-16T00:59:19","guid":{"rendered":"http:\/\/fabriciodba.wordpress.com\/?p=133"},"modified":"2017-10-20T08:25:08","modified_gmt":"2017-10-20T10:25:08","slug":"casos-do-dia-a-dia-exclusao-de-campo-text-nao-libera-espaco-em-disco","status":"publish","type":"post","link":"https:\/\/fabriciolima.net\/blog\/2010\/10\/15\/casos-do-dia-a-dia-exclusao-de-campo-text-nao-libera-espaco-em-disco\/","title":{"rendered":"Casos do Dia a Dia: Exclus\u00e3o de campo Text n\u00e3o libera espa\u00e7o em disco?"},"content":{"rendered":"<p>Fala pessoal,<\/p>\n<p>Compartilhando mais uma experi\u00eancia que tive no meu dia a dia de trabalho, ap\u00f3s a verifica\u00e7\u00e3o com a equipe de desenvolvimento da possibilidade de exclus\u00e3o de 2 campos do tipo text de uma tabela muito utilizada, fui com toda empolga\u00e7\u00e3o na minha base de testes verificar o quanto de espa\u00e7o em disco eu ganharia. Para isso, rodei a sp_spaceused para essa tabela, exclui os 2 campos text e rodei novamente a sp_spaceused.<\/p>\n<p>Para minha surpresa, o espa\u00e7o em disco utilizado por essa tabela continuava o mesmo. Ah n\u00e3o! \u00c9 imposs\u00edvel! Como que esses campos n\u00e3o ocupam nenhum espa\u00e7o no banco?<\/p>\n<p>Vamos visualizar essa situa\u00e7\u00e3o. Com o script abaixo criamos e populamos uma tabela comum:<\/p>\n<pre class=\"lang:tsql decode:true \">\r\nSET NOCOUNT ON\r\n\r\nCREATE TABLE Anotacao(\r\nId_Anotacao INT IDENTITY(1,1),\r\nDt_Anotacao DATETIME DEFAULT(getdate()),\r\nDs_Anotacao TEXT,\r\nCONSTRAINT PK_Anotacao PRIMARY KEY(Id_Anotacao)) -- \u00cdndice clustered\r\nGO\r\nINSERT INTO Anotacao(Ds_Anotacao)\r\nSELECT REPLICATE('A',4000)\r\nGO 10000\r\n<\/pre>\n<p>Em seguida, executando o comando:<\/p>\n<pre class=\"lang:tsql decode:true \">\r\nexec sp_spaceused Anotacao\r\n<\/pre>\n<p>Temos o seguinte resultado:<\/p>\n<p><a href=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2010\/10\/spaceused_antes.jpg\"><img loading=\"lazy\" decoding=\"async\" title=\"spaceused_antes\" src=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2010\/10\/spaceused_antes_thumb.jpg?w=495&amp;h=46\" alt=\"spaceused_antes\" width=\"495\" height=\"46\" border=\"0\" \/><\/a><\/p>\n<p>Como podemos ver, a tabela possui mais de 40 MB de dados.<\/p>\n<p>Agora exclu\u00edmos o campo com o comando abaixo:<\/p>\n<pre class=\"lang:tsql decode:true \">\r\nALTER TABLE Anotacao\r\nDROP COLUMN Ds_Anotacao\r\n<\/pre>\n<p>Mais uma vez, executando a sp_spaceused temos o resultado abaixo:<\/p>\n<pre class=\"lang:tsql decode:true \">\r\nexec sp_spaceused Anotacao\r\n<\/pre>\n<p><a href=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2010\/10\/spaceused_antes1.jpg\"><img loading=\"lazy\" decoding=\"async\" title=\"spaceused_antes\" src=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2010\/10\/spaceused_antes_thumb1.jpg?w=495&amp;h=46\" alt=\"spaceused_antes\" width=\"495\" height=\"46\" border=\"0\" \/><\/a><\/p>\n<p>Como assim? O resultado n\u00e3o mudou?<\/p>\n<p>Nesse momento abri uma thread no f\u00f3rum do technet e ap\u00f3s trocar alguns posts com o Gustavo Aguiar (<a href=\"http:\/\/gustavomaiaaguiar.spaces.live.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Blog<\/a>), obtive uma resposta muito esclarecedora:<\/p>\n<p>\u201cOl\u00e1 Fabr\u00edcio,<\/p>\n<p>Antes da exclus\u00e3o da coluna, o espa\u00e7o estava alocado e os dados organizados. Se voc\u00ea excluir a coluna, para que o espa\u00e7o seja imediatamente liberado, o SQL Server teria que reorganizar tudo. Para reorganizar, fatalmente haveria um trabalho de IO envolvido bem como uma poss\u00edvel indisponibilidade. Como o SQL Server n\u00e3o sabe a criticidade da tabela, ele opta por n\u00e3o reorganizar e manter o espa\u00e7o alocado mesmo ap\u00f3s a exclus\u00e3o da coluna.<\/p>\n<p>O espa\u00e7o ser\u00e1 liberado assim que voc\u00ea promover um REINDEX do \u00edndice clustered. Se a tabela n\u00e3o possuir um, ser\u00e1 necess\u00e1rio criar e depois remov\u00ea-lo (a menos que seja SQL Server 2008).\u201d<\/p>\n<p>Pronto, acredito que agora tudo j\u00e1 esteja esclarecido para voc\u00eas. Vamos testar?<\/p>\n<p>Basta dar um REBUILD no \u00edndice:<\/p>\n<pre class=\"lang:tsql decode:true \">\r\nALTER INDEX PK_Anotacao ON Anotacao REBUILD\r\n<\/pre>\n<p>Agora, executando a sp_spaceused novamente, temos o seguinte resultado:<\/p>\n<p><a href=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2010\/10\/spaceused_depois.jpg\"><img loading=\"lazy\" decoding=\"async\" title=\"spaceused_depois\" src=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2010\/10\/spaceused_depois_thumb.jpg?w=471&amp;h=55\" alt=\"spaceused_depois\" width=\"471\" height=\"55\" border=\"0\" \/><\/a><\/p>\n<p>Agora podemos visualizar o espa\u00e7o que ganhamos com a exclus\u00e3o do campo. O tamanho da tabela diminuiu 40 MB.<\/p>\n<p>Bom, depois da ajuda do Gustavo, verifiquei que no meu caso ganharia 10GB de espa\u00e7o em disco com a exclus\u00e3o dos meus 2 campos text. =)<\/p>\n<p><b>Gostou dessa dica?<\/b><\/p>\n<p>Cadastre seu e-mail para receber novos Posts e curta minha <a href=\"https:\/\/www.facebook.com\/FabricioLimaSolucoesemBancodeDados\/\" target=\"_blank\" rel=\"noopener noreferrer\">P\u00e1gina no Facebook<\/a> para receber Dicas de Leituras e Eventos sobre SQL Server.<\/p>\n<p>Confira mais experi\u00eancias do Dia a Dia de um DBA no meu <a href=\"https:\/\/www.fabriciolima.net\/cursos-online\/treinamento-tarefas-do-dia-a-dia-de-um-dba-online\/\" target=\"_blank\" rel=\"noopener noreferrer\">Treinamento de Tarefas do Dia a Dia de um DBA<\/a>.<\/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, Compartilhando mais uma experi\u00eancia que tive no meu dia a dia de trabalho, ap\u00f3s a verifica\u00e7\u00e3o com a equipe de desenvolvimento da possibilidade de exclus\u00e3o de 2 campos do tipo text de uma tabela muito utilizada, fui com toda empolga\u00e7\u00e3o na minha base de testes verificar o quanto de espa\u00e7o em disco eu [&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,6,280],"tags":[88,90,93,22,23,91,89,92,49,33,39],"class_list":["post-133","post","type-post","status-publish","format-standard","hentry","category-administracao-de-bd","category-casos-do-dia-a-dia","category-virtual-pass-br","tag-alter-index","tag-alter-table","tag-create-table","tag-datatype","tag-dba","tag-espaco-em-disco","tag-rebuild","tag-sp_spaceused","tag-sql","tag-sql-server","tag-text"],"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts\/133","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=133"}],"version-history":[{"count":0,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts\/133\/revisions"}],"wp:attachment":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/media?parent=133"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/categories?post=133"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/tags?post=133"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}