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://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