SQLSERVER 的表分区(水平) 操作记录1
--创建表格 (注意) 是唯一(NONCLUSTERED)表示 非聚集索引
CREATE TABLE [dbo].[UserInfo](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](50) NULL,
[Age] [int] NULL,
[Address] [nvarchar](50) NULL,
[Price] [decimal](18, 2) NULL,
[CreateDate] [datetime] NULL,
[Remarks] [nvarchar](521) NULL,
[Imges] [nvarchar](521) NULL,
[Country] [nvarchar](521) NULL,
[Phone] [nvarchar](521) NULL,
[Sex] [nvarchar](521) NULL,
[Files] [nvarchar](521) NULL,
[Pwd] [nvarchar](521) NULL,
CONSTRAINT [PK_UserInfo] PRIMARY KEY NONCLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
)
GO
1 ----(非原创只是自己整理记录!!!)---------------原文地址: https://blog.csdn.net/exceptionalboy/article/details/78851327-------
1.当然需要许多测试数据可以使用 进行生成测试数据 比如我就是10000000万的数据进行操作的
2 实现思路
2.1 分区原理
要实现这一功能,首先要了解数据库对水平分区表进行分区存储的原理。
所谓水平分区分表,就是把逻辑上的一个表,在物理上按照你指定的规则分放到不同的文件里,把一个大的数据文件拆分为多个小文件,还可以把这些小文件放在不同的磁盘下。这样把一个大的文件拆分成多个小文件,便于我们对数据的管理。
2.2 水平分区优点
l 便于存档
l 便于管理:备份恢复时可以单一的备份或者恢复某一个分区
l 提高可用性:一个分区故障,不影响其他分区的正常使用
l 提高性能:提升查询数据的速度
2.3 实现思路
① 创建数据库
② 在创建的数据库中添加文件组
③ 在文件组中添加新的文件
④ 定义分区函数
⑤ 定义分区架构
⑥ 定义分区表
⑦ 定义代理作业,自动添加分区分割点
⑧ 测试数据
注意:
² 分区表依赖于分区架构,而分区架构又依赖与分区函数,所以在穿件分区函数、分区架构、分区表是要按照对应的顺序创建。
² 分区函数并不属于具体的分区架构和分区表,它们之间仅仅是使用关系。
² 分区表只能在创建的时候指定为分区表
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)
代码示例:
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 界面向导表分区
在3.4、3.5、3.6中,我们已经详细的描述了如何定义分区函数、分区架构以及分区表,但这些都是通过代码实现的,下面,我们来通过SQL Server 2012 Management Studio的界面向导创建分区表。
3.2.1 创建数据库
右键点击“数据库”,选择第一项“新建数据库(N)…”,新建数据库,如图1所示:
3.2.2 创建文件组
右键数据库Demo,选择“属性”,如图2所示:
在属性界面中,点击箭头所示的“文件组”选项,进入文件组编辑界面,如图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 动态添加分割点
要完成动态的向分区函数中添加分割点的功能,首先我们来理一下思路:首先我们要向文件组中添加一个新的文件或者直接添加一个新的文件组,添加完成后,需要修改分区架构,来告知数据库新分的分区数据存储到那个文件或者文件组中,最后在分区函数中添加新的分割点,完成动态添加分区分割点的功能。
根据这个思路,我编写的了一个存储过程,用于动态的添加分割点:
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 测试数据
4.1 添加测试数据
4.1.1 新建测试表
新建一个未分区的TestTable表,其表结构与分区表DemoTable表结构完全一致,代码如下:
CREATE TABLE[dbo].[TestTable](
[demo_id][bigint],
[demo_date][datetime2](0),
[demo_desc][varchar](50)
)
4.1.2 编写T-SQL添加测试数据
T-SQL语句如下:
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 补充说明
5.1 分区分表理解
分区分表分为垂直分区分表和水平分区分表,根据我自己查阅资料,总结如下:
垂直分区分表是在SQL Server 2005之前大量使用的,垂直分表相对很少见到和用到,因为这可能是数据库设计上的问题了。如果数据库中一张表有部分字段几乎从不不更改但经常查询,而部分字段的数据频繁更改,这种设计放到同一个表中就不合理了,相互影响太大了。在已存在改情况的表的时候,可以考虑按列拆分表,即垂直拆分。拆分完成后,通过分表之间设置外键关联,然后创建视图和触发器等对表进行增、删、改、查操作。
而水平分区分表是SQL Server2005之后被大量使用的。其原理就是将逻辑上的一个表,在物理上拆分,将数据存储在不同的文件组中,这个我们前边已经讲过了,这里就不在赘述。
SQLSERVER 的表分区(水平) 操作记录1的更多相关文章
- SQL Server表分区-水平分区
SQL Server表分区,sql server水平分区 转自:http://www.cnblogs.com/knowledgesea/p/3696912.html 根据时间的,直接上T-SQL代码 ...
- hive表分区相关操作
Hive 表分区 Hive表的分区就是一个目录,分区字段不和表的字段重复 创建分区表: create table tb_partition(id string, name string) PARTIT ...
- sqlserver 数据库表分区
参考文档 https://msdn.microsoft.com/zh-cn/library/ms345146(SQL.90).aspx http://blog.sina.com.cn/s/blog_4 ...
- sqlserver 删除表分区
我们都知道,SQL server2008R2企业版以及一些其它的版本支持分区函数,当你在这些数据库备份后想在一些不支持分区函数的数据库做还原时,就会失败. 下面我们来解决这个问题. 1.备份数据库!备 ...
- sqlserver 2008r2 表分区拆分问题
问题描述: 对tab1表实行自动天分区,每天通过sqlserver代理-作业00:00点自动生成分区: 因有次停了数据库服务,sqlserver 代理服务忘记开启,导致当天00:00没有生成新分区: ...
- mongodb安装,库操作,集合操作(表),文档操作(记录)
安装 1.下载地址 https://fastdl.mongodb.org/win32/mongodb-win32-x86_64-2008plus-ssl-4.0.8-signed.msi 2.如果报没 ...
- SqlServer系统表认识和操作
地址:http://technet.microsoft.com/zh-cn/library/ms178551.aspx 一.sys.sysindexkeys 包含有关数据库的索引中的键或列的信息.(表 ...
- 记一次oracle新建用户及分配指定表权限的操作记录
1.登录 2.创建用户create user new用户名 identified by new用户名创建new用户名用户,密码设置为new用户名. 3.授权new用户名用户的连接.资源权限.grant ...
- sqlserver表分区小结
为什么要表分区? 当一个表的数据量太大的时候,我们最想做的一件事是什么?将这个表一分为二或者更多分,但是表还是这个表,只是将其内容存储分开,这样读取就快了N倍了 原理:表数据是无法放在文件中的,但是 ...
- sqlserver2012 表分区
无论是新建数据库,还是现有的问题,都可以执行表分区的操作. 1.在数据库中点鼠标右键点击属性,在选择页,选中文件栏,在数据库文件列表中,可以看到现有的数据库文件逻辑名称.文件类型.初始大小.保存位置等 ...
随机推荐
- Lua学习笔记之迭代器、table、模块和包、元表和协程
迭代器 迭代器是一种对象,它能够来遍历标准库模板容器中的部分或全部元素,每个迭代器对象代表容器中确定的地址,在Lua中迭代器是一种支持指针类型的结构,他可以遍历集合的每一个元素. 泛型for迭代器 泛 ...
- swagger 文档优化 knife4j 增强 Swagger
swagger 省去了程序员开发过程中拟写接口文档的时间,是团队开发必不可少的工具,原生的swagger 界面功能比较少,也不支持文档导出,业界也有不少针对swagger 文档界面优化的插件,良莠不齐 ...
- python中partial用法
应用 典型的,函数在执行时,要带上所有必要的参数进行调用.然后,有时参数可以在函数被调用之前提前获知.这种情况下,一个函数有一个或多个参数预先就能用上,以便函数能用更少的参数进行调用. 示例pyqt5 ...
- DataGear 制作Excel动态数据可视化图表
DataGear 4.1.0 版本增强了Excel数据集功能,新增了[工作表名称]项,并且支持填写参数化语法内容,使得可基于Excel多工作表,构建动态数据可视化图表. 本文以某商品三个地区的各季度销 ...
- 【Azure API 管理】APIM不能连接到 App Service (APIM cannot connect to APP service)
问题描述 APIM 无法正确连接到App Service,返回500错误: { "statusCode": 500, "message": "Inte ...
- 图数据库|Nebula Graph v3.1.0 性能报告
本文首发于 Nebula Graph Community 公众号 本文系 Nebula Graph 发行版 v3.1.0 的性能测试报告. 本文目录 测试环境 测试数据 关于 LDBC-SNB 测试说 ...
- 小程序开发:app.vue检测更新时判断是否是朋友圈进入
因为如果从朋友圈点进小程序来的,有些功能就用不了,所以需要判断下是否从朋友圈点进来的. 检查代码如下: checkScene() { // 判断场景值 如果是从分享到朋友圈再打开 就会有一些功能无法使 ...
- AT_abc342_d 题解
UD 2024/2/24 22:36 感谢 Lixiang_is_potato 指出一处笔误. 本文同步发表于洛谷. 赛时挂了,但是赛后 3min AC,我是飞舞. 题意 给你一个长度为 \(N\) ...
- MySQL---面经
如果想要对 MySQL 的索引树有更深入的了解,掘金的小册子:<MySQL 是怎样运行的> MySQL 是怎样运行的 以下是常见面试题 MySQL日志 MySQL日志系统 redo_log ...
- 使用 Docker 部署 Next Terminal 轻量级堡垒机
1)Next Terminal 介绍 官网:https://next-terminal.typesafe.cn/ GitHub:https://github.com/dushixiang/next-t ...