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 实例时确定的。该大小决定了运行实例中任何时刻可以在缓冲池中缓存的最大页数。
我很好奇这与 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 个字节。21提供的值适用于未压缩的行存储。使用数据压缩或列存储可能会改变每个精度的存储大小。此外,磁盘上和内存中的存储大小可能不同。例如,当使用批处理模式时,datetime2值始终需要内存中的 8 个字节。
2当datetime2值转换为varbinary值时,会向varbinary值添加一个附加字节以存储精度。
归档时间: |
|
查看次数: |
561 次 |
最近记录: |