{"id":2858,"date":"2014-03-10T07:43:49","date_gmt":"2014-03-10T09:43:49","guid":{"rendered":"http:\/\/fabriciolima.net\/blog\/?p=2858"},"modified":"2016-07-23T13:29:25","modified_gmt":"2016-07-23T16:29:25","slug":"como-descobrir-a-pagina-fisica-dos-registros-de-uma-tabela-com-apenas-um-select","status":"publish","type":"post","link":"https:\/\/fabriciolima.net\/blog\/2014\/03\/10\/como-descobrir-a-pagina-fisica-dos-registros-de-uma-tabela-com-apenas-um-select\/","title":{"rendered":"Como descobrir a p\u00e1gina f\u00edsica dos registros de uma tabela com apenas um SELECT"},"content":{"rendered":"<p>Ol\u00e1 Pessoal,<\/p>\n<p>Continuando os cursos do Paul Randal na PluralSight, muitas ideias de posts v\u00e3o surgindo e com o tempo permitindo, colocarei aqui no Blog.<\/p>\n<p>Hoje vou falar de duas fun\u00e7\u00f5es n\u00e3o documentadas que nunca tinha ouvido falar:\u00a0<strong>%%PHYSLOC%%<\/strong> e\u00a0<strong>fn_PhysLocCracker<\/strong>.<\/p>\n<p><!--more--><\/p>\n<p>Criei uma tabela e populei com mil registros para a realiza\u00e7\u00e3o dos testes:<\/p>\n<p>CREATE TABLE TesteLocalizacaoRegistros(<br \/>\nCod INT IDENTITY,<br \/>\nData DATETIME DEFAULT(GETDATE()),<br \/>\nTexto CHAR(1000) DEFAULT(&#8216;FABRICIO LIMA CONSULTORIA SQL SERVER&#8217;))<\/p>\n<p>INSERT INTO TesteLocalizacaoRegistros DEFAULT VALUES<br \/>\nGO 1000<\/p>\n<p>A fun\u00e7\u00e3o\u00a0<em>%%PHYSLOC%%<\/em> mostra de uma forma n\u00e3o entend\u00edvel para n\u00f3s meros mortais, a localiza\u00e7\u00e3o f\u00edsica de cada registro de uma tabela. A utiliza\u00e7\u00e3o dela \u00e9 muito simples conforme abaixo:<\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/PHYSLOC.png\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-2859 aligncenter\" title=\"PHYSLOC\" src=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/PHYSLOC.png\" alt=\"\" width=\"500\" height=\"430\" srcset=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/PHYSLOC-300x257.png 300w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/PHYSLOC-100x86.png 100w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/PHYSLOC-275x236.png 275w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/PHYSLOC-20x17.png 20w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Como podem ver, essa fun\u00e7\u00e3o sozinha n\u00e3o nos ajudaria em nada. Entretanto, algum camarada dos DBAs SQL Server tamb\u00e9m criou uma fun\u00e7\u00e3o chamada\u00a0<em>fn_PhysLocCracker<\/em> que traduz essa informa\u00e7\u00e3o para o nosso dialeto SQL Server.<\/p>\n<p>&nbsp;<\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/PhysLocCracker.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-2860 aligncenter\" title=\"PhysLocCracker\" src=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/PhysLocCracker.png\" alt=\"\" width=\"500\" height=\"420\" srcset=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/PhysLocCracker-100x85.png 100w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/PhysLocCracker-20x17.png 20w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a><\/p>\n<p>Como \u00e9 poss\u00edvel perceber na figura acima, as linhas com a coluna <em>Cod<\/em> de 1 \u00e0 7 da minha tabela est\u00e3o na p\u00e1gina 177, as linhas de 8 \u00e0 14 est\u00e3o na p\u00e1gina 179 e etc&#8230;<\/p>\n<p>At\u00e9 hoje, a forma onde eu via essa informa\u00e7\u00e3o era atrav\u00e9s do comando DBCC PAGE. Segue abaixo um print do Slot 0 da p\u00e1gina 177:<\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/DBCC-PAGE.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-2861 aligncenter\" title=\"DBCC PAGE\" src=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/DBCC-PAGE.png\" alt=\"\" width=\"600\" height=\"350\" srcset=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/DBCC-PAGE-100x59.png 100w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/DBCC-PAGE-20x12.png 20w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Essa informa\u00e7\u00e3o pode ser \u00fatil de v\u00e1rias maneiras no nosso dia a dia.<\/p>\n<p>Um exemplo de como essa informa\u00e7\u00e3o pode nos ajudar \u00e9 na investiga\u00e7\u00e3o de uma corrup\u00e7\u00e3o, que \u00e9 um dos problemas que mais me assustam em um banco de dados.<\/p>\n<p>Imagina que voc\u00ea passou a receber o erro de uma p\u00e1gina corrompida. At\u00e9 hoje eu utilizava o comando DBCC PAGE para descobrir o que tinha dentro dessa p\u00e1gina.<\/p>\n<p>Caso essa p\u00e1gina corrompida seja uma p\u00e1gina de dados, com a informa\u00e7\u00e3o do objeto dono da p\u00e1gina em m\u00e3os, podemos com apenas um SELECT simples descobrir as informa\u00e7\u00f5es envolvidas na corrup\u00e7\u00e3o.<\/p>\n<p>Caso n\u00e3o seja poss\u00edvel realizar esse select na p\u00e1gina corrompida (n\u00e3o fiz esse teste com uma corrup\u00e7\u00e3o de verdade), conseguimos atrav\u00e9s de um backup da base tentar buscar essa informa\u00e7\u00e3o.<\/p>\n<p>Para testar isso, fiz um restore da minha base de dados chamada <em>ConsultoriaSQLServe<\/em>r em uma base chamada <em>ConsultoriaSQLServer_Report<\/em>, exemplo que muitos ambientes j\u00e1 possuem com bases D-1 sendo restauradas diariamente para relat\u00f3rios, e fiz o mesmo select para conferir se as p\u00e1ginas dados s\u00e3o as mesmas ou se existiria alguma altera\u00e7\u00e3o:<\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/Base_Report.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-2862 aligncenter\" title=\"Base_Report\" src=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/Base_Report.png\" alt=\"\" width=\"500\" height=\"530\" srcset=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/Base_Report.png 595w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/Base_Report-283x300.png 283w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/Base_Report-410x434.png 410w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/Base_Report-100x106.png 100w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/Base_Report-275x291.png 275w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/Base_Report-20x20.png 20w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>\u00c9 poss\u00edvel verificar que o resultado foi id\u00eantico. Como tenho bases D-1 em meu ambiente, posso utilizar essa base para rapidamente descobrir o que tem dentro de uma p\u00e1gina corrompida na base de produ\u00e7\u00e3o.<\/p>\n<p>Claro que a base de produ\u00e7\u00e3o pode sofrer altera\u00e7\u00f5es, mas em grande partes dos casos esse teste nos ajudar\u00e1.<\/p>\n<p>Como se trata de uma fun\u00e7\u00e3o n\u00e3o documentada, ela pode desaparecer nas pr\u00f3ximas edi\u00e7\u00f5es do SQL Server, o que seria uma pena.<\/p>\n<p>Realmente um comando para n\u00e3o esquecer. Tanto que estou guardando aqui bem destacado no Blog.<\/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>Ol\u00e1 Pessoal, Continuando os cursos do Paul Randal na PluralSight, muitas ideias de posts v\u00e3o surgindo e com o tempo permitindo, colocarei aqui no Blog. Hoje vou falar de duas fun\u00e7\u00f5es n\u00e3o documentadas que nunca tinha ouvido falar:\u00a0%%PHYSLOC%% e\u00a0fn_PhysLocCracker.<\/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,942,991,33,280],"tags":[1113,69,85,1012,1011,1115,1114,373,422,1009,1010,21,23,261,1013,1112,1008,1111,33],"class_list":["post-2858","post","type-post","status-publish","format-standard","hentry","category-administracao-de-bd","category-consultoria-sql-server","category-dba-remoto","category-sql-server","category-virtual-pass-br","tag-physloc","tag-administracao-de-banco-de-dados","tag-alter-database","tag-base-corrompida","tag-checkdb","tag-como-ler-uma-pagina-de-dados","tag-corrupcao","tag-corrupcao-de-dados","tag-corruption","tag-database-offline","tag-database-pendente-recovery","tag-database-suspect","tag-dba","tag-dbcc-page","tag-emergency-mode","tag-fn_physloccracker","tag-lun","tag-pluralsight","tag-sql-server"],"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts\/2858","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=2858"}],"version-history":[{"count":0,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts\/2858\/revisions"}],"wp:attachment":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/media?parent=2858"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/categories?post=2858"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/tags?post=2858"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}