{"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":"","jetpack_post_was_ever_published":false},"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"],"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":1323,"url":"https:\/\/fabriciolima.net\/blog\/2012\/02\/29\/colunas-com-valores-null-ocupam-espaco-em-disco-mito\/","url_meta":{"origin":133,"position":0},"title":"Colunas com valores NULL ocupam espa\u00e7o em disco? Mito?","author":"Fabr\u00edcio Lima","date":"29 de fevereiro de 2012","format":false,"excerpt":"Ol\u00e1 Pessoal, Muitos de voc\u00eas j\u00e1 devem ter recebido a seguinte solicita\u00e7\u00e3o: \"Favor criar uma coluna nova na tabela X (80 milh\u00f5es de linhas). Como os valores existentes ser\u00e3o NULLs, esse campo n\u00e3o ocupar\u00e1 espa\u00e7o em disco e n\u00e3o teremos nenhum impacto nessa tabela\". Entretanto, n\u00e3o \u00e9 exatamente isso que\u2026","rel":"","context":"Em &quot;Administra\u00e7\u00e3o de Banco de Dados&quot;","block_context":{"text":"Administra\u00e7\u00e3o de Banco de Dados","link":"https:\/\/fabriciolima.net\/blog\/category\/sql-server\/administracao-de-bd\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2012\/02\/spaceusedTabelas.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":4612,"url":"https:\/\/fabriciolima.net\/blog\/2016\/04\/27\/queries-do-dia-a-dia-monitorando-o-crescimento-de-tabelas-e-bases-no-sql-server\/","url_meta":{"origin":133,"position":1},"title":"Queries do Dia a Dia &#8211; Monitorando o Crescimento de Tabelas e Bases no SQL Server","author":"Fabr\u00edcio Lima","date":"27 de abril de 2016","format":false,"excerpt":"Ol\u00e1 Pessoal, Hoje vou compartilhar com voc\u00eas um Script que utilizo em todos os clientes que realizo um monitoramento di\u00e1rio do SQL Server. \u00c9 um script que ir\u00e1 armazenar diariamente o tamanho das tabelas de todas as bases de dados e, com isso, voc\u00ea conseguir\u00e1 monitorar o quanto suas tabelas\u2026","rel":"","context":"Em &quot;Administra\u00e7\u00e3o de Banco de Dados&quot;","block_context":{"text":"Administra\u00e7\u00e3o de Banco de Dados","link":"https:\/\/fabriciolima.net\/blog\/category\/sql-server\/administracao-de-bd\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2016\/04\/HistoricoTamanhoTabelas-1024x338.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2016\/04\/HistoricoTamanhoTabelas-1024x338.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2016\/04\/HistoricoTamanhoTabelas-1024x338.jpg?resize=525%2C300&ssl=1 1.5x"},"classes":[]},{"id":169,"url":"https:\/\/fabriciolima.net\/blog\/2010\/11\/30\/casos-do-dia-a-dia-exclusao-de-um-indice-grande-e-pouco-utilizado\/","url_meta":{"origin":133,"position":2},"title":"Casos do Dia a Dia &#8211; Exclus\u00e3o de um \u00edndice grande e pouco utilizado","author":"Fabr\u00edcio Lima","date":"30 de novembro de 2010","format":false,"excerpt":"Fala pessoal, Algum tempo atr\u00e1s, compartilhei uma experi\u00eancia que tive no Blog do Fabr\u00edcio Catae (Blog|Twitter), mas tamb\u00e9m resolvi deixar registrado por aqui. Muitos de voc\u00eas j\u00e1 utilizaram a dmv sys.dm_db_index_usage_stats para verificar a utiliza\u00e7\u00e3o e atualiza\u00e7\u00e3o dos \u00edndices de uma tabela. Tamb\u00e9m sabemos que essa dmv tem seus dados\u2026","rel":"","context":"Em &quot;Administra\u00e7\u00e3o de Banco de Dados&quot;","block_context":{"text":"Administra\u00e7\u00e3o de Banco de Dados","link":"https:\/\/fabriciolima.net\/blog\/category\/sql-server\/administracao-de-bd\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":285,"url":"https:\/\/fabriciolima.net\/blog\/2010\/03\/24\/criando-um-checklist-automatico-do-banco-de-dados\/","url_meta":{"origin":133,"position":3},"title":"Criando um CheckList Autom\u00e1tico do Banco de Dados","author":"Fabr\u00edcio Lima","date":"24 de mar\u00e7o de 2010","format":false,"excerpt":"Atualizado em: 01\/05\/2017 OBS: Segue abaixo o link de um Post com uma nova vers\u00e3o desse CheckList muito mais pr\u00e1tica e com diversas melhorias. Desta vez, o CheckList ser\u00e1 enviado por e-mail em formato HTML: Link Post: Criando um E-mail de CheckList Di\u00e1rio no SQL Server \u00a0 Ol\u00e1 pessoal, Assim\u2026","rel":"","context":"Em &quot;Administra\u00e7\u00e3o de Banco de Dados&quot;","block_context":{"text":"Administra\u00e7\u00e3o de Banco de Dados","link":"https:\/\/fabriciolima.net\/blog\/category\/sql-server\/administracao-de-bd\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":656,"url":"https:\/\/fabriciolima.net\/blog\/2011\/04\/26\/querys-do-dia-a-dia-como-encontrar-as-conexoes-que-mais-ocupam-espaco-no-tempdb\/","url_meta":{"origin":133,"position":4},"title":"Querys do Dia a Dia: Como encontrar as conex\u00f5es que mais ocupam espa\u00e7o no Tempdb","author":"Fabr\u00edcio Lima","date":"26 de abril de 2011","format":false,"excerpt":"Fala Pessoal, Um certo dia, no meio do meu expediente normal de trabalho, recebi a notifica\u00e7\u00e3o abaixo por e-mail: T: Label:TempDB is 92 Percentage, threshold value for this monitor is 80 Percentage Estava acabando o espa\u00e7o em disco no drive T: onde o Tempdb est\u00e1 armazenado em um dos\u00a0 meus\u2026","rel":"","context":"Em &quot;Querys do Dia a Dia&quot;","block_context":{"text":"Querys do Dia a Dia","link":"https:\/\/fabriciolima.net\/blog\/category\/sql-server\/querys-do-dia-a-dia\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":286,"url":"https:\/\/fabriciolima.net\/blog\/2010\/04\/11\/como-criar-um-controle-de-versao-de-procedures-views-e-functions-no-sql-server\/","url_meta":{"origin":133,"position":5},"title":"Como criar um Controle de Vers\u00e3o de Procedures, Views e Functions no SQL Server","author":"Fabr\u00edcio Lima","date":"11 de abril de 2010","format":false,"excerpt":"Quantas vezes j\u00e1 te perguntaram qual era o c\u00f3digo de uma fun\u00e7\u00e3o, procedure ou view em uma determinada data? At\u00e9 o SQL Server 2000, s\u00f3 era poss\u00edvel obter essa informa\u00e7\u00e3o atrav\u00e9s da gera\u00e7\u00e3o peri\u00f3dica de arquivos com scripts dos objetos do banco de dados. Entretanto, a partir do SQL Server\u2026","rel":"","context":"Em &quot;Administra\u00e7\u00e3o de Banco de Dados&quot;","block_context":{"text":"Administra\u00e7\u00e3o de Banco de Dados","link":"https:\/\/fabriciolima.net\/blog\/category\/sql-server\/administracao-de-bd\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/fg7djq.bay.livefilestore.com\/y1pZnviks_oXTAbvTepEXLmnGOQrvNjLmPIYsnTtHeOc35EqnNRyKgWy5UP9pLfVfu7xdnua1G4ZCJ-dmwm3lqJfpEEYCjfqwI3\/Figura%201%20-%20Resultado%20query.JPG?resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/fg7djq.bay.livefilestore.com\/y1pZnviks_oXTAbvTepEXLmnGOQrvNjLmPIYsnTtHeOc35EqnNRyKgWy5UP9pLfVfu7xdnua1G4ZCJ-dmwm3lqJfpEEYCjfqwI3\/Figura%201%20-%20Resultado%20query.JPG?resize=350%2C200 1x, https:\/\/i0.wp.com\/fg7djq.bay.livefilestore.com\/y1pZnviks_oXTAbvTepEXLmnGOQrvNjLmPIYsnTtHeOc35EqnNRyKgWy5UP9pLfVfu7xdnua1G4ZCJ-dmwm3lqJfpEEYCjfqwI3\/Figura%201%20-%20Resultado%20query.JPG?resize=525%2C300 1.5x, https:\/\/i0.wp.com\/fg7djq.bay.livefilestore.com\/y1pZnviks_oXTAbvTepEXLmnGOQrvNjLmPIYsnTtHeOc35EqnNRyKgWy5UP9pLfVfu7xdnua1G4ZCJ-dmwm3lqJfpEEYCjfqwI3\/Figura%201%20-%20Resultado%20query.JPG?resize=700%2C400 2x"},"classes":[]}],"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}]}}