在 Dynamics AX 中有一种缓存机制,可以将表配置为加载到内存中并进行缓存。此缓存限制为一定数量的 KB 以防止内存问题。我正在谈论的设置被调用entiretablecache
,并在请求单个记录后立即将整个表加载到内存中。
直到最近,我们依靠一些脚本来验证具有此设置的表的大小,以查看表大小是否超过此限制。
然而现在,压缩开始发挥作用,像sp_spaceused或sys.allocation_units这样的东西似乎报告了压缩数据实际使用的空间。
显然,应用程序服务器正在处理未压缩的数据,因此 SQL Server 中磁盘上的数据大小无关紧要。我需要未压缩数据的实际大小。
我知道sp_estimate_data_compression_savings但顾名思义,这只是一个估计值。
我希望尺寸尽可能正确。
我能想到的唯一方法是一些复杂的动态 SQL 创建与压缩表具有相同结构的未压缩表,将压缩数据插入该影子表中,然后检查该影子表的大小。
不用说,这有点乏味,并且需要一段时间才能在数百 GB 的数据库上运行。
Powershell 可能是一个选项,但我不想遍历所有表以select *
对它们执行 a 以检查脚本中的大小,因为这只会淹没缓存并且可能也需要很长时间。
简而言之,如果可能的话,我需要一种方法来获取每个表的大小,因为它一旦被解压缩并且在呈现给应用程序的等式中会出现碎片。我对不同的方法持开放态度,首选 T-SQL,但我不反对 Powershell 或其他创造性方法。
假设应用程序中的缓冲区是数据的大小。bigint 始终是 bigint 的大小,字符数据类型是每个字符 2 个字节(unicode)。BLOB 数据也采用数据的大小,枚举基本上是一个 int,数字数据是 numeric(38,12),datetime 是 datetime 的大小。此外,没有NULL
值,它们要么存储为空字符串,要么存储1900-01-01
为零。
没有关于如何实现的文档,但假设是基于一些测试以及 PFE 和支持团队使用的脚本(显然也忽略了压缩,因为检查是内置在应用程序中的,应用程序无法分辨如果基础数据被压缩),它还会检查表大小。例如,此链接指出:
避免对大型表使用 EntireTable 缓存(在 AX 2009 中超过 128 KB 或 16 页,在 AX 2012 中超过“整个表缓存大小”应用程序设置 [默认值:32KB 或 4 页])——改为使用记录缓存。