2011-06-05 154 views
5

对SQL Server 2008 R2使用行级或页面级压缩时,SQL Server是否将数据以其压缩格式或其展开形式存储到其buffer cache中。压缩数据如何存储在缓冲区缓存中,是压缩的还是未压缩的?

例如,假设我有一个(网页级别)压缩到原来大小的20%的表:

Original size: 100 GB 
Compressed size: 20 GB 

此外,(专用)主机SQL的这个特定实例服务器正在运行具有24 GB的内存。如果查询执行表扫描,查看所有列(为了举例)并且SQL Server将数据缓存为压缩数据,那么理论上它可以将所有数据放在其缓冲区缓存中,并可用于将来的查询。但是,如果数据缓存未压缩,则明显100 GB的数据无法放入24 GB的服务器内存。

那么,SQL Server如何将压缩数据存储在其缓冲区缓存中?

回答

7

压缩的页面被压缩保存在磁盘上,并在读入内存时保持压缩状态。

编号:SQL Server 2008 Data Compression: Strategy, Capacity Planning and Best Practices

数据进行解压缩(不是整个 页面,但只有 感兴趣的数据值),当它遇到的 下列条件之一:

  • 它作为查询响应的一部分被读取用于过滤,排序,加入。
  • 它由应用程序更新。

没有内存中,解压缩的压缩页面副本。 解压数据会消耗CPU。 然而,由于压缩后的数据使用 较少的数据页,还节省了:

  • 物理I/O:由于物理I/O是从工作量 角度昂贵,减少物理I/O 常常导致比 节省更多的CPU成本来压缩 并解压缩数据。请注意, 物理I/O被保存,因为从中读取的数据量较小的数据量为 ,或者写入磁盘的数据量为 ,并且因为更多的数据可以保留在缓冲池 的内存中。

  • 逻辑I/O(如果数据是在存储器中):由于逻辑I/O消耗CPU, 减少逻辑I/O可以有时 补偿CPU成本 压缩和解压缩数据。