Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL Server – Disseque os internos de sp_spaceused


Este artigo é um esforço para dissecar a saída do sp_spaceused procedimento armazenado.

Introdução


Compreender os componentes internos de uso do banco de dados e as tendências de crescimento desempenham um papel vital na definição do dimensionamento correto do banco de dados. sp_spaceused é provavelmente o procedimento armazenado de sistema mais amplamente executado de um administrador para localizar o espaço em disco usado por um banco de dados. Isso ajuda a obter uma visão rápida do uso do banco de dados. Estatisticas. sp_spaceused é usado para exibir o número de linhas, o tamanho dos dados, o tamanho do índice, a quantidade de espaço usado, o espaço não utilizado por cada objeto e o tamanho não alocado do banco de dados. Apesar de olhar para os valores fornecidos por sp_spaceused, não se deve pensar em reduzir o banco de dados ou arquivo de dados ou arquivo de log. Muitas vezes, não temos consciência do que estamos fazendo. Muitas vezes, não sabemos quais seriam os efeitos posteriores de fazer tais operações intrínsecas de recursos. A saída de sp_spaceused nos diz muito sobre o desempenho atual do banco de dados. O não alocado coluna e o não utilizado coluna nos informa o espaço livre deixado no banco de dados e os níveis da tabela.

Este artigo considera:
  1. Uma olhada em sp_spaceused
  2. Impacto da configuração de crescimento automático nas colunas, não alocado e não utilizado
  3. Encontrando os detalhes de uso do espaço no banco de dados e nos níveis de instância
  4. Medindo os eventos de crescimento automático
  5. Encontrando os tamanhos de arquivo mdf e ldf
  6. Fatores que determinam o desempenho do banco de dados
  7. E mais…

Internos de sp_spaceused

Capturar detalhes de uso de espaço de todas as tabelas


No T-SQL abaixo, o procedimento armazenado não documentado sp_MSforeachtable é usado para percorrer todas as tabelas dentro do escopo do contexto de banco de dados atual para obter as métricas de uso de espaço de todas as tabelas no contexto.
Declare @tbl_sp_spaceused table(
    name varchar(100) NULL,
    rows bigint NULL,
    reserved varchar(20) NULL,
    data varchar(20) NULL,
    index_size varchar(20) NULL,
    unused varchar(20) NULL
    )

-- insert output of sp_spaceused to table variable

INSERT INTO @tbl_sp_spaceused ( name, rows, reserved, data, index_size, unused )
EXEC sp_MSforeachtable @command1 = 'EXEC sp_spaceused [?]'

SELECT *
FROM @tbl_sp_spaceused
order by rows desc

Capturar detalhes de uso de espaço de todos os bancos de dados


O procedimento armazenado não documentado sp_MSforeachDB é usado para percorrer todo o banco de dados dentro do escopo da instância SQL atual para obter as informações de uso de espaço de todos os bancos de dados.
declare @tbl_sp_spaceusedDBs table(
    database_name varchar(100) NOT NULL,
    database_size varchar(50) NULL,
    unallocated varchar(30) NULL,
    reserved varchar(20) NULL,
    data varchar(20) NULL,
    index_size varchar(20) NULL,
    unused varchar(20) NULL
    )
INSERT INTO @tbl_sp_spaceusedDBs ( database_name, database_size, unallocated, reserved, data, index_size, unused )
EXEC sp_msforeachdb @command1="use ? exec sp_spaceused @oneresultset = 1"

SELECT *
FROM @tbl_sp_spaceusedDBs
ORDER BY database_name, database_size



Aqui, database_name é o nome do banco de dados; neste caso, PythonSample . database_size é o Ualocado+Reservado+Dados+Índice+Não Usado =MDF +LDF (=848 MB neste caso). O não alocado espaço aqui é 51,94 MB.

Este é, na realidade, o limite do disco que foi marcado para o banco de dados. O sp_spaceused gera uma coluna não alocada definida no nível do banco de dados e não é reservada para nenhuma tabela e pode ser ocupada pelo primeiro objeto que reivindica mais espaço para crescer.

O não alocado space é o espaço livre dentro do arquivo de dados para que ele não precise crescer automaticamente toda vez que você emitir uma consulta; geralmente, o SQL Server Storage Engine gerencia o crescimento automático usando um mecanismo conhecido como Algoritmo de Preenchimento Proporcional. O gerenciamento das extensões é feito de forma eficaz com base no número de gravações que ocorrem nos arquivos. E, ao mesmo tempo, quando o espaço usado atinge um limite, um evento é acionado para um crescimento automático adicional. Definir o valor correto do espaço não alocado depende das necessidades e das situações e da natureza do uso do banco de dados. O espaço não alocado é o espaço que ainda não está em uso e está “disponível”. Em essência, essas extensões são marcadas com o bit 1 na página GAM. Compreendendo o conceito de autocrescimento de cima, qualquer tipo de crescimento pode gerar mais extensões não alocadas.

Usando a seguinte consulta SQL, podemos ver o número de vezes que o evento de crescimento automático foi gerado, juntamente com a quantidade de tempo que o banco de dados manteve em espera para o processo.
DECLARE @fname NVARCHAR(1000);

-- Get the name of the current default trace
SELECT @fname = CAST(value AS VARCHAR(MAX))
FROM ::fn_trace_getinfo(DEFAULT)
WHERE traceid = 1 AND property = 2;


SELECT 
	 ft.StartTime [Start Time]
	,t.name [Event Name]
	,DB_NAME(ft.databaseid) [Database Name]
	,ft.Filename [File Name]
	,(ft.IntegerData*8)/1024.0 [Growth MB]
	,(ft.duration/1000) [Duration MS]
FROM ::fn_trace_gettable(@fname, DEFAULT) AS ft 
INNER JOIN sys.trace_events AS t ON ft.EventClass = t.trace_event_id  
WHERE (ft.EventClass = 92  -- DateFile Auto-growth
    OR ft.EventClass = 93) -- LogFile Auto-growth
ORDER BY ft.StartTime



Vejamos o que significa cada um dos termos:

Reservado :O espaço reservado para uso por objetos de banco de dados =(Dados + Índice + Não Usado ) =476704 + 1280 + 1312 =479296 KB. Isso indica o quanto os objetos estão cheios; idealmente, 10% do espaço não utilizado é esperado para tabelas transacionais.

Dados :O tamanho real dos dados. Esta é a soma de todos os arquivos de dados do banco de dados.

Índice :A quantidade de espaço usada pelo índice.

Observação:em alguns casos, vi que o tamanho do índice é maior que o tamanho dos dados reais. No que diz respeito aos índices, o que é necessário para o sistema sempre depende do desempenho do banco de dados. Muitas vezes, as operações de leitura são mais importantes que as operações de gravação. E em alguns outros casos, as gravações são mais importantes que as leituras. Nos casos em que a empresa decidiu que as leituras são muito mais importantes do que as gravações, esse sistema pode precisar de vários índices para satisfazer os requisitos de desempenho da empresa e dos usuários.

Não usado :uma parte do espaço reservado, que ainda não é usado

Não utilizadas são páginas em extensões alocadas, mas ainda não são usadas por nenhum objeto. Assim que uma extensão é alocada (como uma extensão uniforme ou compartilhada), obtemos oito páginas reservadas nessa extensão. Algumas páginas são usadas e outras não são usadas.

O não usado e não alocado colunas na saída podem ser confusas. Para esclarecer, o não usado a saída da coluna não mostra a quantidade de espaço livre restante em todo o banco de dados. É, em vez disso, a quantidade total de espaço reservado para tabelas, mas não preenchido com dados. Em muitos casos, o espaço não utilizado pode ser recuperado criando um índice clusterizado ou gerenciando os índices existentes.

A saída de sp_spaceused pode ser simplificada ainda mais para localizar o tamanho do arquivo .mdf e dos arquivos .log. A soma do espaço reservado e do espaço não alocado é mais ou menos igual ao tamanho do arquivo de dados — ou MDF. Além disso, subtrair o tamanho do arquivo MDF do tamanho do banco de dados fornece o tamanho do arquivo de log.

Então aqui estão duas fórmulas:

Tamanho do arquivo MDF =reservado + espaço não alocado

Tamanho do arquivo de log =Database_Size – Tamanho do arquivo MDF
SELECT 476704+ 1280+ 1312 'Reserved KB', (479296/1024.00)+51.94 'MDFSizeMB', 848.00 - ((479296/1024.00)+51.94) 'LogSizeMB'



Os pontos mencionados acima nos dizem como cada uma das colunas na saída de sp_spaceused é interpretada, calculada e analisada.


Impacto da configuração de crescimento automático


Os tamanhos iniciais e a configuração de crescimento automático têm um efeito significativo no espaço não utilizado. Definir os valores certos para estes é um desafio. Já vi muitos casos em que o crescimento automático foi definido para crescer em termos de porcentagens. Vamos supor que o crescimento automático esteja definido em 25% para um tamanho de arquivo de dados de 100 GB. São necessários apenas 4 eventos de crescimento automático para preencher a unidade de disco.

O outro caso é reconstruir os índices. Essa operação tem um impacto direto no espaço não utilizado da tabela, pois os dados são reordenados entre as extensões uniforme e mista. Em alguns casos, ao reordenar as páginas, a operação pode induzir espaço não alocado devido à configuração de crescimento automático do arquivo de dados.

Vamos considerar um cenário em que a configuração de crescimento automático não está definida corretamente no banco de dados. Isso é novamente um problema:se o crescimento automático estiver habilitado no banco de dados, isso significa que a expansão da unidade ocorre automaticamente durante algum evento, mesmo que os dados não usem todo o espaço.

É sempre uma boa prática definir a configuração de crescimento automático apropriada para o arquivo de dados. Às vezes, a configuração incorreta do arquivo de dados pode injetar fragmentação física, resultando em grave degradação do desempenho do sistema. Em outras palavras, se você não tiver espaço não alocado, os novos dados tentarão ficar em locais vazios que podem estar dispersos. Isso também se aplica ao arquivo de log. O espaço não alocado no banco de dados influencia indiretamente a configuração de crescimento automático do arquivo de dados e do arquivo de log e influencia diretamente o desempenho. A chave é encontrar o equilíbrio certo.

Encerrando

  1. No processo de criação do banco de dados, o tamanho definido (ou seja, é o tamanho inicial) nada mais é do que o tamanho real do banco de dados. Esse tamanho inicial é registrado no Cabeçalho da Página. Durante um processo de redução de banco de dados, o processo usa o tamanho mínimo como referência, somente se o tamanho real dos dados for menor que o tamanho mínimo — o tamanho mínimo também é encontrado no cabeçalho da página e pode ser visto usando o comando DBCC PAGE. Além disso, o mesmo processo é válido para DBCC SHRINKFILE, que reduz os arquivos para menos do que seus tamanhos iniciais.
  2. Não é uma prática recomendada reduzir o banco de dados para liberar espaço em disco, embora a decisão dependa do cenário — cenários incomuns podem justificar uma ação não convencional. No entanto, deve-se lembrar que a redução de um banco de dados introduz fragmentação no banco de dados. É sempre uma boa prática analisar a causa raiz do espaço não alocado e espaço não utilizado dos objetos. Em muitos casos, expandir o disco para lidar com o crescimento de dados seria uma opção viável/recomendada.
  3. Configuração de crescimento automático:quando o SQL Server executa uma operação de crescimento automático, a transação que acionou o evento de crescimento automático terá que esperar até que o evento de crescimento automático seja concluído. Só então a transação em si pode ser concluída.
  4. É sempre recomendável definir as opções de crescimento automático em números em vez de porcentagens.
  5. A indução de espaço não utilizado na tabela pode ser devido aos seguintes motivos:
    • Fragmentação
      Quando os dados são fragmentados devido à sua natureza e tipo de definição, algum espaço não utilizado é gerado. Além disso, uma modificação frequente dos dados (todas as operações UPDATE, INSERT ou DELETE) leva a um maior número de divisões de página, o que provavelmente gerará espaço não utilizado na tabela.
    • Nenhum índice clusterizado na tabela
      Para reduzir a fragmentação em um heap, pode-se pensar em criar um índice clusterizado na mesa. Para reduzir a fragmentação do índice, execute a manutenção do índice determinando o valor avg_fragmentation_in_percent.
    • Tamanho dos dados
      Em alguns casos, o uso de Tipos de Dados apropriados produz linhas de dados menores que, por sua vez, permitem colocar mais linhas em uma página. Ele não apenas reduz o espaço interno não utilizado, mas também afeta o desempenho, reduzindo o número de divisões de página.
  6. O espaço não utilizado também pode ser resultado da eliminação da coluna de comprimento variável. Use DBCC CLEANTABLE depois de fazer alterações significativas nas colunas de comprimento variável em uma tabela ou exibição indexada para recuperar imediatamente o espaço não utilizado. Como alternativa, você pode reconstruir os índices na tabela ou exibição; no entanto, esta é uma operação que consome mais recursos.
  7. O espaço não utilizado é relativamente maior quando acabamos carregando dados relativamente maiores (>8 KB). Nesses casos, acabamos com grandes quantidades de espaço não utilizado nas páginas de dados.
  8. Após uma migração do SharePoint, pode-se ver uma quantidade significativa do espaço não utilizado introduzido nos bancos de dados. A recuperação é um processo mais lento, o processo de limpeza fantasma remove essas páginas e a liberação ocorre ao longo de um período de tempo.
  9. Em alguns casos, os valores de sp_spaceused podem não estar corretos. Embora sp_spaceused obtenha suas informações do objeto do sistema que contém todas as estimativas, às vezes pode ser impreciso. Uma das razões para isso é que durante uma migração de banco de dados, ou no caso de estatísticas desatualizadas, ou quando o sistema está passando por modificações frequentes de DDL, ou após realizar grandes operações de cópia em massa. Para sincronizar objetos do sistema, use as instruções DBCC updateusage(0) ou DBCC CHECKTABLE para garantir que sp_spaceused retorne dados precisos e atualizados. No entanto, lembre-se de que os comandos DBCC consomem muitos recursos; ter uma boa compreensão da implicação de seu uso. Quando executamos o comando DBCC updateusage, o Mecanismo de Banco de Dados do SQL Server verifica as páginas de dados no banco de dados e faz as correções necessárias nas sys.allocation_units e sys.partitions visualizações de catálogo sobre o espaço de armazenamento usado por cada tabela.

Referências

  • https://msdn.microsoft.com/en-us/library/cc280360.aspx
  • https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-cleantable-transact-sql
  • https://docs.microsoft.com/en-us/sql/relational-databases/system-catalog-views/sys-database-files-transact-sql