Estimando Tamanho / Volumetria de Dados no SQL Server

Olá DBA´s como vão… Esse é meu primeiro post, espero que gostem, ou abra uma discussão para melhorarmos essa estimativa.

É bem provável que em algum momento, você como DBA precisou estimar ou pediu para os desenvolvedores estimarem um tamanho de um banco ou tabelas para algum deploy.

Geralmente no meu ambiente nós pedimos para os “donos dos bancos” nos passarem essa volumetria estimada para reservamos ou solicitarmos mais recursos para a instância, e a resposta geralmente é meia evasiva.

Acabamos aceitando o valor enviado sem termos bem ao certo qual foi o cálculo usado, ou mesmo quando nos é pedido também não apresentamos alguma fórmula ou solução para isso.

Dito isso, recentemente passei por esse mesmo cenário no qual orientei o desenvolvedor calcular os tamanhos das “colunas” versus “o número de linhas” não me atentando a outros fatores.

Após isso busquei no Books Online qual seria o cálculo correto e encontrei o artigo https://docs.microsoft.com/pt-br/sql/relational-databases/databases/estimate-the-size-of-a-database?view=sql-server-ver15 que apresenta uma formula de cálculo.

Senti falta de mais dados, dei um “Googlada” para ver se encontrava mais informações e não encontrei.

Depois de ter criado uma procedure que apresentarei adiante que encontrei esse post, do “Mike Lichtenberg” desenvolveu uma planilha usando o cálculo do Books Online (inclui as imagens de como ele utilizou a planilha para compararmos com a procedure) conforme link a seguir:

https://mlichtenberg.wordpress.com/2013/10/16/estimating-sql-server-table-sizes/

Abaixo segue a procedure e dois exemplos que foram utilizados para o cálculo.
Nomeei a procedure com o nome de estimar_tamanho_heap_sps:

CREATE DATABASE teste_db


use teste_db
go


IF OBJECT_ID('estimar_tamanho_heap_sps') IS NOT NULL
   DROP PROCEDURE estimar_tamanho_heap_sps
GO


CREATE PROCEDURE estimar_tamanho_heap_sps
(
	@num_rows BIGINT,
	@num_cols TINYINT,
	@fixed_data_size DECIMAL(10,4),
	@num_variable_cols TINYINT = 0,
	@max_var_size DECIMAL(10,4)


)
AS
BEGIN


    DECLARE @null_bitmap DECIMAL(10,4) = 0, @variable_data_size INT = 0, @row_size DECIMAL(10,4) = 0
	DECLARE @rows_per_page DECIMAL(10,4), @num_pages DECIMAL (10,4)
    
	SET @null_bitmap = 2 + ((@num_cols + 7) / 8)


	IF @num_variable_cols > 0
	BEGIN 
		SET @variable_data_size = 2 + (@num_variable_cols * 2) + @max_var_size
	END 


	SET @row_size = @fixed_data_size + @variable_data_size + @null_bitmap + 4


    SET @rows_per_page = 8096 / (@row_size + 2)
	
	-- Calcule o número de páginas necessário para armazenar todas as linhas:
	SET @num_pages = @num_rows / @rows_per_page


	-- O número de páginas estimado deve ser arredondado para cima, até a página inteira mais próxima.
	-- SELECT CEILING(@num_pages), @num_pages


	SELECT Tamanho_do_heap_bytes = 8192 * CEILING(@num_pages), Tamanho_do_heap_kbytes = (8192 * CEILING(@num_pages))/1024, Numero_de_Paginas = CEILING(@num_pages)


END

Exemplo 1

Exemplo 2

Obs.: Por se tratar de uma estimativa estou considerando as variações nos tamanhos com relação ao sp_spaceused algo dentro do esperado, mas caso percebam algum erro fiquem à vontade em informar.

Abaixo segue link com os tamanhos dos datatypes.

https://docs.microsoft.com/pt-br/sql/t-sql/data-types/data-types-transact-sql?view=sql-server-ver15

Qualquer dúvida estou à disposição, e muito obrigado por qualquer comentário que queiram fazer.

Forte abraço.
Gilson Souza

Artigos de referência:

https://docs.microsoft.com/pt-br/sql/relational-databases/databases/estimate-the-size-of-a-database?view=sql-server-ver15

https://mlichtenberg.wordpress.com/2013/10/16/estimating-sql-server-table-sizes/

https://docs.microsoft.com/pt-br/sql/t-sql/data-types/data-types-transact-sql?view=sql-server-ver15

 

PS: Este artigo foi publicado originalmente no site https://www.linkedin.com/pulse/estimando-tamanho-volumetria-de-dados-sql-server-gilson-souza/ em 2 de novembro de 2020 e teve autorização do autor para ser publicado no site “O Cara do TI”

Gilson Souza é DBA SQL Server Sênior na Brasilseg na data de publicação deste artigo.

Para contato gsouza.dba@gmail.com ou https://www.linkedin.com/in/gilson-souza-dba-sqlserver/

Revisado por: David Souza

Related posts

Microsoft Exchange: Nova vulnerabilidade pode afetar 97.000 servidores

Microsoft Outlook: Especialistas detalham exploits RCE de clique-zero

Windows 11: Microsoft altera a lista oficial de CPUs Intel compatíveis