En Dynamics AX hay un mecanismo de almacenamiento en caché donde las tablas se pueden configurar para cargarse en la memoria y almacenarse en caché. Este caché está limitado a una cierta cantidad de KB para evitar problemas de memoria. Se llama a la configuración de la que estoy hablando entiretablecache
y carga toda la tabla en la memoria tan pronto como se solicita un único registro.
Hasta hace poco, confiamos en algunos scripts para verificar el tamaño de las tablas que tienen esta configuración para ver si el tamaño de la tabla está por encima de este límite.
Ahora, sin embargo, la compresión entra en juego y cosas como sp_spaceused o sys.allocation_units parecen informar el espacio realmente utilizado por los datos comprimidos.
Obviamente, el servidor de aplicaciones está trabajando con datos sin comprimir, por lo que el tamaño de los datos en el disco en SQL Server es irrelevante. Necesito el tamaño real que tendrán los datos sin comprimir.
Sé de sp_estimate_data_compression_savings pero como su nombre lo dice, esto es solo una estimación.
Preferiría tener el tamaño lo más correcto posible.
La única forma en que podía pensar era en un SQL dinámico enrevesado que creaba tablas sin comprimir con la misma estructura que las tablas comprimidas, insertaba los datos comprimidos en esa tabla de sombra y luego verificaba el tamaño de esa tabla de sombra.
No hace falta decir que esto es un poco tedioso y lleva un tiempo ejecutarse en una base de datos de varios cientos de GB.
Powershell podría ser una opción, pero no me gustaría iterar sobre todas las tablas para realizar un select *
control en ellas para verificar el tamaño en el script, ya que eso solo inundaría el caché y probablemente también tomaría mucho tiempo.
En resumen, necesito una forma de obtener el tamaño de cada tabla, ya que alguna vez estará sin comprimir y con la fragmentación fuera de la ecuación presentada a la aplicación, si eso es posible. Estoy abierto a diferentes enfoques, se prefiere T-SQL, pero no me opongo a Powershell u otros enfoques creativos.
Suponga que el búfer en la aplicación es del tamaño de los datos. Un bigint es siempre del tamaño de un bigint, y un tipo de datos de caracteres es de 2 bytes por carácter (unicode). Los datos BLOB también toman el tamaño de los datos, una enumeración es básicamente un int y los datos numéricos son numéricos (38,12), datetime es el tamaño de un datetime. Además, no hay NULL
valores, se almacenan como una cadena vacía 1900-01-01
o cero.
No hay documentación sobre cómo se implementa esto, pero las suposiciones se basan en algunas pruebas y los scripts utilizados por PFE y el equipo de soporte (que aparentemente también ignoran la compresión, ya que el control está integrado en la aplicación y la aplicación no puede decirlo). si los datos subyacentes están comprimidos), que también verifican los tamaños de tabla. Este enlace, por ejemplo, dice:
Evite usar cachés de WholeTable para tablas grandes (en AX 2009 de más de 128 KB o 16 páginas, en AX 2012 sobre la configuración de la aplicación 'tamaño de caché de tabla completa' [valor predeterminado: 32 KB o 4 páginas]) - en su lugar, pase al caché de registros.