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:

  1. Criar a tabela.
  2. Inserir 3 bilhões de registros na tabela.
  3. Realizar o COUNT e analisar o retorno.
  4. 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: