SQL Server分区详解Partition

一、SQL Server分区介绍

在SQL Server中,数据库的所有表和索引都视为已分区表和索引,默认这些表和索引值包含一个分区;也就是说表或索引至少包含一个分区。

SQL Server中数据是按水平方式分区,是多行数据映射到单个分区。已经分区的表或者索引,在执行查询或者更新时,将被看作为单个逻辑实体;

简单说来利用分区将一个表数据分多个表来存储,对于大数据量的表,将表分成多块查询,若只查询某个分区数据将降低消耗提高效率。需要注意的是单个索引或者表的分区必须位于一个数据库中。

在使用大量数据管理时,SQL Server使用分区可以快速访问数据子集,减少io提高效率。

同时不同分区可以存放在不同文件组里,文件组若能存放在不同逻辑磁盘上,则可以实现io的并发使用以提高效率。如下图所示:

二、SQL Server分区创建

虽然分区有很多好处,却不能随意使用;且不说分区管理的繁琐,只是跨分区带来的负面影响就需要我们好好分析是否有必要使用分区。

一般分区创建的业务特点:用于统计、历史数据少使用、数据自增长、可能数据冗余大、数据量庞大插入量大。

在确定是否合适使用分区前,需了解分区是如何创建的,分区的创建包括:

1、新建分区函数

2、新建文件和文件组

3、新建分区架构

4、新建分区表或者分区索引

如下图所示:分区函数定义了分区的具体方式,分区架构使用分区函数和文件组,确定分区方案,表或索引就使用分区架构来实现分区。

他们之间是使用关系,一对多的关系。

1、创建分区函数

分区函数定义如何根据某些列的值将表或索引的行映射到指定分区。分区函数制定了分区的方式。

用作索引列时有效的所有数据类型都可以用作分区依据列,timestamp 除外。无法指定 ntext、text、image、xml、varchar(max)、nvarchar(max) 或 varbinary(max) 数据类型为分区依据列。基本语法如下所示:

CREATE PARTITION FUNCTION partition_function_name ( input_parameter_type )
AS RANGE [ LEFT | RIGHT ]
FOR VALUES ( [ boundary_value [ ,...n ] ] ) [ ; ]

1.1 左/右界限RANGE [ LEFT | RIGHT ]

指定左右既是为了确定边界值处于左侧还是右侧。如下图所示RANGE RIGHT,则界限值属于右边。

/*新建分区函数*/
USE [PartionTest];
CREATE PARTITION FUNCTION [pf_PartionTest01] (datetime) AS RANGE right FOR VALUES (‘2014-12-09‘, ‘2014-12-10‘

/*分区函数查询*/
SELECT
pf.name 分区函数名称
,CASE WHEN boundary_value_on_right=1 THEN ‘RIGHT‘ ELSE ‘LEFT‘ END 分区界限方式
,value 分区界限值
FROM sys.partition_functions pf
LEFT JOIN sys.partition_range_values prv ON prv.function_id = pf.function_id
ORDER BY boundary_id

查询结果如下:

注意:

1、业务上多数为使用Range Right ,将边界保留在最新分区,毕竟右为后期增长的数据;

比如按每天分区的逻辑是将当天的数据存在当天的分区内,假如当天分区为2014-12-08 00:00.000, Range Right 将2014-12-08 00:00.000的数据归于2014-12-08当天,RANGE LEFT则只能将此界限时间归于2014-12-07。与逻辑存在一定差异。

2、既然有分区界限问题,在合并分区的时候,指定分区是向左还是向右合并?

2、创建分区架构

分区架构把分区函数指定的分区映射到文件组;

CREATE PARTITION SCHEME partition_scheme_name
AS PARTITION partition_function_name
[ ALL ] TO ( { file_group_name | [ PRIMARY ] } [ ,...n ] )[ ; ]

分区指定文件组要比分区划分边界多一个,分区架构指定了具体分区数据存放在哪个文件组上。如下图所示:

在创建分区架构之前若有必要需要创建特定的文件和文件组:

1、新建不同文件组若存放在不同逻辑磁盘可以提高io并发能力;

2、同时不同文件可以提高容灾的能力,在某个文件发生顺坏,其他文件可以继续使用。

3、分开文件存储,也可实现不同分区独立备份,提高了数据恢复速率。

依据已经新建分区函数【pf_PartionTest01】和默认已有文件组,新建以下分区架构:

/*新建分区架构*/
USE [PartionTest];
CREATE PARTITION SCHEME [pc_PartionTest01] AS PARTITION [pf_PartionTest01] TO (‘Primary‘, ‘PartionTest201412‘, ‘PartionTest201412‘)
/*分区架构查询*/
SELECT
ps.name partition_scheme,
ds.name filegroup,
pf.name partition_function,
pf.type_desc+‘:‘+case when pf.boundary_value_on_right=0 then ‘Left‘ else ‘Rigth‘ end function_type
FROM sys.partition_schemes ps
JOIN sys.destination_data_spaces dds ON ps.data_space_id=dds.partition_scheme_id
JOIN sys.data_spaces ds ON dds.data_space_id=ds.data_space_id
JOIN sys.partition_functions pf ON ps.function_id=pf.function_id

结果如下图所示:

3、创建分区表

如下图所示,只要制定分区架构和分区依据列即可.

4、创建索引分区

三、SQL Server分区管理

时间: 2024-10-09 23:22:36

SQL Server分区详解Partition的相关文章

SQL Server分区详解

一.SQL Server分区介绍 在SQL Server中,数据库的所有表和索引都视为已分区表和索引,默认这些表和索引值包含一个分区:也就是说表或索引至少包含一个分区.SQL Server中数据是按水平方式分区,是多行数据映射到单个分区.已经分区的表或者索引,在执行查询或者更新时,将被看作为单个逻辑实体,简单说来利用分区将一个表数据分多个表来存储,对于大数据量的表,将表分成多块查询,若只查询某个分区数据将降低消耗提高效率.需要注意的是单个索引或者表的分区必须位于一个数据库中. 在使用大量数据管理

如何编写sql server 触发器详解

在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程.常见的触发器有三种:分别应用于Insert , Update , Delete 事件. 编写之前要了解一个关键知识.触发器用到的两个临表:Deleted , Inserted . Deleted 和 Inserted 分别存储触发事件表的"旧的一条记录"和"新的一条记录". 一个Update 的过程可以看作为:生成新的记录到Inserted表,复制旧

PHP连接 SQL Server步骤详解

php 连接sql server时遇到了不少问题,这里把详细步骤记录下来,供大家参考: 首先我的是phpstudy-5.4,如下图; 第一步:下载SQLSRV 地址:http://www.microsoft.com/en-us/download/details.aspx?id=20098  下载的是一个自解压的文件,解压后会有一堆dll文件 第二步:将对应PHP版本的dll文件copy到php ext目录下 版本是php5.4,将php_sqlsrv_54_ts.dll复制到ext目录下 第三步

SQL SERVER 数据类型详解(SQL Server 2008)

数据类型类别 SQL Server 中的数据类型归纳为下列类别: 数字类型 1.精确数字 2.近似数字 3.日期和时间 字符串类型 4.非Unicode字符串 4.Unicode字符串 5.二进制字符串 6.其他数据类型 7.CLR 在 SQL Server 中,根据其存储特征,某些数据类型被指定为属于下列各组: 大值数据类型:varchar(max).nvarchar(max) 和 varbinary(max) 大型对象数据类型:text.ntext.image.varchar(max).nv

Unity3D连接Sql Server数据库详解

转自:http://unity.jb51.net/chengxukaifa/shujukubiancheng/1078.html 最近一些朋友问我u3d PC端 连接数据库的问题.现在抽出一点时间,为大家写一个连接数据库以及打印出数据表中的数据案例   首先,我们需要添加一个外部引用        然后在VS 中添加引用   数据库Test的表以及数据表中的数据为大家贴上图: 好了!准备工作我们已经做好啦~~   (最后我们会提供源码文件下载地址)   接下来我们来试着连接数据库.   我就直接

(二)SQL Server分区创建过程

虽然分区有很多好处(一)SQL Server分区详解Partition,却不能随意使用:且不说分区管理的繁琐,只是跨分区带来的负面影响就需要我们好好分析是否有必要使用分区.一般分区创建的业务特点:用于统计.历史数据少使用.数据自增长.可能数据冗余大.数据量庞大插入量大.在确定是否合适使用分区前,需了解分区是如何创建的,分区的创建包括: 1.新建分区函数 2.新建文件和文件组 3.新建分区架构 4.新建分区表或者分区索引 如下图所示:分区函数定义了分区的具体方式,分区架构使用分区函数和文件组,确定

SQL Server表分区详解

原文:SQL Server表分区详解 什么是表分区 一般情况下,我们建立数据库表时,表数据都存放在一个文件里. 但是如果是分区表的话,表数据就会按照你指定的规则分放到不同的文件里,把一个大的数据文件拆分为多个小文件,还可以把这些小文件放在不同的磁盘下由多个cpu进行处理.这样文件的大小随着拆分而减小,还得到硬件系统的加强,自然对我们操作数据是大大有利的. 所以大数据量的数据表,对分区的需要还是必要的,因为它可以提高select效率,还可以对历史数据经行区分存档等.但是数据量少的数据就不要凑这个热

SQL SERVER分区具体例子详解

在日常工作中,我们会遇到以下的情况,一个表每日数万级的增长,而查询的数据通常是在本月或今年,以前的数据偶尔会用到,但查询和插入的效率越来越慢,用数据库分区会有助于解决这个问题.关于分区的理论知识网上很多我这里就不在累赘,我从一个实际例子出发,看如何将一个已经运行了很长时间的普通表进行分区. 回到目录 提出问题 需解决问题:有一个数据表数据很大,我们通常的查询是在一个季度中.我们需要将以往年份的数据按不同年份存在文件组里,当年的数据分为4个季度存,如果到了新的一年,将之前4个季度的合并到一年中,新

GPT 分区详解

保护MBR 保护MBR包含一个DOS分区表(LBA0),只包含一个类型值为0xEE的分区项,在小于2TB的磁盘上,大小为整个磁盘:在更大的磁盘上,它的大小固定为2TB.它的作用是阻止不能识别GPT分区的磁盘工具试图对其进行格式化等操作,所以该扇区被称为"保护MBR".实际上,EFI根本不使用这个分区表. EFI部分 EFI部分又可以分为4个区域:EFI信息区(GPT头).分区表.GPT分区.备份区域. EFI信息区(GPT头) 起始于磁盘的LBA1,通常也只占用这个单一扇区.其作用是定