Recentemente, eu estava trabalhando em um projeto de melhoria de desempenho de banco de dados. Um procedimento armazenado estava causando problemas. Em seu código, uma consulta preencheu o Count das linhas e armazenou o valor em uma variável local. Essa consulta estava examinando uma grande tabela. Devido a isso, a utilização de recursos tornou-se significativamente maior. Para corrigir o problema, removemos o código defeituoso e usamos as exibições de catálogo do SQL Server para gerar a contagem de linhas da tabela.
Existem várias maneiras de contar o número de linhas em uma tabela do SQL Server. Este artigo irá descrevê-los para você sempre escolher o caminho certo para fazê-lo.
Podemos obter a contagem de linhas da tabela com qualquer um dos seguintes métodos:
- Use a função COUNT().
- Combinando exibições de catálogo do SQL Server.
- Usando sp_spaceused procedimento armazenado.
- Usando o SQL Server Management Studio.
Vamos cavar mais fundo.
Obter contagem de linhas usando COUNT(*) ou Count(1)
Podemos usar a função COUNT(*) ou COUNT(1) – os resultados gerados por essas duas funções são idênticos.
Para obter a contagem de linhas, vamos primeiro executar a consulta usando COUNT(*). Para fins de demonstração, defini o valor de STATISTICS IO como ON.
USE wideworldimporters
go
SELECT Count(*)
FROM tblcustomer
go
Saída:
Estatísticas de E/S:
Table 'tblCustomer'. Scan count 1, logical reads 691, physical reads 315, page server reads 0, read-ahead reads 276, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Como você pode ver, o SQL Server precisa realizar 691 leituras lógicas para satisfazer o resultado.
Agora, vamos executar a consulta usando COUNT(1):
USE wideworldimporters
go
SELECT Count(1)
FROM tblcustomer
go
Saída:
Estatísticas de E/S:
Table 'tblCustomer'. Scan count 1, logical reads 691, physical reads 687, page server reads 0, read-ahead reads 687, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Novamente, o SQL Server deve realizar 691 leituras lógicas para satisfazer o resultado.
Devemos mencionar que existe uma opinião de que a função Count (1) é mais rápida que a função Count (*). No entanto, como você pode ver nos exemplos acima, os conjuntos de resultados e as estatísticas de E/S são os mesmos. Portanto, você pode usar qualquer método para gerar a contagem de linhas das tabelas.
Prós:
A função COUNT preenche um número preciso de linhas da tabela.
Contras:
Quando você executa a função COUNT, ela coloca um bloqueio na mesa. Outras consultas que acessam a tabela precisam esperar até que o resultado seja gerado. Se você estiver trabalhando em um sistema ocupado com uma tabela com milhões de linhas, é melhor evitar executar a função COUNT durante o horário comercial, a menos que precise preencher a contagem exata de linhas da tabela.
Combinando exibições de catálogo do SQL Server
Podemos usar exibições de catálogo do SQL Server com as seguintes exibições de gerenciamento dinâmico:
- sys.tables – preenche a lista de tabelas.
- sys.indexes – preenche a lista de índices da tabela.
- sys.partitions – preenche as linhas de cada partição.
Para obter a contagem de linhas, execute o seguinte script:
SELECT a.NAME,
c.NAME,
Sum(b.rows)
FROM sys.tables a
INNER JOIN sys.partitions b
ON a.object_id = b.object_id
INNER JOIN sys.indexes c
ON b.index_id = c.index_id
AND b.object_id = c.object_id
WHERE a.object_id = Object_id('tblCustomer')
AND c.index_id < 2
Saída:
A consulta preenche o nome da tabela , nome do índice, e linhas totais em todas as partições.
Agora, vamos revisar as estatísticas de IO:
Table 'syssingleobjrefs'. Scan count 3, logical reads 6, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'sysidxstats'. Scan count 1, logical reads 6, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'sysschobjs'. Scan count 0, logical reads 4, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'sysrowsets'. Scan count 2, logical reads 14, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Como você pode ver, a consulta realiza apenas 30 leituras lógicas.
Prós:
Essa abordagem é mais rápida que a função COUNT. Ele não adquire um bloqueio na tabela de usuários, portanto, você pode usá-lo em um sistema ocupado.
Contras:
O método preenche uma contagem aproximada de linhas. Na documentação da Microsoft de sys.partitions, você pode ver que as linhas coluna traz o número aproximado de linhas para as partições.
Assim, se você estiver procurando por uma consulta que traga o resultado mais rápido que a função COUNT, você pode usar esta. No entanto, o resultado pode ser impreciso.
Usar sp_spaceused
O sp_spaceusado O procedimento junto com a contagem de linhas fornece os seguintes detalhes:
- Nome – o nome da tabela
- Linhas – a contagem das linhas em uma tabela.
- Reservado – o espaço total reservado para uma tabela.
- Dados – o espaço total usado pela tabela.
- Tamanho_índice – o espaço total usado pelo índice.
- Não usado – o espaço total reservado para uma tabela que não é usada.
A sintaxe é:
EXEC Sp_spaceused 'database_name.schema_name.table_name'
A pergunta:
EXEC Sp_spaceused 'WideWorldImportors.dbo.tblCustomer'
Saída:
Usar o SQL Server Management Studio
Para obter a contagem de linhas da tabela, podemos usar o SQL Server Management Studio.
Abra o SQL Server Management studio> Conecte-se à instância do banco de dados> Expanda Tabelas> Clique com o botão direito do mouse em tblCustomer> Propriedades
Na Tabela Propriedades janela, clique em Armazenamento . Você verá a Contagem de linhas valor à direita:
Outra opção para obter o número de linhas em uma tabela vem com o SQL Complete SSMS Add-in. Com esse aprimoramento, você pode ver o número estimado de linhas em uma dica ao passar o mouse sobre o nome de uma tabela na janela Object Explorer. Dessa forma, você pode obter os dados necessários em um modo visual sem nenhum esforço adicional.
Conclusão
Este artigo explicou diferentes abordagens para calcular o número total de linhas da tabela, em particular:
- Usando a função COUNT.
- Combinando diferentes visualizações de catálogo.
- Usando sp_spaceused procedimento armazenado.
- Usando o SQL Server Management Studio.
Não há necessidade de se ater a apenas um método. Cada variante tem suas especificidades, e você pode aplicar aquela que for mais adequada à sua situação.