No Dynamics AX, existe um mecanismo de armazenamento em cache no qual as tabelas podem ser configuradas para serem carregadas na memória e armazenadas em cache. Esse cache é limitado a uma certa quantidade de KB para evitar problemas de memória. A configuração da qual estou falando é chamada entiretablecache
e carrega a tabela inteira na memória assim que um único registro é solicitado.
Até recentemente, contávamos com alguns scripts para verificar o tamanho das tabelas que possuem essa configuração para ver se o tamanho da tabela está acima desse limite.
Agora, no entanto, a compactação entra em ação e coisas como sp_spaceused ou sys.allocation_units parecem relatar o espaço realmente usado pelos dados compactados.
Obviamente, o servidor de aplicativos está trabalhando com dados não compactados, portanto o tamanho dos dados no disco no SQL Server é irrelevante. Preciso do tamanho real dos dados não compactados.
Eu sei de sp_estimate_data_compression_savings, mas como o nome diz, isso é apenas uma estimativa.
Eu preferiria ter o tamanho o mais correto possível.
A única maneira que eu conseguia pensar era em um SQL dinâmico complicado, criando tabelas não compactadas com a mesma estrutura que as tabelas compactadas, inserindo os dados compactados nessa tabela de sombra e, em seguida, verifique o tamanho dessa tabela de sombra.
Escusado será dizer que isso é um pouco tedioso e leva um tempo para rodar em um banco de dados de várias centenas de GB.
O Powershell poderia ser uma opção, mas eu não gostaria de repetir todas as tabelas para executá select *
-las e verificar o tamanho do script, pois isso apenas inundaria o cache e provavelmente levaria muito tempo.
Em resumo, preciso de uma maneira de obter o tamanho de cada tabela, pois ela será descompactada e com a fragmentação da equação apresentada ao aplicativo, se isso for possível. Sou aberto a diferentes abordagens, o T-SQL é o preferido, mas não sou contra o Powershell ou outras abordagens criativas.
Suponha que o buffer no aplicativo seja do tamanho dos dados. Um bigint sempre tem o tamanho de um bigint e um tipo de dados de caractere é de 2 bytes por caractere (unicode). Os dados BLOB também assumem o tamanho dos dados, uma enumeração é basicamente uma int e os dados numéricos são numéricos (38,12), data e hora é o tamanho de uma data e hora. Além disso, não há NULL
valores, eles são armazenados como uma sequência vazia 1900-01-01
ou zero.
Não há documentação sobre como isso é implementado, mas as suposições são baseadas em alguns testes e nos scripts usados pelo PFE e pela equipe de suporte (que também ignoram a compactação aparentemente, uma vez que a verificação é incorporada ao aplicativo e o aplicativo não pode dizer). se os dados subjacentes estiverem compactados), que também verificam os tamanhos da tabela. Este link, por exemplo, afirma:
Evite usar caches de tabela inteira para tabelas grandes (no AX 2009, com mais de 128 KB ou 16 páginas, no AX 2012, sobre a configuração do aplicativo 'tamanho da cache da tabela inteira' [padrão: 32 KB ou 4 páginas]) - mova para gravar o cache.