SQL Server表分区

SQL Server表分区

什么是表分区

一般情况下,我们建立数据库表时,表数据都存放在一个文件里。

但是如果是分区表的话,表数据就会按照你指定的规则分放到不同的文件里,把一个大的数据文件拆分为多个小文件,还可以把这些小文件放在不同的磁盘下由多个cpu进行处理。这样文件的大小随着拆分而减小,还得到硬件系统的加强,自然对我们操作数据是大大有利的。

所以大数据量的数据表,对分区的需要还是必要的,因为它可以提高select效率,还可以对历史数据经行区分存档等。但是数据量少的数据就不要凑这个热闹啦,因为表分区会对数据库产生不必要的开销,除啦性能还会增加实现对象的管理费用和复杂性。

跟着做,分区如此简单

先跟着做一个分区表(分为11个分区),去除神秘的面纱,然后咱们再逐一击破各个要点要害。

分区是要把一个表数据拆分为若干子集合,也就是把把一个数据文件拆分到多个数据文件中,然而这些文件的存放可以依托一个文件组或这多个文件组,由于多个文件组可以提高数据库的访问并发量,还可以把不同的分区配置到不同的磁盘中提高效率,所以创建时建议分区跟文件组个数相同。

1.创建文件组

可以点击数据库属性在文件组里面添加

T-sql语法:

alter database <数据库名> add filegroup <文件组名>
---创建数据库文件组
alter database testSplit add filegroup ByIdGroup1
alter database testSplit add filegroup ByIdGroup2
alter database testSplit add filegroup ByIdGroup3
alter database testSplit add filegroup ByIdGroup4
alter database testSplit add filegroup ByIdGroup5
alter database testSplit add filegroup ByIdGroup6
alter database testSplit add filegroup ByIdGroup7
alter database testSplit add filegroup ByIdGroup8
alter database testSplit add filegroup ByIdGroup9
alter database testSplit add filegroup ByIdGroup10

 

2.创建数据文件到文件组里面

可以点击数据库属性在文件里面添加

T-sql语法:

alter database <数据库名称> add file <数据标识> to filegroup <文件组名称>--<数据标识> (name:文件名,fliename:物理路径文件名,size:文件初始大小kb/mb/gb/tb,filegrowth:文件自动增量kb/mb/gb/tb/%,maxsize:文件可以增加到的最大大小kb/mb/gb/tb/unlimited)
alter database testSplit add file 
(name=N'ById1',filename=N'J:\Work\数据库\data\ById1.ndf',size=5Mb,filegrowth=5mb)
to filegroup ByIdGroup1
alter database testSplit add file 
(name=N'ById2',filename=N'J:\Work\数据库\data\ById2.ndf',size=5Mb,filegrowth=5mb)
to filegroup ByIdGroup2
alter database testSplit add file 
(name=N'ById3',filename=N'J:\Work\数据库\data\ById3.ndf',size=5Mb,filegrowth=5mb)
to filegroup ByIdGroup3
alter database testSplit add file 
(name=N'ById4',filename=N'J:\Work\数据库\data\ById4.ndf',size=5Mb,filegrowth=5mb)
to filegroup ByIdGroup4
alter database testSplit add file 
(name=N'ById5',filename=N'J:\Work\数据库\data\ById5.ndf',size=5Mb,filegrowth=5mb)
to filegroup ByIdGroup5
alter database testSplit add file 
(name=N'ById6',filename=N'J:\Work\数据库\data\ById6.ndf',size=5Mb,filegrowth=5mb)
to filegroup ByIdGroup6
alter database testSplit add file 
(name=N'ById7',filename=N'J:\Work\数据库\data\ById7.ndf',size=5Mb,filegrowth=5mb)
to filegroup ByIdGroup7
alter database testSplit add file 
(name=N'ById8',filename=N'J:\Work\数据库\data\ById8.ndf',size=5Mb,filegrowth=5mb)
to filegroup ByIdGroup8
alter database testSplit add file 
(name=N'ById9',filename=N'J:\Work\数据库\data\ById9.ndf',size=5Mb,filegrowth=5mb)
to filegroup ByIdGroup9
alter database testSplit add file 
(name=N'ById10',filename=N'J:\Work\数据库\data\ById10.ndf',size=5Mb,filegrowth=5mb)
to filegroup ByIdGroup10

 

执行完成后,右键数据库看文件组跟文件里面是不是多出来啦这些文件组跟文件。

3.使用向导创建分区表

右键到要分区的表--- >> 存储 --- >> 创建分区 --- >>显示向导视图 --- >> 下一步 --- >> 下一步。。

这里举例说下选择列的意思:

假如你选择的是int类型的列:那么你的分区可以指定为1--100W是一个分区,100W--200W是一个分区....

假如你选择的是datatime类型:那么你的分区可以指定为:2014-01-01--2014-01-31一个分区,2014-02-01--2014-02-28一个分区...

根据这样的列数据规则划分,那么在那个区间的数据,在插入数据库时就被指向那个分区存储下来。

 

我这里选用orderid int类型 --- >> 下一步 --- >>

左边界右边界:就是把临界值划分给上一个分区还是下一个分区。一个小于号,一个小于等于号。

然后下一步下一步最后你会得到分区函数和分区方案。

 

USE [testSplit]
GO
BEGIN TRANSACTION--创建分区函数
CREATE PARTITION FUNCTION [bgPartitionFun](int) AS RANGE LEFT FOR VALUES (N'1000000', N'2000000', N'3000000', N'4000000', N'5000000', N'6000000', N'7000000', N'8000000', N'9000000', N'10000000')--创建分区方案
CREATE PARTITION SCHEME [bgPartitionSchema] AS PARTITION [bgPartitionFun] TO ([PRIMARY], [ByIdGroup1], [ByIdGroup2], [ByIdGroup3], [ByIdGroup4], [ByIdGroup5], [ByIdGroup6], [ByIdGroup7], [ByIdGroup8], [ByIdGroup9], [ByIdGroup10])--创建分区索引
CREATE CLUSTERED INDEX [ClusteredIndex_on_bgPartitionSchema_635342971076448165] ON [dbo].[BigOrder] 
([OrderId]
)WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [bgPartitionSchema]([OrderId])--删除分区索引
DROP INDEX [ClusteredIndex_on_bgPartitionSchema_635342971076448165] ON [dbo].[BigOrder] WITH ( ONLINE = OFF )COMMIT TRANSACTION

 

执行上面向导生成的语句。分区完成。。

4.秀一下速度。

首先我在表中插入啦1千万行数据。给表分啦11个分区。前十个分区里面一个是100W条数据。。

说两句:

可见反常现象,扫描次数跟逻辑读取次数都是无分区表的2倍之多,但查询速度却是快啦不少啊。这就是分区的神奇之处啊,所以要相信这世界一切皆有可能。

分区函数,分区方案,分区表,分区索引

1.分区函数

指定分依据区列(依据列唯一),分区数据范围规则,分区数量,然后将数据映射到一组分区上。

创建语法: 

create partition function 分区函数名(<分区列类型>) as range [left/right] 
for values (每个分区的边界值,....) 
--创建分区函数
CREATE PARTITION FUNCTION [bgPartitionFun](int) AS RANGE LEFT FOR VALUES (N'1000000', N'2000000', N'3000000', N'4000000', N'5000000', N'6000000', N'7000000', N'8000000', N'9000000', N'10000000')

然而,分区函数只定义了分区的方法,此方法具体用在哪个表的那一列上,则需要在创建表或索引是指定。 

删除语法:

--删除分区语法
drop partition function <分区函数名>
--删除分区函数 bgPartitionFun
drop partition function bgPartitionFun

需要注意的是,只有没有应用到分区方案中的分区函数才能被删除。

2.分区方案

指定分区对应的文件组。

创建语法: 

--创建分区方案语法
create partition scheme <分区方案名称> as partition <分区函数名称> [all]to (文件组名称,....) 
--创建分区方案,所有分区在一个组里面
CREATE PARTITION SCHEME [bgPartitionSchema] AS PARTITION [bgPartitionFun] TO ([ByIdGroup1], [ByIdGroup1], [ByIdGroup1], [ByIdGroup1], [ByIdGroup1], [ByIdGroup1], [ByIdGroup1], [ByIdGroup1], [ByIdGroup1], [ByIdGroup1], [ByIdGroup1])

分区函数必须关联分区方案才能有效,然而分区方案指定的文件组数量必须与分区数量一致,哪怕多个分区存放在一个文件组中。

删除语法:

--删除分区方案语法
drop partition scheme<分区方案名称>
--删除分区方案 bgPartitionSchema
drop partition scheme bgPartitionSchema1

只有没有分区表,或索引使用该分区方案是,才能对其删除。

3.分区表

创建语法:

--创建分区表语法
create table <表名> (<列定义>
)on<分区方案名>(分区列名)
--创建分区表
create table BigOrder (OrderId              int                  identity,orderNum             varchar(30)          not null,OrderStatus          int                  not null default 0,OrderPayStatus       int                  not null default 0,UserId               varchar(40)          not null,CreateDate           datetime             null default getdate(),Mark                 nvarchar(300)        null
)on bgPartitionSchema(OrderId)

 

如果在表中创建主键或唯一索引,则分区依据列必须为该列。

4.分区索引

创建语法: 

--创建分区索引语法
create <索引分类> index <索引名称> 
on <表名>(列名)
on <分区方案名>(分区依据列名)
--创建分区索引
CREATE CLUSTERED INDEX [ClusteredIndex_on_bgPartitionSchema_635342971076448165] ON [dbo].[BigOrder] 
([OrderId]
)WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [bgPartitionSchema]([OrderId])

使用分区索引查询,可以避免多个cpu操作多个磁盘时产生的冲突。

分区表明细信息

这里的语法,我就不写啦,自己看语句分析吧。简单的很。。

1.查看分区依据列的指定值所在的分区 

--查询分区依据列为10000014的数据在哪个分区上
select $partition.bgPartitionFun(2000000)  --返回值是2,表示此值存在第2个分区 

2.查看分区表中,每个非空分区存在的行数

--查看分区表中,每个非空分区存在的行数
select $partition.bgPartitionFun(orderid) as partitionNum,count(*) as recordCount
from bigorder
group by  $partition.bgPartitionFun(orderid)

3.查看指定分区中的数据记录 

---查看指定分区中的数据记录
select * from bigorder where $partition.bgPartitionFun(orderid)=2

结果:数据从1000001开始到200W结束

分区的拆分与合并以及数据移动

 1.拆分分区

在分区函数中新增一个边界值,即可将一个分区变为2个。

--分区拆分
alter partition function bgPartitionFun()
split range(N'1500000')  --将第二个分区拆为2个分区

注意:如果分区函数已经指定了分区方案,则分区数需要和分区方案中指定的文件组个数保持对应一致。

 2.合并分区

 与拆分分区相反,去除一个边界值即可。

--合并分区
alter partition function bgPartitionFun()
merge range(N'1500000')  --将第二第三分区合并

3.分区中的数据移动

 你或许会遇到这样的需求,将普通表数据复制到分区表中,或者将分区表中的数据复制到普通表中。

 那么移动数据这两个表,则必须满足下面的要求。

  • 字段数量相同,对应位置的字段相同
  • 相同位置的字段要有相同的属性,相同的类型。
  • 两个表在一个文件组中

1.创建表时指定文件组

--创建表
create table <表名> (<列定义>
)on <文件组名>

2.从分区表中复制数据到普通表

--将bigorder分区表中的第一分区数据复制到普通表中
alter table bigorder switch partition 1 to <普通表名>

3.从普通标中复制数据到分区表中

这里要注意的是要先将分区表中的索引删除,即便普通表中存在跟分区表中相同的索引。

--将普通表中的数据复制到bigorder分区表中的第一分区
alter table <普通表名> switch to bigorder partition 1

分区视图

分区视图是先建立带有字段约束的相同表,而约束不同,例如,第一个表的id约束为0--100W,第二表为101万到200万.....依次类推。

创建完一系列的表之后,用union all 连接起来创建一个视图,这个视图就形成啦分区视同。

很简单的,这里我主要是说分区表,就不说分区视图啦。。

 查看数据库分区信息

 

SELECT OBJECT_NAME(p.object_id) AS ObjectName,i.name                   AS IndexName,p.index_id               AS IndexID,ds.name                  AS PartitionScheme,   p.partition_number       AS PartitionNumber,fg.name                  AS FileGroupName,prv_left.value           AS LowerBoundaryValue,prv_right.value          AS UpperBoundaryValue,CASE pf.boundary_value_on_rightWHEN 1 THEN 'RIGHT'ELSE 'LEFT' END    AS Range,p.rows AS Rows
FROM sys.partitions                  AS p
JOIN sys.indexes                     AS iON i.object_id = p.object_idAND i.index_id = p.index_id
JOIN sys.data_spaces                 AS dsON ds.data_space_id = i.data_space_id
JOIN sys.partition_schemes           AS psON ps.data_space_id = ds.data_space_id
JOIN sys.partition_functions         AS pfON pf.function_id = ps.function_id
JOIN sys.destination_data_spaces     AS dds2ON dds2.partition_scheme_id = ps.data_space_id AND dds2.destination_id = p.partition_number
JOIN sys.filegroups                  AS fgON fg.data_space_id = dds2.data_space_id
LEFT JOIN sys.partition_range_values AS prv_leftON ps.function_id = prv_left.function_idAND prv_left.boundary_id = p.partition_number - 1
LEFT JOIN sys.partition_range_values AS prv_rightON ps.function_id = prv_right.function_idAND prv_right.boundary_id = p.partition_number 
WHEREOBJECTPROPERTY(p.object_id, 'ISMSShipped') = 0
UNION ALL
SELECTOBJECT_NAME(p.object_id)    AS ObjectName,i.name                      AS IndexName,p.index_id                  AS IndexID,NULL                        AS PartitionScheme,p.partition_number          AS PartitionNumber,fg.name                     AS FileGroupName,  NULL                        AS LowerBoundaryValue,NULL                        AS UpperBoundaryValue,NULL                        AS Boundary, p.rows                      AS Rows
FROM sys.partitions     AS p
JOIN sys.indexes        AS iON i.object_id = p.object_idAND i.index_id = p.index_id
JOIN sys.data_spaces    AS dsON ds.data_space_id = i.data_space_id
JOIN sys.filegroups           AS fgON fg.data_space_id = i.data_space_id
WHEREOBJECTPROPERTY(p.object_id, 'ISMSShipped') = 0
ORDER BYObjectName,IndexID,PartitionNumber

 

转自:https://www.cnblogs.com/knowledgesea/p/3696912.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/286124.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

apt 根据注解,编译时生成代码

apt&#xff1a; Retention后面的值&#xff0c;设置的为CLASS&#xff0c;说明就是编译时动态处理的。一般这类注解会在编译的时候&#xff0c;根据注解标识&#xff0c;动态生成一些类或者生成一些xml都可以&#xff0c;在运行时期&#xff0c;这类注解是没有的~~会依靠动态生…

Hello Playwright:(6)与元素交互

在上一节我们已经了解到如何定位到元素&#xff0c;那么接下来就可以与元素进行交互了。下面的例子都是以百度首页作为测试页面输入文本FillAsync方法用于模拟用户选中元素并输入文本&#xff0c;这会触发元素的 input 事件。该方法只适合<input>、<textarea>等可输…

十二、动态座位响应及用户订票《仿淘票票系统前后端完全制作(除支付外)》

一、动态座位设置及发布 首先打开在线编辑器进入我们的项目&#xff1a;https://editor.ivx.cn/ 上一节中已经完成了座位设置的准备&#xff0c;这一节咱们将完成座位设置及发布的功能。 咱们首先给有座位设置事件&#xff1a; 有座位的事件设置当点击后更改当前的内容为0即…

C# 查询大型数据集

LINQ 语法非常好&#xff0c;但其作用是什么&#xff1f;我们只要查看源数组&#xff0c;就可以看出需要的结果&#xff0c;为什么要查询这种一眼就能看出结果的数据源呢&#xff1f;有时查询的结果不那么明显&#xff0c;在下面的示例中&#xff0c;就创建了一个非常大的数字数…

一、博客首页搭建搭建《iVX低代码仿CSDN个人博客制作》

制作iVX 低代码项目需要进入在线IDE&#xff1a;https://editor.ivx.cn/ 一、头部导航栏思路参考 首先我们可以查看CSDN的博客首页&#xff0c;从中查看一下布局&#xff1a; 在以上首页中&#xff0c;我们可以得知其顶部为一个整行&#xff0c;这个行内容左侧为一个logo&am…

linux samba服务器

本文转自wanglm51051CTO博客&#xff0c;原文链接&#xff1a; http://blog.51cto.com/studyit2016/1890282&#xff0c;如需转载请自行联系原作者

modernizer的意义

modernizer是一个js文件&#xff0c;会检查当前的浏览器支持什么特性&#xff0c;就在Html标签上添加什么类&#xff0c;然后如果不支持添加no-xxx类&#xff0c;这样&#xff0c;就可以针对两种情况写两种css。 http://blog.chinaunix.net/uid-21633169-id-4286857.html转载于…

Rafy 框架 - 幽灵插件(假删除)

Rafy 框架又添新成员&#xff1a;幽灵插件。本文将解释该插件的场景、使用方法、原理。 场景 在开发各类数据库应用系统时&#xff0c;往往需要在删除数据时不是真正地删除数据&#xff0c;而只是把数据标识为‘已删除’状态。这些数据在业务逻辑上是已经完全删除、不可用的数据…

二、博客首页完成《iVX低代码仿CSDN个人博客制作》

制作iVX 低代码项目需要进入在线IDE&#xff1a;https://editor.ivx.cn/ 一、菜单思路参考及制作 在 CSDN 首页中的菜单部分为一串横排的内容&#xff0c;并且可以进行拖动&#xff1a; 首先咱们添加一个行&#xff0c;命名为菜单&#xff1a; 接着肯定是需要设置上下的内边…

现在是2016-09-23,查询2个月后的月份和入职的月份相同的数据

select * from emp where to_char(hiredate,mm)to_char(add_months( sysdate,2),mm); 结果&#xff1a; 转载于:https://www.cnblogs.com/feng666666/p/5900182.html

Git之创建远程分支和删除远程分支

1、创建远程分支browser-1.8.0 在没有创造browser-1.8.0之前,我们先查看下所有分支 git branch -a 可以知道我们目前在browser-1.7.0分支,然后我们创建本地分支browser-1.8.0 git branch browser-1.8.0 再看下所有分支 git branch -a 然后我们再切换到分支browser-1.8.…

ASIHTTPRequest源码简单分析

2019独角兽企业重金招聘Python工程师标准>>> 1.前言 ASIHttprequest 是基于CFNetwork的&#xff0c;由于CFNetwork是比较底层的http库&#xff0c;功能比较少&#xff0c;因此&#xff0c;在ASIHttprequest中实现了http协议中比较多的功能&#xff0c;包括代理、gzi…

【遥感物候】1983-2012年时间序列中国地区GIMMS 3g NDVI下载(已进行旋转、格式转换、投影变换和裁剪)

文章目录 1. 数据集简介2. 数据集预览3. 数据集下载1. 数据集简介 本数据集为1983-2012年,长时间序列中国地区GIMMS 3g NDVI,空间分辨率为0.08333度,作者已完成了数据预处理:包括旋转、格式转换、投影变换和裁剪),作者可以此基础上直接进行NDVI时空变化趋势分析、基于NDV…

三、博客首页完成《iVX低代码仿CSDN个人博客制作》

制作iVX 低代码项目需要进入在线IDE&#xff1a;https://editor.ivx.cn/ 一、首页内容分析 此时我们分析一下首页内容&#xff1a; 通过以上内容可以得知&#xff0c;这些内容都统一包含在一个块之内&#xff0c;这个块之内包含了多个内容&#xff0c;这些内容主要是分为标题…

正则表达式 (grep)

正则表达式 (grep) grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具&#xff0c;它能使用正则表达式搜索文本&#xff0c;并把匹配的行打印出来。搜索的结果被送到屏幕&#xff0c;不影响原文…

vuejs 和 element 搭建的一个后台管理界面【收藏】

介绍&#xff1a; 这是一个用vuejs2.0和element搭建的后台管理界面。 相关技术&#xff1a; vuejs2.0&#xff1a;渐进式JavaScript框架&#xff0c;易用、灵活、高效&#xff0c;似乎任何规模的应用都适用。 element&#xff1a;基于vuejs2.0的ui组件库。 vue-router&#xff…

【MATLAB统计分析与应用100例】案例010:matlab调用normrnd函数生成正态分布随机数

效果预览: 文章目录 1. 调用normrnd函数生成1000行3列的随机数矩阵x,其元素服从均值为75,标准差为8的正态分布(1)代码(2)运行效果2. 调用normrnd函数生成1000行3列的随机数矩阵x,其各列元素分别服从不同的正态分布(1)代码(2)运行效果<

四、博客详情页完成《iVX低代码仿CSDN个人博客制作》

制作iVX 低代码项目需要进入在线IDE&#xff1a;https://editor.ivx.cn/ 一、博客详情页分析 博客详情页大体分为顶部标题、发布时间、作者信息、博文内容&#xff0c;底部的评论我们在此不必做悬浮内容&#xff0c;咱们直接放到博文之下进行显示即可&#xff1b;顶部标题需要…

【原创】erlang 模块之 application

2019独角兽企业重金招聘Python工程师标准>>> kernel-2.15.2 中的内容 1 2 3 4 5 6 7 8 9 10 11 12 13 14 转载于:https://my.oschina.net/moooofly/blog/595122

RabbitMQ详解(三)

一、分发到多Consumer(fanout) 二、Routing路由(Direct) 三、主题路由(Topic)一、分发到多Consumer(fanout)将同一个Message deliver到多个Consumer中。这个模式也被称为"publish/subscribe" 创建一个日志系统&#xff0c;包含两部分&#xff1a;第一部分发出log(Pro…