Olá galera o/
Nesta postagem vou falar um pouco sobre a função de agregação COUNT_BIG.
Primeiro vamos entender como funciona a função COUNT/COUNT_BIG.
COUNT: Conta a quantidade de registros encontrados em grupo (tabelas, views, functions table-valued, consultas complexas e etc). A função COUNT(<coluna>) conta os registros que aquela coluna possui e ignora valores nulos. A função COUNT (*) conta todos os registros, incluindo valores nulos na contagem. Mais informações sobre a funcção COUNT_BIG no site da Microsoft >> LINK <<
Qual é a principal diferença entre COUNT x COUNT_BIG?
É apenas o tipo de retorno!!! O COUNT retorna o tipo de dados INT enquanto o COUNT_BIG retorna o tipo de dados BIGINT. o de dados int.
Qual é a diferença entre INT x BIGINT?
O tipo de dados INT consome 4 bytes de armazenamento e tem o intervalor de – 2.147.483.648 a 2.147.483.647. Enquanto o tipo BIGINT consome 8 bytes de armazenamento e tem intervalor de -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807, ou seja, se você deseja armazenar numa coluna um valor inteiro que ultrapasse o valor de 2 bilhões e 200 milhões, é necessário utilizar o tipo BIGINT.
Fiz uma postagem aonde menciono a importância da tipagem de dados para o banco de dados e nossas tabelas. O link esta a seguir >> LINK <<.
Cenário: Vamos inserir 3 bilhões de linhas em uma tabela do SQL Server e vamos realizar uma contagem com o COUNT e com o COUNT_BIG para entendermos as diferenças. Para este cenário vamos executar os seguintes passos:
- Criar a tabela.
- Inserir 3 bilhões de registros na tabela.
- Realizar o COUNT e analisar o retorno.
- Realizar o COUNT_BIG e analisar o retorno.
Script de insert das linhas foi retirado da resposta dada a uma pergunta no site do stackoverflow: https://stackoverflow.com/questions/48776162/efficient-way-to-generate-2-billion-rows-in-sql-server-2014-developer
Criando a tabela:
Primeiro vamos criar uma tabela com apenas 1 coluna chamada qtd_numeros com o tipo BIGINT
CREATE TABLE [dbo].[Tb_3_billions_rows]
(
[qtd_numeros] [bigint]
)
Script para inserir 3 bilhões de linhas na tabela:
Vamos executar o script obtido através do stackoverflow para inserirmos as 3 bilhões de linhas na tabela. A execução deste script no meu laptop pessoal demorou mais ou menos 30 minutos. Se alguém souber um script que execute mais rápido a inserção desta quantidade de registros, por favor me enviar nos comentários.
Obs.1: O script esta sendo executado em uma INSTANCIA com a versão SQL Server 2019 DEVELOPER. Estou utilizando esta versão por conta da limitação de 10 GB da versão Express.
Obs.2: Ao final do processo de inserção dos registros, o banco de dados vai estar consumindo cerca de 50 GB de disco. Para analisar o tamanho, clicar com o botão direito em cima da database e selecionar a opções Properties.
Obs.3: Este processo pode ser executado com mais performance e menos tempo em um ambiente de nuvem como o Azure. Como estou executando em uma máquina local a performance é comprometida.
Configuração do meu Laptop:
Fabricante: DELL
Modelo: Inspiron 5584
Processador: i7 8ª geração
Memória: 16 GB
SSD: 540 GB
HDD: 1 TB
SET NOCOUNT ON;
DECLARE
@TargetRowCount bigint = 3000000000
, @RowsInserted bigint = 0;
WHILE @RowsInserted < @TargetRowCount
BEGIN
WITH
t10 AS (SELECT n FROM (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) t(n))
,t1k AS (SELECT 0 AS n FROM t10 AS a CROSS JOIN t10 AS b CROSS JOIN t10 AS c)
,t10m AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 0)) AS num FROM t1k AS a
CROSS JOIN t1k AS b CROSS JOIN t10 AS c)
INSERT INTO [dbo].[Tb_3_billions_rows] WITH(TABLOCKX)
SELECT num + @RowsInserted
FROM t10m;
SET @RowsInserted += ROWCOUNT_BIG();
END;
GO
Executando contagem dos registros com a função COUNT.
Percebam que foi exibido uma mensagem erro (“Arithmetic overflow error converting expression to data type int.”) informado que não foi possível converter o valor em questão para INT, ou seja, a mensagem foi exibida porque a quantidade de registros ultrapassou o intervalo do tipo INT. Para conseguirmos realizar esta contagem, utilizamos a função COUNT_BIG.
select count([qtd_numeros]) from [dbo].[Tb_3_billions_rows]
Executando contagem dos registros com a função COUNT_BIG.
Percebam que agora a contagem dos registros foi realizada com sucesso, porque a função COUNT_BIG atinge o intervalo de valores que necessitamos.
select count_big([qtd_numeros]) from [dbo].[Tb_3_billions_rows]
Após todo o processo realizado, vamos liberar espaço para nosso database. Iremos fazer os seguintes passos.
1 – Executar o comando TRUNCATE TABLE na tabela.
2 – Executar a atividade de Shrink Database. Esta atividade reduzirá o tamanho dos meus arquivos MDF e LDF.
2.1 – Botão direito em cima da database > selecionar a opção Task > Shrink > Database)
2.2 – Na tale exibida analisar o tamanho atual do banco e clicar em OK.
3 – Analisar o tamanho da database.
TRUNCATE TABLE [dbo].[Tb_3_billions_rows]
A postagem de hoje acaba por aqui pessoal, espero que tenham aprendido um pouco sobre o COUNT_BIG. Espero que este post seja útil nos seus estudos ou no seu trabalho.
Desejo a todos uma boa leitura, boa prática e bons estudos.
Para quem quer estudar:
- Para a Certificação Microsoft MTA Database Fundamentals | Banco de Dados Relacional e Linguagem T-SQL.
- Segue o link do curso na Udemy. >> LINK <<
- Sobre Bancos da Dados no Azure
- Segue o link do curso na Udemy. >> LINK <<
Quem quiser mandar comentários, sugestões, criticas e complementos, fiquem a vontade, pois feedbacks positivos ou negativos engradecem meu conhecimento para que possa melhorar as postagem para vocês.
Até a próxima o/
Acessem nossas Redes Sociais: