Banco de Dados - SQL Server

Como calcular a massa de dados no SQL Server?

Veja nesse artigo como calcular a massa de dados (em tamanho) de uma base de dados.

por Diego Nogare



A algumas semanas atrás precisei fazer uma apresentação para o Comitê de IT do cliente que estou atuando. Essa apresentação continha diversos pontos positivos de utilização de uma certa solução, e para provar precisei apresentar 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 precisei fazer, vou explicar superficialmente: O trabalho era para sincronizar dados de uma aplicação OnLine (Web) com uma OffLine (Win) e o usuário trabalhar desconectado. Uma 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 para esse exemplo no AdventureWorks utilizei o ano de 2003. Um detalhe importante a ser lembrado para a geração deste script, é que a versão do banco de dados que está no cliente é SQL Server 2000.

Para fazer este teste, 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).

Diego Nogare

Diego Nogare - Graduado em Ciência da Computação e Pós-Graduado em Engenharia de Computação com ênfase em Desenvolvimento Web com .NET, Colaborador do Portal Linha de Código, co-Líder do grupo de usuários Codificando .NET, co-Líder dos Microsoft Student Partners [MSP] de São Paulo e Microsoft Most Valuable Professional [MVP] em SQL Server, possui certificações MCP e MCTS em SQL Server 2005, é palestrante em eventos da Microsoft, Codificando .NET e INETA BR, mantém o site: www.diegonogare.net.