{"id":172,"date":"2013-08-15T13:10:41","date_gmt":"2013-08-15T16:10:41","guid":{"rendered":"http:\/\/gianfratti.com\/?p=172"},"modified":"2013-08-15T21:51:59","modified_gmt":"2013-08-16T00:51:59","slug":"metricas-de-codigo-t-sql-no-sql-server","status":"publish","type":"post","link":"https:\/\/gianfratti.com\/index.php\/metricas-de-codigo-t-sql-no-sql-server\/","title":{"rendered":"M\u00e9tricas de c\u00f3digo T-SQL no SQL Server"},"content":{"rendered":"<p>Ol\u00e1, pessoal! Neste artigo vou comentar sobre como calcular m\u00e9tricas de c\u00f3digo a partir de scripts que contenham stored procedures, fun\u00e7\u00f5es ou instru\u00e7\u00f5es T-SQL. Saber calcular estas m\u00e9tricas \u00e9 importante para ajudar a justificar prazos, recursos e implica\u00e7\u00f5es associadas com a manuten\u00e7\u00e3o de c\u00f3digo fonte desenvolvido na linguagem T-SQL, o dialeto da linguagem SQL utilizada pelo SQL Server.<!--more--><\/p>\n<p>Em geral, \u00e9 raro encontrar programadores que se preocupam muito com as medidas relacionadas com as m\u00e9tricas de c\u00f3digo fonte. Infelizmente esta afirma\u00e7\u00e3o tamb\u00e9m \u00e9 verdade para DBAs, pois geralmente os profissionais est\u00e3o mais preocupados em fazer o c\u00f3digo funcionar e atender a requisitos funcionais do que em realizar um levantamento qualitativo em rela\u00e7\u00e3o ao c\u00f3digo fonte.<\/p>\n<p>Como foi citado no par\u00e1grafo que abre este artigo, as medidas obtidas por m\u00e9tricas espec\u00edficas de c\u00f3digo fonte podem ser \u00fateis para quem est\u00e1 come\u00e7ando a trabalhar com c\u00f3digo legado e, inclusive, <a href=\"http:\/\/imasters.com.br\/artigo\/25067\/desenvolvimento\/manutencao-em-codigo-legado-por-onde-comecar\/\">j\u00e1 escrevi sobre isso em um artigo para o iMasters<\/a>.<\/p>\n<p>Em termos pr\u00e1ticos, o uso dos valores de m\u00e9tricas do c\u00f3digo fonte deve ser utilizado para ajudar a justificar, por exemplo, o tempo necess\u00e1rio para se efetuar uma mudan\u00e7a no c\u00f3digo fonte. Agir desta maneira facilita a conversa com gerentes de projetos e clientes que querem um detalhamento melhor sobre a estimativa de tempo para a realiza\u00e7\u00e3o de uma tarefa que envolve, de uma maneira ou de outra, manuten\u00e7\u00e3o de c\u00f3digo fonte independente da linguagem.<\/p>\n<p>Se a coleta de medidas para m\u00e9tricas de c\u00f3digo fonte j\u00e1 \u00e9 rara para programadores, imagine para DBAs que trabalham programando stored procedures, fun\u00e7\u00f5es, scripts e outros elementos no banco de dados. Como disse, n\u00e3o \u00e9 muito comum encontrar este tipo de atitude entre DBAs.<\/p>\n<p>Mas n\u00e3o precisa ser assim. Hoje em dia existem diversas ferramentas que automatizam o processo de coleta de medidas para m\u00e9tricas de c\u00f3digo fonte, inclusive de dialetos da linguagem SQL. Neste artigo vou comentar como fazer isso para o SQL Server, mas tenham em mente que mesmo DBAs de diferentes bancos de dados que trabalham com o SQL podem se beneficiar desta coleta de m\u00e9tricas, mesmo que n\u00e3o haja muita regra de neg\u00f3cio, programa em stored procedures, scripts ou fun\u00e7\u00f5es no banco de dados.<\/p>\n<p>Umas das ferramentas que mais gosto para coletar m\u00e9tricas \u00e9 o <a href=\"http:\/\/pmd.sourceforge.net\/\" target=\"_blank\">PMD<\/a>, por\u00e9m, infelizmente, n\u00e3o h\u00e1 suporte para a linguagem SQL. J\u00e1 o <a href=\"http:\/\/cloc.sourceforge.net\/\" target=\"_blank\">CLOC<\/a> \u00e9 uma ferramenta\u00a0 de c\u00f3digo livre interessante para contar a quantidade de linhas de c\u00f3digo e coment\u00e1rios e ele trabalha com diversas linguagens, inclusive com o T-SQL. Como exemplo, gerei o c\u00f3digo fonte de todas as system stored procedures criadas pela Microsoft armazenadas no banco de dados master de um servidor SQL Server 2008. Gravei cada uma destas system stored procedures (no total foram 795 arquivos separados) e rodei a ferramenta CLOC para coletar as medidas. O resultado pode ser visto na Figura 1.<a href=\"http:\/\/gianfratti.com\/wp-content\/uploads\/2013\/08\/Figura1_MetricasCLOC.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-171\" alt=\"Figura1_MetricasCLOC\" src=\"http:\/\/gianfratti.com\/wp-content\/uploads\/2013\/08\/Figura1_MetricasCLOC.jpg\" width=\"879\" height=\"308\" srcset=\"https:\/\/gianfratti.com\/wp-content\/uploads\/2013\/08\/Figura1_MetricasCLOC.jpg 879w, https:\/\/gianfratti.com\/wp-content\/uploads\/2013\/08\/Figura1_MetricasCLOC-300x105.jpg 300w\" sizes=\"auto, (max-width: 879px) 100vw, 879px\" \/><\/a><br \/>\nFigura 1. Medidas de tamanho de c\u00f3digo fonte das system stored procedures do SQL Server.<\/p>\n<p>O processo de coleta foi simples: bastou rodar o execut\u00e1vel do CLOC na mesma pasta que continha os scripts e ele j\u00e1 calculou as estat\u00edsticas. O c\u00e1lculo em si n\u00e3o demorou mais de trinta segundos e o trabalhoso mesmo foi gerar os arquivos com as system stored procedures. De qualquer maneira, recomendo a todos que trabalham com scritps que utilizem o CLOC para ter pelo menos a no\u00e7\u00e3o de quantas linhas em branco, com c\u00f3digo e com coment\u00e1rios existem em seus scripts e objetos do SQL Server.<\/p>\n<p>O Visual Studio.NET cont\u00e9m um framework muito interessante para que o desenvolvedor gere estat\u00edsticas e crie suas pr\u00f3prias m\u00e9tricas relacionadas ao c\u00f3digo fonte. <a href=\"http:\/\/blogs.msdn.com\/b\/gertd\/archive\/2009\/01\/01\/creating-t-sql-static-code-analysis-rules.aspx\" target=\"_blank\">Neste artigo<\/a> h\u00e1 um exemplo interessante de como criar regras para a an\u00e1lise est\u00e1tica de c\u00f3digo fonte, inclusive de c\u00f3digo T-SQL.<\/p>\n<p>Outra ferramenta muito interessante para analisar c\u00f3digo T-SQL \u00e9 o <a href=\"http:\/\/www.sqlcodeguard.com\/\" target=\"_blank\">SQL Code Guard<\/a>. Esta ferramenta gratuita \u00e9 um plug-in para o SQL Server Management Studio (SSMS) e permite calcular medidas para m\u00e9tricas de c\u00f3digo, organizar os scripts, visualizar informa\u00e7\u00f5es associadas aos dados e outras funcionalidades. A instala\u00e7\u00e3o \u00e9 simples e um novo item de menu \u00e9 adicionado ao SSMS que cria uma janela na parte de baixo da interface. Utilizei o SQL Code Guard para verificar ocorr\u00eancias importantes (issues) nas system stored procedures do banco de dados master do SQL Server e o resultado pode ser visualizado na Figura 2.<a href=\"http:\/\/gianfratti.com\/wp-content\/uploads\/2013\/08\/Figura2_SQLCodeGuard.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-169\" alt=\"Figura2_SQLCodeGuard\" src=\"http:\/\/gianfratti.com\/wp-content\/uploads\/2013\/08\/Figura2_SQLCodeGuard.jpg\" width=\"1061\" height=\"389\" srcset=\"https:\/\/gianfratti.com\/wp-content\/uploads\/2013\/08\/Figura2_SQLCodeGuard.jpg 1061w, https:\/\/gianfratti.com\/wp-content\/uploads\/2013\/08\/Figura2_SQLCodeGuard-300x109.jpg 300w, https:\/\/gianfratti.com\/wp-content\/uploads\/2013\/08\/Figura2_SQLCodeGuard-1024x375.jpg 1024w\" sizes=\"auto, (max-width: 1061px) 100vw, 1061px\" \/><br \/>\n<\/a>Figura 2. Verificando ocorr\u00eancias importantes nas system stored procedures do banco master.<a href=\"http:\/\/gianfratti.com\/wp-content\/uploads\/2013\/08\/Figura2_SQLCodeGuard.jpg\"><br \/>\n<\/a><\/p>\n<p>Pode-se notar que o conte\u00fado das system stored procedures do SQL Server cont\u00e9m diversos pontos a serem observados. O SQL Code Guard identificou, por exemplo, diversas execu\u00e7\u00f5es din\u00e2micas de c\u00f3digo com o EXECUTE(String) e estrutura IF sem BEGIN\u2026END. Estas ocorr\u00eancias n\u00e3o s\u00e3o erros e n\u00e3o geram problemas de compila\u00e7\u00e3o, por\u00e9m elas n\u00e3o s\u00e3o recomendadas em c\u00f3digo T-SQL por potencialmente gerarem problemas de seguran\u00e7a, dificultarem a leitura do c\u00f3digo e outros fatores. Existem muitas ocorr\u00eancias como esta que s\u00e3o documentadas pelo SQL Code Guard e que podem ajudar um profissional que trabalha com T-SQL a escrever um c\u00f3digo mais leg\u00edvel e, de acordo com as ocorr\u00eancias indicadas, melhor.<\/p>\n<p>Para finalizar, <a href=\"http:\/\/gallery.technet.microsoft.com\/scriptcenter\/Calculate-TSQL-Stored-831b683a\" target=\"_blank\">econtrei um script interessante<\/a> no <a href=\"http:\/\/technet.microsoft.com\/en-us\/scriptcenter\/bb410849.aspx\" target=\"_blank\">Script Center da comunidade Technet<\/a>. Este script calcula tr\u00eas m\u00e9tricas importantes em rela\u00e7\u00e3o a todas as stored procedures e fun\u00e7\u00f5es armazenadas em um banco de dados do SQL Server: a quantidade de linhas, o n\u00famero de objetos referenciados e o n\u00famero de par\u00e2metros. O script tamb\u00e9m indica se a complexidade \u00e9 simples, m\u00e9dia ou alta, de acordo com um c\u00e1lculo interno. A Figura 3 mostra o resultado parcial deste script que analisou as system stored procedures do banco de dados master de um SQL Server 2008.<\/p>\n<p><a href=\"http:\/\/gianfratti.com\/wp-content\/uploads\/2013\/08\/Figura3_RelatorioSystemStoredProcedures.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-170\" alt=\"Figura3_RelatorioSystemStoredProcedures\" src=\"http:\/\/gianfratti.com\/wp-content\/uploads\/2013\/08\/Figura3_RelatorioSystemStoredProcedures.jpg\" width=\"708\" height=\"628\" srcset=\"https:\/\/gianfratti.com\/wp-content\/uploads\/2013\/08\/Figura3_RelatorioSystemStoredProcedures.jpg 708w, https:\/\/gianfratti.com\/wp-content\/uploads\/2013\/08\/Figura3_RelatorioSystemStoredProcedures-300x266.jpg 300w\" sizes=\"auto, (max-width: 708px) 100vw, 708px\" \/><\/a><\/p>\n<p><em>Com informa\u00e7\u00f5es de <a title=\"Imasters\" href=\"http:\/\/imasters.com.br\/banco-de-dados\/sql-server\/metricas-de-codigo-t-sql-no-sql-server\/\" target=\"_blank\">Imasters<\/a><\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ol\u00e1, pessoal! Neste artigo vou comentar sobre como calcular m\u00e9tricas de c\u00f3digo a partir de scripts que contenham stored procedures, fun\u00e7\u00f5es ou instru\u00e7\u00f5es T-SQL. Saber calcular estas m\u00e9tricas \u00e9 importante para ajudar a justificar prazos, recursos e implica\u00e7\u00f5es associadas com a manuten\u00e7\u00e3o de c\u00f3digo fonte desenvolvido na linguagem T-SQL, o dialeto da linguagem SQL utilizada <span class=\"ellipsis\">&hellip;<\/span> <span class=\"more-link-wrap\"><a href=\"https:\/\/gianfratti.com\/index.php\/metricas-de-codigo-t-sql-no-sql-server\/\" class=\"more-link\"><span>Read More &rarr;<\/span><\/a><\/span><\/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,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[18],"tags":[36,76,37],"class_list":["post-172","post","type-post","status-publish","format-standard","hentry","category-sql-server","tag-metricas","tag-sql-server","tag-t-sql"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/posts\/172","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/comments?post=172"}],"version-history":[{"count":3,"href":"https:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/posts\/172\/revisions"}],"predecessor-version":[{"id":175,"href":"https:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/posts\/172\/revisions\/175"}],"wp:attachment":[{"href":"https:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/media?parent=172"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/categories?post=172"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/tags?post=172"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}