- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章SQL Server 数据库分区分表(水平分表)详细步骤由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
1、 需求说明 。
将数据库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中,以此类推).
。
2.1分区原理 。
要实现这一功能,首先要了解数据库对水平分区表进行分区存储的原理.
所谓水平分区分表,就是把逻辑上的一个表,在物理上按照你指定的规则分放到不同的文件里,把一个大的数据文件拆分为多个小文件,还可以把这些小文件放在不同的磁盘下。这样把一个大的文件拆分成多个小文件,便于我们对数据的管理.
2.2 水平分区优点 。
l 便于存档 。
l 便于管理:备份恢复时可以单一的备份或者恢复某一个分区 。
l 提高可用性:一个分区故障,不影响其他分区的正常使用 。
l 提高性能:提升查询数据的速度 。
2.3 实现思路 。
① 创建数据库 。
② 在创建的数据库中添加文件组 。
③ 在文件组中添加新的文件 。
④ 定义分区函数 。
⑤ 定义分区架构 。
⑥ 定义分区表 。
⑦ 定义代理作业,自动添加分区分割点 。
⑧ 测试数据 。
注意:
² 分区表依赖于分区架构,而分区架构又依赖与分区函数,所以在穿件分区函数、分区架构、分区表是要按照对应的顺序创建.
² 分区函数并不属于具体的分区架构和分区表,它们之间仅仅是使用关系.
² 分区表只能在创建的时候指定为分区表 。
。
3.1代码创建分区表 。
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) 。
代码示例:
1
2
3
4
5
6
|
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”中的边界值被划分到哪一个分区中(即,边界值属于左侧分区还是右侧分区).
代码示例:
1
2
3
|
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 ] ) 。
[ ; ] 。
代码示例:
1
2
3
|
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) 。
代码示例:
1
2
3
4
5
|
create
tabledemotable(
demo_id
bigint
,
demo_date datetime2(0),
demo_desc
varchar
(50)
) ondemopartitionscheme(demo_date)
|
3.2 界面向导表分区 。
在3.4、3.5、3.6中,我们已经详细的描述了如何定义分区函数、分区架构以及分区表,但这些都是通过代码实现的,下面,我们来通过sql server 2012 management studio的界面向导创建分区表.
3.2.1 创建数据库 。
右键点击“数据库”,选择第一项“新建数据库(n)…”,新建数据库,如图1所示:
图1 新建数据库 。
3.2.2 创建文件组 。
右键数据库demo,选择“属性”,如图2所示:
图2 数据库属性界面 。
在属性界面中,点击箭头所示的“文件组”选项,进入文件组编辑界面,如图3所示:
图3 文件组管理界面 。
在文件组管理界面中点击箭头①所示的“添加”选项,添加新的文件组,界面中会出现箭头②所示的属性框,并键入对应的属性值,之后点击“确定”,完成新建文件组.
3.2.3 添加文件 。
和添加文件组的方式一样,右键数据库demo,选择“属性”,打开数据库属性界面,这次选择“文件”,打开文件管理界面,如图4所示:
图4 文件管理界面 。
在文件管理界面中,点击箭头①所示的“添加”选项,添加新的文件,在新添加的箭头②所示的区域,根据实际需求,填写对应的文件属性值,填写完成后点击“确定”。其中,一个文件组中可以添加多个文件,即“文件组”属性的值是可以重复的.
3.2.4 定义分区表 。
在sql server 2012 management studio的界面中,找到目标数据库下的“表”菜单,右键点击,选择“新建数据库表”,打开新建数据库表界面,新建一个分区表。如图5所示:
图5 新建数据库表 。
3.2.5 添加分区函数和分区架构 。
完成新建分区表后,我们就可以在分区表上添加分区函数和分区架构了。右键点击分区表,选择“存储”,然后选择“创建分区”,开始添加分区函数和分区架构,如图6所示:
图6 新建分区界面 。
点击“下一步”,如图7所示:
图7 选择分区列 。
在图7所示的界面中,勾选分区列,勾选完成后,选择“下一步”,如图8所示:
图8 填写分区函数 。
在图8所示的界面填写分区函数名称,填写完成后点击“下一步”,如图9所示:
图9 填写分区架构 。
在图9所示的界面中填写需要创建的分区架构的名称,填写完成后点击“下一步”,如图10所示:
图10 指定文件组 。
如图10所示,按照图示箭头步骤,一步步设置文件组参数。首先选择分区边界值划分在左边界分区还是右边界分区,然后进行第二步,设置分区所属文件组,再设置分区边界值(该值要与分区表的分区字段类型对应),最后点击“预计存储空间(e)”对其他参数进行自动填充。设置完成后点击“下一步”,如图11所示:
图11 脚本设置 。
在图11所示的界面中,根据实际需求完成最后的设置(一般不做设置),然后点击“完成”,在下一个界面中再次点击“完成”,然后等待数据库执行操作,最后关闭界面.
分区完成后,右键点击分区表,选择“属性”,然后选择“存储”,打开如图12所示界面:
图12 表分区查看 。
从图12中可以看到数据库表已经完成分区.
3.3 动态添加分割点 。
要完成动态的向分区函数中添加分割点的功能,首先我们来理一下思路:首先我们要向文件组中添加一个新的文件或者直接添加一个新的文件组,添加完成后,需要修改分区架构,来告知数据库新分的分区数据存储到那个文件或者文件组中,最后在分区函数中添加新的分割点,完成动态添加分区分割点的功能.
根据这个思路,我编写的了一个存储过程,用于动态的添加分割点:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
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
|
注意:在执行该存储过程之前,一定要确保文件组中没有即将添加的文件,并且在分区函数中,没有要添加的分割点,否则会报错,存储过程不能执行.
。
4.1 添加测试数据 。
4.1.1 新建测试表 。
新建一个未分区的testtable表,其表结构与分区表demotable表结构完全一致,代码如下:
1
2
3
4
5
|
create
table
[dbo].[testtable](
[demo_id][
bigint
],
[demo_date][datetime2](0),
[demo_desc][
varchar
](50)
)
|
4.1.2 编写t-sql添加测试数据 。
t-sql语句如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
declare
@num
bigint
,
--id
@test_date datetime2(0),
--时间
@test_desc
varchar
(300),
--描述
@
count
int
--计数器
begin
set
@num= 0
--设置初始id
set
@test_date=
'2015-01-01 00:00:00'
--设置初始日期
set
@test_desc=
'屈贾谊于长沙,无非明主;窜梁鸿于海曲,岂乏明时?'
while (@test_date<
'2019-01-01 00:00:00'
)
--设置日期上限
begin
set
@
count
= 0
while(@
count
<10)
--每个时间点添加10条数据
begin
insertinto dbo.demotable
values
(@num,@test_date,@test_desc+
cast
(@
count
as
varchar
))
--添加数据
set
@
count
=@
count
+1
--计数自增
set
@num = @num +1
--id自增
end
set
@test_date = dateadd(mi,1,@test_date)
--每一个时间点添加完10条数据后,时间自增1分
end
end
|
修改t-sql语句中insert部分的表明,分别向两张表中添加测试数据,添加21038400行数据,结果如下: 。
图13 分区表插入数据耗时统计 。
图14 分区表存储信息 。
图15 普通表插入数据耗时统计 。
图16 普通表存储信息 。
从图13与图15中可以看出,同样插入21038400行数据,分区表耗时3740秒,普通表耗时3920秒,分区表快4.6%。考虑到运行环境对测试数据的影响,在此我们先对此数据不做评价,毕竟4.6%不是很明显.
而从图14与图16的对比中可以看出,分区表的索引空间为0.125mb,而普通表的索引空间为0.008mb。那么为什么分区表的索引空间要比普通表的索引空间大呢?其实这个问题个人理解大致是:创建分区表就是将数据存储在不同的文件中,然后数据库会根据分区函数和分区架构,以分区列为索引列,创建分区索引来管理数据存放的位置,所以分区表的索引空间理所当然会比普通标表的索引空间大.
默认情况下,分区表中创建的索引使用与分区表相同分区架构和分区列,这样,索引将于表对齐。将表与其索引对齐,可以使管理工作更容易进行,对于滑动窗口方案尤其如此。若要启动分区切换,表的所有索引都必须对齐.
在创建索引时,也可以指定不同的分区方案(schema)或单独的文件组(filegroup)来存储索引,这样sql server 不会将索引与表对齐.
在已分区的表上创建索引(分区索引)时,应该注意以下事项:
l 唯一索引 。
建立唯一索引(聚集或者非聚集)时,分区列必须出现在索引列中。此限制将使sql server只调查单个分区,并确保表中宠物的新键值。如果分区依据列不可能包含在唯一键中,则必须使用dml触发器,而不是强制实现唯一性.
l 非唯一索引 。
对非唯一的聚集索引进行分区时,如果未在聚集键中明确指定分区依据列,默认情况下sql server 将在聚集索引列中添加分区依据列.
对非唯一的非聚集索引进行分区时,默认情况下sql server 将分区依据列添加为索引的包含性列,以确保索引与基表对齐,若果索引中已经存在分区依据列,sql server 将不会像索引中添加分区依据列.
。
5.1 分区分表理解 。
分区分表分为垂直分区分表和水平分区分表,根据我自己查阅资料,总结如下:
垂直分区分表是在sql server 2005之前大量使用的,垂直分表相对很少见到和用到,因为这可能是数据库设计上的问题了。如果数据库中一张表有部分字段几乎从不不更改但经常查询,而部分字段的数据频繁更改,这种设计放到同一个表中就不合理了,相互影响太大了。在已存在改情况的表的时候,可以考虑按列拆分表,即垂直拆分。拆分完成后,通过分表之间设置外键关联,然后创建视图和触发器等对表进行增、删、改、查操作.
而水平分区分表是sql server2005之后被大量使用的。其原理就是将逻辑上的一个表,在物理上拆分,将数据存储在不同的文件组中,这个我们前边已经讲过了,这里就不在赘述.
5.2 水平分区分表疑惑 。
在自己学习水平分区分表的过程中发现一个问题,描述如下:
在创建分区表的时候,似乎可以将不同分区的数据存放在同一个文件组下的不同文件中,也可以将不同分区的数据分别存放在不同的文件组,那么这两种存储数据的方式对数据查询的性能有影响吗?
这个问题我觉得可以做一个小小的测试.
5.3 其它说明 。
学习是永无止境的,这篇文章只是我个人在学习sql server水平分区分表的时候做的一些总结,其中添加了一些个人理解,如果有不对的地方,欢迎与我交流,大家相互学习,共同进步。 。
原文链接:https://blog.csdn.net/exceptionalboy/article/details/78851327 。
最后此篇关于SQL Server 数据库分区分表(水平分表)详细步骤的文章就讲到这里了,如果你想了解更多关于SQL Server 数据库分区分表(水平分表)详细步骤的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
目录 进程 其他相关概念 创建线程的两种方式 为什么使用start()方法而不直接使用run()方法 start()方法底层
CURL状态码列表 状态码 状态原因 解释 0 正常访问
ODBC连接类函数 odbc_connect函数:打开一个ODBC连接 odbc_close函数:关闭一个已经打开的ODBC连接 odbc_close_all函数:关闭所有已经打开的ODBC连
作为标题,如何计算从纪元1900到现在使用boost的持续时间? 编辑:很抱歉以前的问题太短。我将再次描述我的问题。 我有关于将生日另存为整数的问题。我创建了四个函数,用法如下: ptime转换为整数
前言 在Java中,有一个常被忽略 但 非常重要的关键字Synchronized今天,我将详细讲解 Java关键字Synchronized的所有知识,希望你们会喜欢 目录 1. 定义 J
详细 JVM 垃圾收集日志的时间戳是收集的开始还是结束? 2016-08-09T21:04:19.756-0400: 224890.317: [GC Desired survivor size 167
我在“Master-Detail”概念上苦苦挣扎,除了一点点(但很重要)的细微差别外,几乎所有东西都按预期工作。我应该在 Storyboard上更改什么以在详细信息 View (屏幕截图底部的右上角)
我希望能够显示表格的详细 View ,但不推送新屏幕,而只显示表格所在的详细 View 。 设置它的最佳方式是什么......如果真的可行的话? ---------------------------
我在我的博客中为我的帖子使用了详细 View ,每篇帖子都有评论,所以我想对它们进行分页,但我不知道该怎么做,因为我请求了帖子模型。我知道如何在功能 View 中执行此操作,但不知道如何在详细 Vie
在下面的代码中,与 pm 对齐,该行是否会 move 整个内存并将其分配给 pm,或者它只会 move p 指向的内存而不是整个数组? int main() { int*
1·下载 https://dev.mysql.com/downloads/mysql/ 2·安装服务 1)管理员运行cmd 2)D: 3)cd D:\mysql
今天以前一直用的SQL Server 2005做开发,偶尔也用MySQL,现入手公司项目,用到SQL Server 2008,于是乎必须安装它,免得出现其他很纠结的小问题,现将自己安装图解分享如下:
1. crontab命令选项 复制代码 代码如下: #crontab -u <-l, -r, -e> -u指定一个用
我们有一个 WPF 应用程序,它有一个主窗口/详细信息窗口,两者都是 WPF 数据网格。当您在上部数据网格中选择一行时,详细信息将显示在下部数据网格中。我想知道从 UI 的角度来看是否有任何关于如何处
在可视化 Perforce 客户端 (p4v) 中有一个选项: 显示文件操作的 p4 命令输出 启用后,在日志 Pane 中,我可以看到这样的详细日志记录: p4 sync /Users/az/ftp
在其他服务器上设置测试环境后,在几个API调用中出现错误。 99%肯定这是MySQL的事情,但是返回的错误根本没有帮助: global name 'sys' is not defined" 我已经导入
我正在维护一个通用的 iOS 应用程序,其开发已开始于 iOS 6。我正在为 iOS 7 更新 UI。现在我遇到了应用程序的 iPad 部分的奇怪问题。这部分遵循使用 UISplitViewContr
我希望我能正确描述这种情况。当它发生时很容易在屏幕上看到,但很难用语言解释,但我会尽力而为。 我有一个带有固定主视图 (UITableView) 和两个详细 View 之一的 UISplitViewC
我尝试在 eclipse 和 intelliJ 参数中使用垃圾收集记录器来配置简单的测试程序。尝试了不同类型的配置,但尚未创建日志文件。 -XX:+PrintGCDetails -XX:+PrintG
正如您所知,.cap 文件中的 java 小程序的输出文件格式必须通过智能卡读卡器/写卡器(如 ACR122 或任何其他读卡器)部署到 java 卡,而且我相信 java 卡与 java 卡之间的部署
我是一名优秀的程序员,十分优秀!