SQL Server数据压缩绝对适合只读数据库吗?


11

我读过一些有关SQL Server数据压缩的文献,指出写入成本增加到通常需要的四倍。似乎还暗示这是数据压缩的主要缺点,强烈暗示对于只读存档数据库,使用100%填充页面的数据压缩将提高性能(仅少数例外)。

  1. 以上陈述正确吗?
  2. 数据压缩与其他方式(用于读取)之间的主要“差异”是什么?

    • “ CPU + x%”?
    • “ IO -y%”?
    • 页面拆分发生了吗?
    • tempdb的用法?
    • RAM使用率?
  3. 和写作?

出于这个问题的目的,您可以将上下文限制为大型(> 1TB)数据库的PAGE级压缩,但是始终欢迎其他注释。


参考文献:

SQL Server存储引擎博客(DW场景显示压缩非常有优势)
数据压缩:策略,容量规划和最佳实践

确定压缩内容的更详细方法涉及分析每个表和索引的工作负载特征。它基于以下两个指标:

U:相对于该对象的总操作数,特定表,索引或分区上的更新操作数的百分比。U的值越低(即不经常更新表,索引或分区),则它越适合用于页面压缩。
S:表,索引或分区上的扫描操作相对于该对象上的全部操作的百分比。S的值越高(即,表,索引或分区大部分被扫描),则用于页面压缩的候选值越好。

以上两种情况都明显偏向于建议为DW样式的数据库建议页面压缩(读密集型/排他性大数据操作)。


具体是什么文学?压缩/解压缩总是会有CPU开销,但是与读取一样,您也要写入较少的页面。实际上,我认为写方将比读方受益更多,因为读方通常将压缩页存储在内存中(这并不总是这样,但最好的情况取决于数据大小和分配的内存)。
亚伦·伯特兰

3
提供所需的任何指标将非常困难,因为它完全取决于数据的性质和压缩数据的能力(而且行和页的关系也将有所不同) )。有人报告了高达90%的压缩率,这将对内存使用率(以积极的方式)和CPU进行如此大的压缩产生影响。对于行压缩,本文的CPU开销为10%,对于页面则更高。您观察到的可能会完全不同。
亚伦·伯特兰

1
对于只读存档数据库,我想问题是它是否可以容纳在内存中。如果它们都适合内存,那么一旦将其加载到缓冲池中,对其进行压缩就没有真正的好处。但是,如果它不能全部放入内存,那么即使将其解压缩也可以执行一些工作,即可以将较少的页面换入和换出缓存。
亚伦·伯特兰

您添加的两个链接似乎都未提及写作造成的4倍罚款。你还记得你在哪里捡的吗?想看上下文。
亚伦·伯特兰

1
好吧,如果您不能将数据装入内存,那该场景是没有意义的,对吧?:-)
亚伦·伯特兰

Answers:


6

我在1-2岁硬件上进行的实验仅获得2美分:

页面压缩表(〜80行/页)上的只读操作(DW样式的扫描,排序等),我发现在压缩大小减小约3倍时达到了收支平衡。

也就是说,如果表仍然适合内存,则页面压缩仅在数据大小缩小3倍以上时才可提高性能。您扫描内存中的页面较少,但是扫描每个页面所需的时间更长。

如果您的计划是嵌套循环且繁重的,您的里程可能会有所不同。其中,这也将取决于硬件(外部NUMA节点访问损失,内存速度等)。

以上只是我的粗略经验法则,是基于我在自己的硬件(Dell Poweredge 910及更低版本)上使用自己的查询进行的测试运行所得出的。不是福音啊!

编辑:昨天,Thomas Kejser出色的SQLBits XI演示文稿已作为视频提供。与该讨论非常相关的是,页面压缩显示了CPU成本的“丑陋”面孔-更新速度降低了4倍,锁定时间更长了。

但是,Thomas使用的是FusionIO存储,他选择的表仅“适合”页面压缩。如果存储在典型的SAN上,并且数据使用的压缩率是3x-4x,则图像可能不太生动。


1
那可以是旧硬件吗?在新硬件上,裸露的SSD用于存储,我发现内核无法轻松跟上光盘。我毫不夸张地说,这样做的好处是可以更轻松地开始工作-如果不进行太多更改,则将IO减少50%是值得的。
TomTom

TomTom,存储对于这些数字没有作用。比较的是未压缩的内存表和压缩的内存表。
John Alan 2013年

从未见过足够用于存储的DWH。说真的 您将退回到光盘。
TomTom 2013年

1
是的,当然,您偶尔会回到磁盘上-从磁盘读取几乎是页面压缩总是有优势的地方(假设数据是可压缩的!)。但是,如果您的工作负载从磁盘加载一次,然后在一天的剩余时间内处理内存中的所有内容,那么您将对磁盘读取分配多少重量,对内存中操作分配多少重量?
John Alan

1
只是遇到了一个相关的呈现slidedeck从SQLBits 2013年托马斯Kejser:slideshare.net/fusionio/...
约翰·艾伦

0

我可以在我的数据仓库环境中添加几句话。

在具有3000万行(18GB)的测试表上实施压缩(在我的情况下为PAGE)可将表的大小从18GB减少到3GB!(确定存储效率),但将加载时间(写入)从22分钟增加到36分钟。

因此,对于读取或读取数据并将其放置在内存中,这可能是一个很好的解决方案,但对于日常数据加载,则可能导致性能下降。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.