据我了解,当您在表上定义列时,您定义了它的精度。此精度占用 1 个字节并存储在列级别。如果您使用 5 或更高的精度,则 DateTime2 列将占用每行 8 个字节。(精度不存储在行级别。)
但是,当您将相同的 DateTime2 转换为 VarBinary 时,它将占用 9 个字节。那是因为它需要存储在列级别的精度字节。
我很好奇这与 DateTime2 存储在内存中时有何关系。假设我在内存中有 1,000,000 个 DateTime2s(每个的精度为 5 或更高)。这会占用 8,000,000 字节的内存,还是 9,000,000 字节的内存?
基本上,我想知道默认精度 DateTime2 是否会比正常的 DateTime 对 Page Life Expectancy 造成更大的压力?
与 DATETIME 相比,默认精度 DATETIME2 不会对 PLE 造成更大的压力。缓冲池由 8 KB 页组成。与每页的内部存储工作相比,页数才是重要的。说 100 万列值将占用 800 万或 900 万字节是不正确的。引用文档:
在 SQL Server 中,磁盘上的数据与内存中的数据相同*。数据页从磁盘复制到内存并返回,如果在读取或刷新时转换数据,这将是昂贵的。
8,000,000 因为将页面存储在内存中与将 DateTime2 转换为 varbinary 完全无关。
* 例外:内存中 OLTP 表是一个例外,在内存和磁盘上存在很大差异。透明数据库加密表在读入内存时被解密,并在刷新到磁盘时被加密。
正如datetime2所记录的: