Sqlserver分表(水平分表)

原文:https://blog.csdn.net/exceptionalboy/article/details/78851327
先搬过来,留着以后可能用

需求说明:

将数据库Demo中的表按照日期字段进行水平分区分表。要求数据文件按一年一个文件存储,且分区的分割点会根据时间的增长自动添加(例如现在是2017年1月1日,将其作为一个分割点,即将2017年1月1日之前的数据存储到数据文件A中,将2017年1月1日的之后的数据存储到数据文件B中;当时间到2018年1月1日时,自动将2018年1月1日添加为一个新的分区分割点,并将2017年1月1日至2018年1月1日的数据存储在数据文件B中,将2018年1月1日之后的数据存储在一个新的数据文件C中,以此类推)。

需求实现

  1. 分区原理:
    要实现这一功能,首先要了解数据库对水平分区表进行分区存储的原理。
    所谓水平分区分表,就是把逻辑上的一个表,在物理上按照你指定的规则分放到不同的文件里,把一个大的数据文件拆分为多个小文件,还可以把这些小文件放在不同的磁盘下。这样把一个大的文件拆分成多个小文件,便于我们对数据的管理。

  2. 分区的优点
    存档,比如将销售记录中1年前的数据分到一个专门存档的服务器中
    便于管理,比如把一个大表分成若干个小表,则备份和恢复的时候不再需要备份整个表,可以单独备份分区
    提高可用性,当一个分区跪了以后,只有一个分区不可用,其它分区不受影响
    提高性能,这个往往是大多数人分区的目的,把一个表分布到不同的硬盘或其他存储介质中,会大大提升查询的速度.

  3. 实现思路
    ① 创建数据库
    ② 在创建的数据库中添加文件组
    ③ 在文件组中添加新的文件
    ④ 定义分区函数
    ⑤ 定义分区架构
    ⑥ 定义分区表
    ⑦ 定义代理作业,自动添加分区分割点
    ⑧ 测试数据

注意:

分区表依赖于分区架构,而分区架构又依赖与分区函数,所以在穿件分区函数、分区架构、分区表是要按照对应的顺序创建。

分区函数并不属于具体的分区架构和分区表,它们之间仅仅是使用关系。

分区表只能在创建的时候指定为分区表

实现步骤

原博主整理了两种,通过代码和sqlserver2012 Management Studio界面创建,下面先放代码:
3.1.1 创建数据库
新建数据库,并将其命名为Demo

3.1.2 添加文件组

代码格式:

ALTER DATABASE <数据库名称> ADD FILEGROUP<文件组名>

代码示例:

ALTER DATABASE DemoADD FILEGROUP DemoFileGroup

3.1.3 添加文件

代码格式:

ALTER DATABASE <数据库名称> ADD FILE <数据标识> TO FILEGROUP<文件组名称>

注意:数据标识中name为逻辑文件名、filename为物理文件路径名、size为文件初始大小(单位:kb/mb/gb/tb)、filegrowth为文件自动增量(单位:kb/mb/gb/tb)、maxsize为文件增大的最大大小(单位:kb/mb/gb/tb/unlimited)

代码示例:

ALTER DATABASEDemo ADD FILE (

   NAME='DemoFile1',

FILENAME='D:\ProgramFiles\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\DemoFile1.mdf',

   SIZE=5MB,

   FILEGROWTH=5MB)

   TOFILEGROUP DemoFileGroup

在此我们重复执行示例代码,在示例文件组下添加三个文件。

3.1.4 定义分区函数
分区函数是用于判定数据行该属于哪个分区,通过分区函数中设置边界值来使得根据行中特定列的值来确定其分区。

代码格式:

CREATE PARTITIONFUNCTION partition_function_name( input_parameter_type )

   ASRANGE [ LEFT | RIGHT ]

   FORVALUES ( [ boundary_value [ ,...n ] ] )

   [ ; ]

其中“LEFT”和“RIGHT”决定了“VALUES”中的边界值被划分到哪一个分区中(即,边界值属于左侧分区还是右侧分区)。

代码示例:

CREATE PARTITIONFUNCTION DemoPartitionFunction( datetime2(0) )

   ASRANGE RIGHT

   FORVALUES ('2016-01-01 00:00:00','2017-01-01 00:00:00')

查看分区函数是否创建成功:

SELECT * FROM sys.partition_functions

3.1.5 定义分区架构
定义完分区函数仅仅是知道了如何将列的值区分到了不同的分区,而每个分区的存储方式,则需要分区构架来定义。分区构架仅仅是依赖分区函数.分区构架中负责分配每个区属于哪个文件组,而分区函数是决定如何在逻辑上分区。

代码格式:

CREATE PARTITIONSCHEME partition_scheme_name

   ASPARTITION partition_function_name

   [ ALL ]TO ( { file_group_name | [ PRIMARY ] } [ ,...n ] )

   [ ; ]

代码示例:

CREATE PARTITIONSCHEME DemoPartitionScheme

   ASPARTITION DemoPartitionFunction

   TO ( DemoFileGroup,[PRIMARY],DemoFileGroup)

查看分区架构是否创建完成:

SELECT * FROM sys.partition_schemes

3.1.6 定义分区表
表在创建的时候就已经决定是否是分区表了。虽然在很多情况下都是你在发现已经表已经足够大的时候才想到要把表分区,但是分区表只能够在创建的时候指定为分区表。

代码格式:

CREATE TABLEtable_name(

...

) ONpartition_scheme_name(column_name)

代码示例:

CREATE TABLEDemoTable(

demo_id BIGINT,

demo_date datetime2(0),

demo_desc varchar(50)

) ONDemoPartitionScheme(demo_date)

通过图形化界面创建

3.2.1 创建数据库
右键点击“数据库”,选择第一项“新建数据库(N)…”,新建数据库,如图1所示:

Sqlserver分表(水平分表)_第1张图片

3.2.2 创建文件组
右键数据库Demo,选择“属性”,如图2所示:

Sqlserver分表(水平分表)_第2张图片

在属性界面中,点击箭头所示的“文件组”选项,进入文件组编辑界面,如图3所示:

Sqlserver分表(水平分表)_第3张图片

在文件组管理界面中点击箭头①所示的“添加”选项,添加新的文件组,界面中会出现箭头②所示的属性框,并键入对应的属性值,之后点击“确定”,完成新建文件组。

3.2.3 添加文件
和添加文件组的方式一样,右键数据库Demo,选择“属性”,打开数据库属性界面,这次选择“文件”,打开文件管理界面,如图4所示:

Sqlserver分表(水平分表)_第4张图片

在文件管理界面中,点击箭头①所示的“添加”选项,添加新的文件,在新添加的箭头②所示的区域,根据实际需求,填写对应的文件属性值,填写完成后点击“确定”。其中,一个文件组中可以添加多个文件,即“文件组”属性的值是可以重复的。

3.2.4 定义分区表
在SQL Server 2012 Management Studio的界面中,找到目标数据库下的“表”菜单,右键点击,选择“新建数据库表”,打开新建数据库表界面,新建一个分区表。如图5所示:

Sqlserver分表(水平分表)_第5张图片

3.2.5 添加分区函数和分区架构
完成新建分区表后,我们就可以在分区表上添加分区函数和分区架构了。右键点击分区表,选择“存储”,然后选择“创建分区”,开始添加分区函数和分区架构,如图6所示:

Sqlserver分表(水平分表)_第6张图片

点击“下一步”,如图7所示:

Sqlserver分表(水平分表)_第7张图片

在图7所示的界面中,勾选分区列,勾选完成后,选择“下一步”,如图8所示:

Sqlserver分表(水平分表)_第8张图片

在图8所示的界面填写分区函数名称,填写完成后点击“下一步”,如图9所示:

Sqlserver分表(水平分表)_第9张图片

在图9所示的界面中填写需要创建的分区架构的名称,填写完成后点击“下一步”,如图10所示:

Sqlserver分表(水平分表)_第10张图片

如图10所示,按照图示箭头步骤,一步步设置文件组参数。首先选择分区边界值划分在左边界分区还是右边界分区,然后进行第二步,设置分区所属文件组,再设置分区边界值(该值要与分区表的分区字段类型对应),最后点击“预计存储空间(E)”对其他参数进行自动填充。设置完成后点击“下一步”,如图11所示:

Sqlserver分表(水平分表)_第11张图片

在图11所示的界面中,根据实际需求完成最后的设置(一般不做设置),然后点击“完成”,在下一个界面中再次点击“完成”,然后等待数据库执行操作,最后关闭界面。

分区完成后,右键点击分区表,选择“属性”,然后选择“存储”,打开如图12所示界面:

Sqlserver分表(水平分表)_第12张图片

从图12中可以看到数据库表已经完成分区。

动态添加分割点

要完成动态的向分区函数中添加分割点的功能,首先我们来理一下思路:首先我们要向文件组中添加一个新的文件或者直接添加一个新的文件组,添加完成后,需要修改分区架构,来告知数据库新分的分区数据存储到那个文件或者文件组中,最后在分区函数中添加新的分割点,完成动态添加分区分割点的功能。
根据这个思路,写了一个存储过程,用于动态的添加分割点:

CREATE proc[dbo].[Demo_FileGroup_Add]

as

declare

@file_name varchar(20),--要添加的文件名称

@add_sql nvarchar(max)--在文件组下添加新文件的SQL语句

begin  

set @file_name='DemoFile'+left((convert(varchar,(DATEADD(yy, DATEDIFF(yy,0,(DATEADD(YY,1,GETDATE()))), 0)),120)),4)--动态拼接文件名

set @add_sql='

ALTER DATABASE Demo ADD FILE (

NAME='+@file_name+',

FILENAME=''D:\ProgramFiles\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\'+@file_name+'.mdf'',

SIZE=5MB,

FILEGROWTH=5MB)

TO FILEGROUP DemoFileGroup'

--select @add_sql

Exec sp_executesql@add_sql--执行向文件组中添加文件的SQL语句

alter partitionscheme DemoPartitionSchemenext used 'DemoFileGroup' --告知数据库新建立的分区放在哪个文件组(修改分区架构)

alter partitionfunction DemoPartitionFunction() split range (CONVERT(VARCHAR,DATEADD(yy, DATEDIFF(yy,0,(DATEADD(YY,1,GETDATE()))), 0),120))--在分区函数中添加分割点

end

    注意:在执行该存储过程之前,一定要确保文件组中没有即将添加的文件,并且在分区函数中,没有要添加的分割点,否则会报错,存储过程不能执行。

分区分表理解

分区分表分为垂直分区分表和水平分区分表,总结如下:

垂直分区分表是在SQL Server 2005之前大量使用的,垂直分表相对很少见到和用到,因为这可能是数据库设计上的问题了。如果数据库中一张表有部分字段几乎从不不更改但经常查询,而部分字段的数据频繁更改,这种设计放到同一个表中就不合理了,相互影响太大了。在已存在改情况的表的时候,可以考虑按列拆分表,即垂直拆分。拆分完成后,通过分表之间设置外键关联,然后创建视图和触发器等对表进行增、删、改、查操作。

而水平分区分表是SQL Server2005之后被大量使用的。其原理就是将逻辑上的一个表,在物理上拆分,将数据存储在不同的文件组中

你可能感兴趣的:(数据库)