O espaço livre de mdf e ldf não corresponde ao espaço livre do banco de dados


9

No SSMS, vi propriedades relacionadas ao tamanho do arquivo e encontrei abaixo os detalhes de um banco de dados. Aqui, os valores não correspondem a outras propriedades. Aqui, o tamanho do mdf, ldf e tamanho total corresponde a outros valores em cada janela. Mas O espaço livre disponível de mdf e ldf, se adicionado, não é igual a Espaço livre disponível mostrado na janela de redução do banco de dados e espaço livre mostrado nas propriedades do banco de dados. Isso vale para qualquer banco de dados. Por que é tão? Por favor, alguém pode explicar a lógica por trás disso?

Em propriedades do banco de dados:

Tamanho: 91,31 MB
Espaço disponível: 13,40 MB

Em propriedades do arquivo de banco de dados:

tamanho mdf: 17 MB
tamanho ldf: 75 MB

sob encolher banco de dados:

Tamanho atualmente alocado: 91,31 MB
Espaço livre disponível: 13.40 MB

em reduzir arquivo-para arquivo de dados:

tamanho atualmente alocado: 16,38 MB de
espaço livre disponível: 12,63 MB

em reduzir arquivo-para arquivo de log:

tamanho atualmente alocado
: 74,94 MB Espaço livre disponível: 55.62 MB

Respostas:


11

Isso realmente não parece tão louco, mas observe que algumas das caixas de diálogo da interface do usuário podem não ter informações completamente atualizadas (é por isso que temos coisas como DBCC UPDATEUSAGE ) e o arredondamento também pode estar envolvido em algumas dessas cálculos. Por fim, as caixas de diálogo mostram o espaço total para todo o banco de dados , mas o espaço não alocado é calculado apenas para os arquivos de dados , não para o log.

Vamos unir algumas coisas.

  1. As propriedades do banco de dados e o banco de dados de redução mostram a mesma coisa (não é necessário que você esteja na interface do banco de dados de redução de qualquer maneira!).
  2. As propriedades do arquivo de banco de dados mostram 17 + 75 = 92 que, com o arredondamento antes da adição, é provavelmente o mesmo 91,31 em 1.
  3. Para o espaço alocado, a redução para arquivos individuais mostra 16,38 + 74,94 = 91,32 - novamente, provavelmente alguns arredondamentos, caso contrário, exatamente corresponde a 1.
  4. Para o espaço disponível, a redução de arquivos individuais é o único lugar em que suspeito uma discrepância real, e isso ocorre porque a interface do usuário é inconsistente sobre onde obtém seus dados e alguns desses locais estão sujeitos ao cache que requer DBCC UPDATEUSAGE.

Deixe-me ver o que essas caixas de diálogo diferentes executam para minha cópia local do AdventureWorks2012 (com determinadas tabelas ampliadas a partir deste script ).

EXEC sp_spaceused;

Isso retorna (apenas o primeiro conjunto de resultados):

database_size    unallocated space
-------------    -----------------
   1545.81 MB          6.67 MB

Essencialmente, isso é executado, o que - confirmei por rastreamento - é aproximadamente a mesma consulta executada nas propriedades do banco de dados e nas caixas de diálogo de redução do banco de dados (eu esculpi as partes irrelevantes do procedimento armazenado e adicionei uma consulta externa para representar a matemática que o SSMS faz para exibição):

SELECT database_size = DbSize*8.0/1024 + LogSize*8.0/1024,
  [unallocated space] = (DbSize-SpaceUsed)*8.0/1024
FROM
(
  SELECT
    (SELECT SUM(CAST(df.size as float)) FROM sys.database_files AS df 
       WHERE df.type in ( 0, 2, 4 ) ) AS [DbSize],
    SUM(a.total_pages) AS [SpaceUsed],
    (SELECT SUM(CAST(df.size as float)) FROM sys.database_files AS df 
       WHERE df.type in (1, 3)) AS [LogSize]
  FROM sys.partitions p 
    join sys.allocation_units a on p.partition_id = a.container_id 
    left join sys.internal_tables it on p.object_id = it.object_id
) AS x;

Isso retorna uma correspondência:

database_size    unallocated space
-------------    -----------------
    1545.8125             6.671875

Todas essas caixas de diálogo mostram essas informações corretamente. Caixa de diálogo Propriedades do Banco de Dados:

Caixa de diálogo Propriedades do Banco de Dados

Caixa de diálogo Encolher banco de dados:

Caixa de diálogo Encolher banco de dados

As caixas de diálogo de arquivo de redução , por outro lado, executam uma consulta um pouco diferente (mais uma vez, esta foi esculpida / adaptada para maior comodidade):

SELECT SUBSTRING(name, CHARINDEX('_',name)+1, 4), 
  [Currently allocated space] = size/1024.0, 
  [Available free space] = (Size-UsedSpace)/1024.0
FROM
(
  SELECT s.name, 
    CAST(FILEPROPERTY(s.name, 'SpaceUsed') AS float)*CONVERT(float,8) AS [UsedSpace],
    s.size * CONVERT(float,8) AS [Size]
  FROM sys.database_files AS s
  WHERE (s.type IN (0,1))
) AS x;

Observe também que, além de obter dados de tamanho de uma função em vez de uma DMV, os predicados não foram atualizados para novos tipos de arquivo, como filestream / hekaton.

Resultados:

        Currently allocated space    Available free space
----    -------------------------    --------------------
Data                         1517                  7.9375 -- wrong
Log                       28.8125               25.671875 -- wrong

O problema é a FILEPROPERTY()função, que não é garantida como atualizada (mesmo após a DBCC UPDATEUSAGE(0);execução; mais abaixo). Isso acaba com essas informações enganosas nas caixas de diálogo:

Leituras de espaço errado disponíveis

Observe, novamente, que 6,67 MB nunca foram realmente precisos, pois isso está medindo apenas o tamanho total do banco de dados - o número de páginas alocadas, desconsiderando completamente o log.

Com toda a honestidade, se você deseja gerar relatórios precisos do espaço usado no banco de dados, pare de usar as UIs do mickey mouse que executam todos os tipos de consultas diferentes para descobrir isso e pare de usar as caixas de diálogo de arquivos compactados para recuperar informações. Estes estão claramente sujeitos a problemas de dados obsoletos em certos casos. Execute uma consulta real em uma fonte em que você possa confiar. Aqui está o que eu prefiro:

DECLARE @log_used DECIMAL(19,7);
CREATE TABLE #x(n SYSNAME, s DECIMAL(19,7), u DECIMAL(19,7), b BIT);
INSERT #x EXEC('DBCC SQLPERF(LogSpace);');
SELECT @log_used = u FROM #x WHERE n = DB_NAME();
DROP TABLE #x;

DECLARE @data_used DECIMAL(19,7);
SELECT @data_used = SUM(a.total_pages)*8/1024.0
FROM sys.partitions AS p 
INNER JOIN sys.allocation_units AS a 
ON p.[partition_id] = a.container_id;

;WITH x(t,s) AS
( 
  SELECT [type] = CASE 
    WHEN [type] IN (0,2,4) THEN 'data' ELSE 'log' END, 
    size*8/1024.0 FROM sys.database_files AS f
)
SELECT 
  file_type = t, 
  size = s,
  available = s-CASE t WHEN 'data' THEN @data_used ELSE @log_used END 
FROM x;

Esta consulta retorna três números que devem parecer muito familiares e um que não deve:

file_type    size           available
---------    -----------    ----------
data         1517.000000     6.6718750
log            28.812500    17.9008512

Observe que o DBCC SQLPERF também é um pouco propenso a problemas com o uso de espaço, por exemplo, após a execução:

DBCC UPDATEUSAGE(0);

A consulta acima gera isso:

file_type    size           available
---------    -----------    ----------
data         1517.000000     8.0781250
log            28.812500    17.8669481

sp_spaceusedagora produz números correspondentes, bem como ( 1545.81 MB / 8.08 MB), embora - mais uma vez - que é apenas o espaço disponível na dados de arquivo (s), ea propriedade da base de dados e encolher banco de dados de caixas de diálogo são "precisos", bem como (mas os diálogos de arquivo encolher ainda são longe - FILEPROPERTY()não parece ser afetado por UPDATEUSAGE):

Caixa de diálogo Propriedades do Banco de Dados após updateusage

Caixa de diálogo de redução do banco de dados após updateusage

Caixa de diálogo de redução de arquivo de dados após atualização

Caixa de diálogo de redução de arquivo de log após updateusage

Ah, e também pode mostrar o que o Windows Explorer pensa desses arquivos, para que você possa se relacionar com os cálculos feitos para determinar o MB:

Tamanhos de arquivo no Windows

A precisão de tudo isso depende, é claro, do que você fará com as informações.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.