SqlServer性能优化——Compression

2024-01-07 23:18

本文主要是介绍SqlServer性能优化——Compression,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://blog.csdn.net/tuoxie5431/archive/2010/01/19/5214010.aspx

 

执行SQL查询时,主要的几个瓶颈在于:CPU运算速度、内存缓存区大小、磁盘IO速度。而对于大数据量数据的查询,其瓶颈则一般集中于磁盘IO,以及内存缓存。那么为了提高SQL查询的效率,一方面我们需要考虑尽量减少查询设计的数据条目数——建立索引,设立分区;另一方面,我们也可以考虑切实减少数据表物理大小,从而减少IO大小。

在SQL Server 2008中,最新提供了一项功能“压缩(Compression)”,就是定位于减少数据表、索引物理大小。

设置压缩

在企业管理器中,在需要压缩的表或索引上右键选择Storage-》Manage Compression:

这里可以看到几点:

  1. 下方列表里列出了该表所有的分区,也就是可以同一张表的不同分区应用不同的压缩策略。
  2. 压缩方式(Compression Type)分为Row和Page两种。

    行级压缩(Row):
    一方面减少了动态长度字段元数据的大小(varchar、varbinary等),比如之前存储字段实际长度需要2bytes,压缩后只需要3bits。
    另一方面也直接减少各字段存储内容的大小,比如存储数值1在一个int类型字段中,压缩后只占用了一个字节。

    页级压缩(Page): 能在各行间共享相同的数据,这里面包含两项技术:列前缀(Column Prefix)、页字典(Page Dictionary)。
    列前缀 可以让拥有同样前缀的字段值拥有类似外键一样的结构来存储相同的前缀和各自的其余部分。比如一张存储了一个网站所有页面URL的表,URL字段存储的值分别是 www.example.com/a.html’,‘www.example.com/b.html’,‘www.example.com/c.html’,‘www.example.com/d.html’。则压缩后,它们同样的前缀‘www.example.com/’会被提取出来,而其余部分会被类似如下的形式存储‘1a.html’,‘1b.html’,‘1c.html’,‘1d.html’。
    页字典 则可以将在应用列前缀基础上的其余部分再次聚合存储,比如同样是一张存储了一个网站所有页面URL的表,假设有在表里里有多条URL字段的值相同,比如‘1a.html’,‘1b.html’,‘1c.html’,‘1b.html’,‘1a.html’,‘1a.html’,则通过页字典技术压缩后,实际存储在字段中的值会进一步减少为‘2’,‘3’,‘1c.html’(没有重复的字段值不会被压缩),‘3’,‘2’,‘2’。
  3. 点击“Calculate”后,会计算出表当前占用的空间大小,以及压缩需要的空间大小 。注意这里与一般预想的不同,如果要对一张预存有数据但尚未压缩的表进行压缩,首先需要的是额外的空间大小。

执行压缩

设置好之后,就可以选择是生成脚本还是立即执行,一般压缩的执行时间受表原有数据多少以及选择压缩方式的影响。笔者对一张有上千万条记录的表做页级压缩,耗时在10分钟左右。

压缩完成之后查看数据库大小,会发现数据库的大小变大了!这也和在设置阶段计算出来的额外空间相关。但实际上这里大部分空间是预占的空间,并没有实际数据。如果需要节省磁盘空间,需要进一步执行收缩(Shrink) 操作。

与Compression不同,Shrink用来释放数据库占据的没有利用的空间,一般用来对无用的日志文件收缩(如果操作频繁,日志文件很有可能大于数据库实际数据的大小)。这里我们对数据库文件(mdf)做Shrink操作,完成之后再看数据库的大小,果然减少了很多。笔者做压缩、Shrink之后,一般都能将数据库的大小减为原来的1/3~1/2左右。当然,具体压缩比率取决于压缩方式、压缩表的字段特点、压缩表占整个数据库数据的比重等。

注意事项

  1. 既然对表行了压缩,那么在执行查询时必然会有解压缩的过程。而这一过程会占用CPU时间,也就是我们在通过压缩减少了磁盘占用空间以及IO时间的同时,增大了CPU的消耗。所以在压缩前需要考虑清楚查询的瓶颈到底是磁盘IO还是内存还是CPU。而且如果表应用了压缩,类似建立索引,对于增删改等操作也会有一定的影响。所以同样要考虑应用在表上的操作到底以哪种为主。
  2. 各页面的压缩是独立进行的,页字典和列前缀也分别存储于各页内。而且压缩仅在数据页快满的时候进行,因为一个页的大小是固定的,压缩半页不会有性能上的提升。
  3. 数据库备份中也有Compression的选项,但这利用的是系统的文件压缩技术,而且只能应用于整个数据库上。
  4. 容易被忽略的是,索引也能被压缩,而且和表压缩独立,同样也会提升所有应用到索引的查询的性能。
  5. 在Shrink阶段,可能会造成大量的索引碎片,所以可以在Shrink完成之后重建或者重组织索引,但同时,这些操作也会造成数据库的体积变大……也就是,最小的数据库体积和最小碎片比率的索引是鱼与熊掌,不可兼得。

 

这篇关于SqlServer性能优化——Compression的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/581578

相关文章

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

MySQL中的锁机制详解之全局锁,表级锁,行级锁

《MySQL中的锁机制详解之全局锁,表级锁,行级锁》MySQL锁机制通过全局、表级、行级锁控制并发,保障数据一致性与隔离性,全局锁适用于全库备份,表级锁适合读多写少场景,行级锁(InnoDB)实现高并... 目录一、锁机制基础:从并发问题到锁分类1.1 并发访问的三大问题1.2 锁的核心作用1.3 锁粒度分

MySQL数据库中ENUM的用法是什么详解

《MySQL数据库中ENUM的用法是什么详解》ENUM是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用,下面:本文主要介绍MySQL数据库中ENUM的用法是什么的相关资料,文中通过代码... 目录mysql 中 ENUM 的用法一、ENUM 的定义与语法二、ENUM 的特点三、ENUM 的用法1

MySQL count()聚合函数详解

《MySQLcount()聚合函数详解》MySQL中的COUNT()函数,它是SQL中最常用的聚合函数之一,用于计算表中符合特定条件的行数,本文给大家介绍MySQLcount()聚合函数,感兴趣的朋... 目录核心功能语法形式重要特性与行为如何选择使用哪种形式?总结深入剖析一下 mysql 中的 COUNT

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

mysql中的服务器架构详解

《mysql中的服务器架构详解》:本文主要介绍mysql中的服务器架构,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、mysql服务器架构解释3、总结1、背景简单理解一下mysqphpl的服务器架构。2、mysjsql服务器架构解释mysql的架

MySQL之InnoDB存储引擎中的索引用法及说明

《MySQL之InnoDB存储引擎中的索引用法及说明》:本文主要介绍MySQL之InnoDB存储引擎中的索引用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录1、背景2、准备3、正篇【1】存储用户记录的数据页【2】存储目录项记录的数据页【3】聚簇索引【4】二

mysql中的数据目录用法及说明

《mysql中的数据目录用法及说明》:本文主要介绍mysql中的数据目录用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、版本3、数据目录4、总结1、背景安装mysql之后,在安装目录下会有一个data目录,我们创建的数据库、创建的表、插入的

MySQL中的InnoDB单表访问过程

《MySQL中的InnoDB单表访问过程》:本文主要介绍MySQL中的InnoDB单表访问过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、访问类型【1】const【2】ref【3】ref_or_null【4】range【5】index【6】