(转)SQLSERVER表分区的介绍(一)
下面进入正题吧,很多时候当单张数据表的数据量比较大的时候比如千万级别条记录、上亿级别记录,如果不做优化,那么查询的效率大家清楚。
有经验的人会通过各种手段做优化,其中表分区就是其中一种手段。
个人对表分区的口语化解释:把一张表分成几个区域
例如:一张业务表,有一个字段是月份或者年份,那么可以按照月份/年份来分区,当客户要查询某个月份/年份的数据的时候就到那个月份/年份的分区去查询,
不用整个表去查询,这样就提高了不小效率。还是就是可以把分区文件组放在不同的磁盘分区或者不同的硬盘去,减少磁盘I/O。
以上这些都是表分区的特点。
下面说一下概念吧~
SQLSERVER数据库服务器中包含很多数据库对象,其中就包括分区类对象。
分区类对象
分区类对象是对“分区方案”和“分区函数”两类对象的总称。SQLSERVER2005引入了数据表分区的概念。引入分区的目的是为了提高对数据表的维护,从而
提高数据库的性能。分区,即将一个原本的大数据表拆分成较小的多个数据表,由于需要查询的数据局限于空间的局部性,即查询的记录往往位于同一分区中,因此
通过分区,实际上可以将在大量数据集中进行查询的操作转换为在小部分数据中进行查询的操作,从而获得更快更高的查询效率。除此之外,将数据分区也有利于
数据库的维护操作(例如,重新生成索引或备份表也可以更快地运行)
实际操作过程中,也可以不拆分数据表,而是将数据表安排到不同磁盘驱动器上的方法来实现分区。例如,将数据表放在某个物理磁盘上并将相关的表放在不同
的磁盘驱动器上,同样可以提高查询性能,因为在运行涉及表间连接的查询时,多个磁头可以同时读取数据。可以使用SQLSERVER文件组来指定放置表的磁盘。
水平分区与垂直分区
如果将原有的大数据表拆分成多个小数据表,则通常被称为水平分区。水平分区的特点是每个分区中包含的列数是一样的,但是其中每个分区表中的记录数被
减少了。而与之对应的,还有一种被称为垂直分区的方案,即将一个数据表中的列划分为到多个结构较为简单的数据表中。
注意:推荐使用水分分区,这样应用程序的代码逻辑可以不变,实际上应用表分区(水平分区)之后跟应用之前对应用程序都是透明的!
在SQLSERVER2005中创建分区表的步骤如下:
(1)创建分区函数以指定如何分区,以及分区所涉及的数据表
(2)创建分区方案以指定分区函数的分区在文件组上的位置
(3)创建使用分区方案的表
一、分区函数
分区函数用于指定如何对数据表进行分区。分区函数可将数据表中指定部分映射到一组分区。因此在创建分区函数时需要指定分区数、分区依据列(即使用哪一列作为分区的参考列)
以及各分区依据列值的范围(即属于同一分区的各记录中,依据列值应满足的范围)。需要注意的是,在指定分区依据列时,只能指定一列。
打个比方:大数据表中有一列是时间列,如果按照月份来分区,那么分区数是12,分区依据列是时间列(时间列格式:XXXX-XX-XX XX:XX:XX),按照时间列中的月份来划分
范围,哪个时间属于哪个月份。
SQLSERVER2005中用于创建分区函数的T-SQL脚本命令是CREATE PARTITION FUNCTION。语法:
CREATE PARTITION FUNCTION partition_function_name(input_parameter_type)
AS RANGE[LEFT|RIGHT]
FOR VALUES([boundary_value[,...n] ])
[;]
其中参数partition_function_name为要创建的分区函数名,input_parameter_type为该函数的输入参数类型,该参数就是用于实现分区的依据列的数据类型。
而选项RANGE,通过LEFT (即小于)和RIGHT(即大于)来指定分区的约束条件,即是小于依据列的值、还是大于依据列的值。
参数boundary_value用于指定每个分区的边界值。
二、分区方案
在计划分区方案时,必须决定要在哪个文件组上放置分区。将分区安排在独立的文件组上的主要优势是可以确保在分区上独立地执行备份操作。即分别对
每个独立的文件组进行备份(分区跟文件组进行映射,所以对文件\文件组备份相当于对分区进行备份)关于备份请看下面的补充。需要注意的是,在设计
分区方案之前,必须首先使用分区函数来指定分区的个数,以及每个分区的范围。即必须首先在CREATE PARTITION FUNCTION语句中创建分区函数,
然后才能创建分区方案。
使用T-SQL创建分区方案的语法如下所示:
CREATE PARTITION SCHEME partition_scheme_name
AS PARTITION partition_function_name
[ALL] TO ({file_group_name|[PRIMARY]}[,...n] )
[;]
其中参数partition_scheme_name为要创建的分区方案的名称。分区方案名称在数据库中必须是唯一的,并且符号标识符规则。参数partition_function_name
为需要使用的分区函数的名。由分区函数创建的分区将被映射到在分区方案中指定的文件组中。必须注意,partition_function_name应已存在于当前的数据库中。
如果在上述T-SQL语句中使用了选项ALL,就表明所有分区都将被映射到file_group_name中提供的文件组,或映射到主文件组(如果指定了[PRIMARY])
中(一般不使用ALL,如果使用了那么分多个文件组就没有意义了)。
补充:关于SQLSERVER中文件组备份
摘录自:http://www.e800.com.cn/articles/2007/0828/280690.shtml
当备份一个数据库时,一个选择是备份一个文件组而不是整个数据库。这对于大型数据库特别有用。一个大型数据库,取决于硬件,大概500GB,备份会
花费几个小时。事实上,我曾看过一个系统花费四到五个小时去备份一个那么大的数据库。备份花费资源,并且可能并不值得每天晚上花五小时做完全备份工作。
这个问题有几种解决方案。我曾见过设定每周做一次完全备份,一系列事务日志和一整个星期执行的差异备份。这样可行,但是你每个星期将仍然需要一个长时间的单独窗口来做完全备份。
如果你将数据库分解为大小都差不多的七个文件组来替代,
那会怎么样呢?在那种情况下,它们都是72GB左右大小,并且你将每天晚上备份一个文件组。这会将原来很长的完全的备份缩短为七个较短的文件组的备份,并
经过一个星期你将完成整个数据库的备份。我曾经用过一些包含海量数据的数据库,其相当大的一部分是只读的。
依据遵从性检查的要求,像Sarbanes-Oxley,一个大型的金融数据库大小可能为600GB或700GB,
但经常大部分是回溯到七年或更久以前的历史数据。如果你有这样的数据库并且只有20%的数据有规律地改变,那你可能可以通过利用文件组来提高效率。把规律
变化的表放到你的主要文件组里,把历史的或存档表放到一个存档文件组里。现在你可以每天备份主要文件组,或许一个星期或一个月备份一次存档文件组。
参考文献:http://it.china-b.com/sjk/sqlserver/20090826/176946_1.html
http://www.e800.com.cn/articles/2007/0828/280690.shtml
特别说一下,SQLSERVER备份的最小单位是文件组不是文件,所以备份跟恢复都是文件组不是文件


就写到这里吧~ 下篇介绍分区函数和分区方案的创建和使用方法
(转)SQLSERVER表分区的介绍(一)的更多相关文章
- (转)SQLSERVER表分区的介绍(二)
分区函数和分区方案的创建和使用方法 具体设计过程如下: (1)首先创建一个名为partionTest的数据库.然后分别为数据库partionTest添加四个文件组,文件组名依次为FileGroup00 ...
- sqlserver表分区
参考:http://www.cnblogs.com/knowledgesea/p/3696912.html 及百度搜索sqlserver表分区 create partition function sg ...
- sqlserver表分区与调优与行列转换
转自: http://www.cnblogs.com/knowledgesea/p/3696912.html http://www.open-open.com/lib/view/open1418462 ...
- sqlserver表分区小结
为什么要表分区? 当一个表的数据量太大的时候,我们最想做的一件事是什么?将这个表一分为二或者更多分,但是表还是这个表,只是将其内容存储分开,这样读取就快了N倍了 原理:表数据是无法放在文件中的,但是 ...
- 优化SQLServer——表和分区索引(二)
简介 之前一篇简单的介绍了语法和一些基本的概念,隔了一段时间,觉得有必要细致的通过实例来总结一下这部分内容.如之前所说,分区就是讲大型的对象(表)分成更小的块来管理,基本单位是行.这也就产生了 ...
- 优化SQLServer——表和分区索引
概念: 简单地说,分区是将大型的对象(如表)分成更小的且易于管理的小块.分区的基本单位是行,需要注意的是与分区视图不同的地方时,分区必须位于同一个数据库内. 分区的原因: 对于非 ...
- mysql分区表之二:MySQL的表的四种分区类型介绍
一.什么是表分区 通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了.如:某用户表的记录超过了600万条,那么就可以根据入库日期将表分区,也可以根据所在地将表分区 ...
- Oracle 表分区介绍与使用
什么是表分区 分区表是将大表的数据分成称为分区的许多小的子集,类型有FAT32,NTFST32,NTFS.另外,分区表的种类划分主要有:range,list,和hash分区.划分依据主要是根据其表内部 ...
- 8、SQL Server 表分区
什么是表分区?表分区其实就是将一个大表分成若干个小表.表分区可以从物理上将一个大表分成几个小表,但是逻辑上还是一个表.所以当执行插入.更新等操作的时候,不需要我们去判断应该插入或更新到哪个表中.只需要 ...
随机推荐
- 基础数据结构 之 队列(python实现)
队也是编程开发中常见的一种数据结构.栈和队可用来模拟函数的递归过程.队的特点为先入先出,主要操作包括入队和出队.入队时需判断队是否已满,出队时需判断队是否为空.下面给出一个队的python实现的例子: ...
- Codeforces Round #274 (Div. 1) B. Long Jumps 数学
B. Long Jumps Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/480/problem/ ...
- Codeforces Round #318 [RussianCodeCup Thanks-Round] (Div. 1) A. Bear and Poker 分解
A. Bear and Poker Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/573/pro ...
- URAL 2048 History 蔡勒公式
HistoryTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.acti ...
- android之多媒体篇(三)
录像 Android提供了2种方案去录像. 方案一: 最简单的方式就是使用Intents去启动App来帮助你完成.这个方案使你能够指定输出的位置和视频的质量.这方案通常是最好的方法,应该可以用在多种情 ...
- MySQL ddl丢表
MySQL ddl丢表: MySQL server层为了和innodb层保持数据一致性,在写binlog和redo log时,引入了两阶段提交,但不同的变更产生的日志并非都使用这种策略. 下面就来 ...
- MySQL内存----使用说明全局缓存+线程缓存) 转
MySQL内存使用说明(全局缓存+线程缓存) 首先我们来看一个公式,MySQL中内存分为全局内存和线程内存两大部分(其实并不全部,只是影响比较大的 部分): per_thread_buffers=(r ...
- cocos2dx-3.2 环境配置
一.软件 1)VS2012(C++11特性在VS2012以上可以使用) 2)Cocos2d-x官网源码 3)JDK 4)NDK(3.2要用r9d版本,用了android-ndk-r8e报错了) 5)A ...
- Apache以及PHP的默认编码问题解决(详解)
如果你在网上搜索 “apache配置”,搜到的页面大多都会建议你在httpd.conf中加上这么一句:AddDefaultCharset GB2312.对于新手而且是只用GB2312编码的开发人来说, ...
- MII、RMII、GMII接口的详细介绍
转载:http://blog.csdn.net/reille/article/details/6312156 概述: MII (Media Independent Interface(介质无关接口)或 ...