DateTime2 和页面预期寿命 (PLE)

Vac*_*ano 6 sql-server datetime sql-server-2016 page-life-expectancy

据我了解,当您在表上定义列时,您就定义了其精度。该精度占用 1 个字节并存储在列级别。如果您使用 5 或更高的精度,则 DateTime2 列每行将占用 8 个字节。(精度不存储在行级别。)

但是,当您将相同的 DateTime2 转换为 VarBinary 时,它将占用 9 个字节。这是因为它需要存储在列级别的精度字节。

我很好奇这与 DateTime2 存储在内存中有何关系。假设内存中有 1,000,000 个 DateTime2(每个的精度为 5 或更高)。它会占用 8,000,000 字节内存还是 9,000,000 字节内存?

基本上,我想知道默认精度的 DateTime2 是否会比普通的 DateTime 对页面预期寿命造成更大的压力?

Joe*_*ish 11

与 DATETIME 相比,默认精度 DATETIME2 不会对 PLE 造成更大压力。缓冲池由 8 KB 页面组成。与每个页面的内部存储工作相反,页​​面计数才是重要的。说 100 万个列值将占用 800 万或 900 万字节的说法并不正确。引用文档

缓冲

在 SQL Server 中,缓冲区是内存中的 8 KB 页,与数据页或索引页的大小相同。因此,缓冲区高速缓存被划分为 8 KB 的页面。页保留在缓冲区高速缓存中,直到缓冲区管理器需要缓冲区读取更多数据为止。仅当数据被修改时,数据才会写回磁盘。这些内存中修改的页面称为脏页面。当页面相当于磁盘上的数据库映像时,该页面是干净的。缓冲区高速缓存中的数据在写回磁盘之前可以多次修改。

缓冲池

也称为缓冲区高速缓存。缓冲池是所有数据库共享其缓存数据页的全局资源。缓冲池缓存的最大和最小大小是在启动期间或使用 sp_configure 动态重新配置 SQL Server 实例时确定的。该大小决定了运行实例中任何时刻可以在缓冲池中缓存的最大页数。


Dav*_*oft 7

我很好奇这与 DateTime2 存储在内存中有何关系。

在 SQL Server 中,磁盘上的数据与内存中的数据相同*。数据页从磁盘复制到内存并返回,如果在读取或刷新时转换数据,这将是昂贵的。

假设内存中有 1,000,000 个 DateTime2(每个的精度为 5 或更高)。它会占用 8,000,000 字节内存还是 9,000,000 字节内存?

8,000,000,因为在内存中存储页面与将 DateTime2 转换为 varbinary 完全无关。

* 例外:内存中 OLTP 表是一个例外,它在内存中和在磁盘上有很大不同。透明数据库加密表在读入内存时被解密,并在刷新到磁盘时被加密。

正如datetime2 所记录的

财产 价值
存储尺寸1 对于小于 3 的精度,需要 6 个字节。
对于精度 3 或 4,需要 7 个字节。
所有其他精度需要 8 个字节。2

1提供的值适用于未压缩的行存储。使用数据压缩列存储可能会改变每个精度的存储大小。此外,磁盘上和内存中的存储大小可能不同。例如,当使用批处理模式时,datetime2值始终需要内存中的 8 个字节。

2datetime2值转换为varbinary值时,会向varbinary值添加一个附加字节以存储精度。