Como calcular a massa de dados no SQL Server?

Fala galera, semana passada precisei fazer uma apresentação para o Comitê de IT do cliente que estou atuando. Essa apresentação tinha diversos pontos positivos de utilização de uma certa solução, e pra provar precisei mostrar alguns números. Foi necessário calcular a massa de dados (em tamanho) das informações que estavam sendo apresentadas e sincronizadas.

Para ficar claro o que precisamos fazer, vou tentar explicar superficialmente: O trabalho é pra sincronizar dados de uma aplicação OnLine (Web) com uma OffLine (Win) e o usuário trabalhar desconectado. A solução existente (não podemos mudar) realiza dois sincronismos: um na hora que o sistema é aberto a primeira vez e o segundo de tempos em tempos quando o usuário está conectado à Internet.

Bom, o pessoal do Comitê precisava saber o tamanho dos dados que seriam sincronizados no primeiro e no segundo momento. Então, criei um script e rodei em produção para me devolver essas informações. Por questões de sigilo dos dados, vou adaptar o script para rodar em cima do AdventureWorks e mostrar o resultado pra vocês. Com os dados reais fiz a consulta de 2009, mas pra esse exemplo utilizei 2003.

Gostaria de agradecer o Laerte Junior por me ajudar em um pedaço do script, eu mandei o código para ele e prontamente ele me respondeu com o pedaço que estava dando erro, corrigido! Se não fosse ele, eu teria perdido mais algumas horas. Tks brother!

Caso alguém não tenha o AdventureWorks, pode baixar gratuitamente.

SQL Server 2008: http://msftdbprodsamples.codeplex.com/releases/view/37109

SQL Server 2008 R2: http://msftdbprodsamples.codeplex.com/releases/view/24854

O script é esse:

SET NOCOUNT ON

/* Máximo de bytes do primeiro sincronismo */
print(‘*********************************************************’)
print(‘Máximo de bytes do primeiro sincronismo [VENDAS]’)

CREATE TABLE #TB_MASSA_TOTAL
(NAME varchar(100) null
,rows int
,reserved varchar(10)
,data varchar(10)
,index_size varchar(10)
,unused varchar(10))

CREATE TABLE #TB_EXECS
(CODIGO varchar(100))

INSERT INTO #TB_EXECS (codigo)
SELECT ‘ EXEC sp_spaceused N”Sales.’ + name + ”’;’ from sysobjects where name like ‘%Sales%’ and xtype = ‘U’

DECLARE @SCRIPT VARCHAR(100)
DECLARE cr_cursor CURSOR
FOR SELECT codigo FROM #TB_EXECS
OPEN cr_cursor
FETCH NEXT FROM cr_cursor INTO @SCRIPT
WHILE @@FETCH_STATUS = 0
    BEGIN
        INSERT INTO #TB_MASSA_TOTAL EXEC (@script)
        FETCH NEXT FROM cr_cursor INTO @script
    END

CLOSE cr_cursor
DEALLOCATE cr_cursor

SELECT (SUM(CONVERT(INT, REPLACE(reserved,’ KB’,”))) + SUM(CONVERT(INT, REPLACE(index_size,’ KB’,”))) ) / 1024 [MB]
      ,(SUM(CONVERT(INT, REPLACE(reserved,’ KB’,”))) + SUM(CONVERT(INT, REPLACE(index_size,’ KB’,”))) ) [KB]
      ,(SUM(CONVERT(INT, rows))) [LINHAS]
FROM #TB_MASSA_TOTAL

/* Qtd de Vendas em 2009 */
print(‘*********************************************************’)
print(‘Qtd de Vendas em 2003’)
select count(0) [Qtd]
from Sales.SalesOrderDetail s inner join
     Sales.SalesOrderHeader h
     on s.SalesOrderID = h.SalesOrderID
where h.OrderDate between ‘2003-01-01’ and ‘2003-12-31’

/* Qtd de CPRs criadas em 2009 separadas por mês */
print(‘*********************************************************’)
print(‘Qtd de Vendas em 2003 separadas por mês’)
select case month(h.OrderDate)
        when 1 then ’01 (Jan)’
        when 2 then ’02 (Fev)’
        when 3 then ’03 (Mar)’
        when 4 then ’04 (Abr)’
        when 5 then ’05 (Mai)’
        when 6 then ’06 (Jun)’
        when 7 then ’07 (Jul)’
        when 8 then ’08 (Ago)’
        when 9 then ’09 (Set)’
        when 10 then ’10 (Out)’
        when 11 then ’11 (Nov)’
        when 12 then ’12 (Dez)’ end [Mês], count(*) Qtd
from Sales.SalesOrderDetail s inner join
     Sales.SalesOrderHeader h
     on s.SalesOrderID = h.SalesOrderID
where h.OrderDate between ‘2003-01-01’ and ‘2003-12-31’
group by month(h.OrderDate)
order by Mês

/* Máximo de qtd de Bytes (por linha) na tabela eCPR_CPR */
print(‘*********************************************************’)
print(‘Máximo de qtd de Bytes (por linha) na tabela de Detalhes’)
select (sum(c.length) / 8) [Bytes]
from syscolumns c
    inner join sysobjects o
on c.id = o.id
where o.name = ‘SalesOrderDetail’

print(‘*********************************************************’)
print(‘Máximo de qtd de Bytes (por linha) na tabela de Cabeçalho’)
select (sum(c.length) / 8) [Bytes]
from syscolumns c
    inner join sysobjects o
on c.id = o.id
where o.name = ‘SalesOrderHeader’

DROP TABLE #TB_MASSA_TOTAL
DROP TABLE #TB_EXECS

SET NOCOUNT OFF

e o resultado apresentado é esse:

*********************************************************
Máximo de bytes do primeiro sincronismo [VENDAS]
MB          KB          LINHAS
———– ———– ———–
32          32848       180675

*********************************************************
Qtd de Vendas em 2003
Qtd
———–
51237

*********************************************************
Qtd de Vendas em 2003 separadas por mês
Mês      Qtd
——– ———–
01 (Jan) 1227
02 (Fev) 1936
03 (Mar) 1487
04 (Abr) 1743
05 (Mai) 2641
06 (Jun) 2019
07 (Jul) 3600
08 (Ago) 7585
09 (Set) 7653
10 (Out) 5959
11 (Nov) 7085
12 (Dez) 8302

*********************************************************
Máximo de qtd de Bytes (por linha) na tabela de Detalhes
Bytes
———–
15

*********************************************************
Máximo de qtd de Bytes (por linha) na tabela de Cabeçalho
Bytes
———–
65

Em posse dessas informações consegui apresentar os dados necessários para o comitê de IT do cliente que ficou impressionado com o “detalhe” das informações. Eles esperavam algo superficial, e com o resultado apresentado, ficaram super satisfeitos e contentes (e ganhamos pontos para fechar mais projetos).

Gostaria de ver nos comentários de vocês outras formas que encontraram para chegar a um resultado destes.

Sobre Diego Nogare 350 Artigos
Diego Nogare é Gerente Técnico de Engenharia de Machine Learning no Itaú-Unibanco. Também é professor em programas de pós graduação no Mackenzie e na FIAP, em São Paulo. Foi nomeado como Microsoft MVP por 11 anos seguidos, e hoje faz parte do programa Microsoft Regional Director.