当前位置: 首页 > 编程日记 > 正文

SQL Server2008及以上 表分区操作详解

SQL Server 表分区之水平表分区

转自:https://www.cnblogs.com/Brambling/p/6766482.html

什么是表分区?

表分区分为水平表分区和垂直表分区,水平表分区就是将一个具有大量数据的表,进行拆分为具有相同表结构的若干个表;而垂直表分区就是把一个拥有多个字段的表,根据需要进行拆分列,然后根据某一个字段进行关联。

表分区分为以下五个步骤:

1、创建文件组

2、创建数据文件

3、创建分区函数

4、创建分区方案

5、创建分区表

水平表分区

创建文件组:

语法:

-- 创建文件组语法
alter database <数据库名> add filegroup <文件组名>
复制代码
alter database Test add filegroup GroupOnealter database Test add filegroup GroupTwoalter database Test add filegroup GroupThreealter database Test add filegroup GroupFouralter database Test add filegroup GroupFive
复制代码

创建数据文件到指定文件组:

语法:

复制代码
-- 创建数据文件到指定文件组语法alter database <数据库名称> add file <文件属性> to filegroup <文件组名称><文件属性>
(name=文件的逻辑名称,filename=文件的物理名称,size=文件初始大小,filegrowth=文件自动增长量(数值或百分比),maxsize=文件增长的最大值
)
复制代码
复制代码
alter database Test add file
(name=N'OneFile',filename=N'D:\DataDB\OneFile.mdf',size=3MB,filegrowth=10%,maxsize=unlimited    -- 无限大小
)
to filegroup GroupOnealter database Test add file
(name=N'TwoFile',filename=N'D:\DataDB\TwoFile.mdf',size=3MB,filegrowth=10%,maxsize=unlimited    -- 无限大小
)
to filegroup GroupTwoalter database Test add file
(name=N'ThreeFile',filename=N'D:\DataDB\ThreeFile.mdf',size=3MB,filegrowth=10%,maxsize=unlimited    -- 无限大小
)
to filegroup GroupThreealter database Test add file
(name=N'FourFile',filename=N'D:\DataDB\FourFile.mdf',size=3MB,filegrowth=10%,maxsize=unlimited    -- 无限大小
)
to filegroup GroupFouralter database Test add file
(name=N'FiveFile',filename=N'D:\DataDB\FiveFile.mdf',size=3MB,filegrowth=10%,maxsize=unlimited    -- 无限大小
)
to filegroup GroupFive
复制代码

创建分区函数:

创建一个分区函数,创建分区函数的目的是告诉 SQL Server 以什么方式对分区表进行分区。

语法:

create partition function    -- 创建分区函数
Part_Fun(int)    -- 分区函数名(分区列类型)
as range [left/right]    -- 左置/右置,即边界值的存储位置,如果设置为右置,边界值存到下一个表
for values ('1000','2000','3000','4000','5000')        -- 设置每个分区表的边界值 
create partition function    
Part_Fun(int)    
as range right    
for values ('1000','2000','3000','4000','5000')        

删除分区函数:

--删除分区函数语法
drop partition function <分区函数名>--删除名为 Part_Fun 的分区函数
drop partition function Part_Fun

PS:只有当分区函数没有应用到分区方案中时,指定的分区函数才能被删除。

创建分区方案:

分区方案的作用是将分区函数生成的分区映射到文件组中去。分区函数的作用是告诉SQL Server,如何将数据进行分区,而分区方案的作用则是告诉 SQL Server 将已分区的数据放在哪个文件组中。

语法:

--创建分区方案语法
create partition scheme        -- 创建分区方案
<分区方案名称>    -- 分区方案名称
as partition <分区函数名称>    -- 指定分区函数名称
to (文件组名称,,,,)    -- 指定分区函数划分出来的数据对应存放的文件组
create partition scheme        -- 创建分区方案
Part_Plan    -- 分区方案名称
as partition Part_Fun    -- 分区函数名称
to ('GroupOne','GroupTwo','GroupThree','GroupFour','GroupFive') -- 分区文件组

一执行,结果报错了。

不对呀,我明明建立的是五个分区文件组,分区函数也是分为五份的啊。其实这里的意思应该就是后续数据的问题了,首先不可能保证这个表永远就 5000 条数据的,所以他在这里的意思就是后续数据存储的文件组。这里我把后续数据放在最后一个文件组里面。

create partition scheme        -- 创建分区方案
Part_Plan    -- 分区方案名称
as partition Part_Fun    -- 分区函数名称
to ('GroupOne','GroupTwo','GroupThree','GroupFour','GroupFive','GroupFive') -- 分区文件组

删除分区方案:

--删除分区方案语法
drop partition scheme<分区方案名称>--删除名为 Part_Plan 的分区方案
drop partition scheme Part_Plan

PS:当没有分区表引用该分区方案时,才能对其进行删除。

创建分区表:

语法:

--创建分区表语法
create table <表名>    -- 表名称
(column1        int        not null  primary key nonclustered,    -- 字段名称、字段类型、是否可空、主键约束、非聚集索引column2        int        not null    
) on <分区方案名>(分区列名)        -- 分区方案的名称(指定要依据分区的列名)
create table US_Info
(ID        int        not null    primary key identity(1,1),Name    nvarchar(32)    null,CreateTime    nvarchar(32)    null
)on Part_Plan(ID)

PS:如果在表中创建有主键、唯一索引、聚集索引,则分区依据列必须为该列之一。即分区依据列必须建立在主键、唯一索引、聚集索引之上。

创建分区索引:

语法:

--创建分区索引语法
create [ unique [ clustered | nonclustered ] ]  -- unique 唯一    clustered 聚集    nonclustered 非聚集
index <索引名称>    -- 指定索引名称
on <表名>(列名)        -- 指定表名(指定列名)
on <分区方案名>(分区依据列名)    -- 分区方案名称(分区依据列名)
create nonclustered  
index Part_Non_Name    
on US_Info(Name)        
on Part_Plan(ID)    

在表 US_Info 中插入5000条数据:

复制代码
declare @I    int
set @I=1
while(@I<=5000)
begininsert into US_Info(Name,CreateTime)values('名称'+convert(nvarchar,@I),Convert(nvarchar,GETDATE(),121))set @I=@I+1
endselect * from US_Info
复制代码

查询指定值位于数据表哪个分区中:

-- 查询指定值位于数据表哪个分区中select $partition.Part_Fun('3050')    -- 返回 4,表示位于第四个分区中

查询分区表中,每个分区存在的数据的行数:

--查看分区表中,每个分区存在的数据的行数select $partition.Part_Fun(ID) as Part_Num,count(1) as R_Count
from US_Info
group by  $partition.Part_Fun(ID)

查询指定分区中的数据:

-- 查询指定分区中的数据select * from US_Info 
where $partition.Part_Fun(ID)=3

拆分分区:

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

--将第 3 个分区拆分为 2 个分区
alter partition function Part_Fun()
split range(N'2500')  

一执行,报错了,拆分不了,因为前面我们已经用分区函数指定了分区和文件组,那就要先添加一个文件组。

为分区方案指定下一个文件组:

复制代码
-- 添加一个文件组 GroupSix
alter database Test add filegroup GroupSix-- 添加一个数据文件 
alter database Test add file
(name=N'SixFile',filename=N'D:\DataDB\SixFile.mdf',size=3MB,filegrowth=10%,maxsize=unlimited    -- 无限大小
)
to filegroup GroupSix-- 为分区方案指定下一个文件组alter partition scheme Part_Plan  -- 分区方案名称
next used GroupSix    -- 下一个文件组名称
复制代码

然后再来对分区进行拆分:

--将第 3 个分区拆分为 2 个分区
alter partition function Part_Fun()    -- 分区函数
split range        -- 分割界限
(N'2500')  -- 分区界限值

合并分区:

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

-- 将第 3 个分区与第 4 个分区合并
alter partition function Part_Fun()     -- 分区函数
merge range        -- 合并界限
(N'2500')  -- 合并界限值

复制分区表中的数据到普通表:

复制分区表中的数据到普通表需要满足以下条件:

数据表的结构必须相同,即字段数量、字段类型等,字段与字段之间必须对应。

两个表必须位于同一文件组,所以创建普通表的时候就需要指定文件组。

create table US_Info_back        -- 创建普通表的表名
(ID        int        not null    primary key identity(1,1),    -- 列定义Name    nvarchar(32)    null,CreateTime    nvarchar(32)    null
)on GroupThree    -- 指定文件组

将分区表中的数据复制到普通表:

复制代码
-- 将分区表 US_Info 中的第 3 个分区的数据复制到普通表 US_Info_back 中alter table US_Info 
switch partition 3 
to US_Info_backselect * from US_Info_back
复制代码

将普通表中的数据复制到分区表:

--将普通表 US_Info_back 中的数据复制到分区表 US_Info 中的第 6 个分区alter table US_Info_back    -- 普通表名
switch to US_Info    -- 分区表名
partition 6        -- 指定分区

PS:将普通表中的数据复制到分区表时,需要先删除分区表的索引。

将普通表转换为分区表:

当数据库已经存在数据的时候,就不能像上面那样直接建立分区表了,只能将普通表转换为分区表,只需在该普通表上创建一个聚集索引,并在该聚集索引中使用分区方案即可。

如果是已经存在的聚集索引,那么需要删除然后重新建立,并使用分区方案。

现在我有一个现成的表 UserInfo,因为它存在一个主键,而建立主键时,系统会自动为主键列添加聚集索引,因为这个聚集索引没法删除,所以我现在要先删除这个主键,然后重新建立一个主键,并设置为非聚集索引,然后为主键创建一个聚集索引(会覆盖非聚集索引),并使用分区方案指定分区列即可。

复制代码
-- 根据 指定表名 查询 表的约束
exec sp_helpconstraint UserInfo      -- UserInfo 表名-- 根据指定主键约束名删除指定表的主键约束
alter table UserInfo drop constraint PK__UserInfo__5A2040BBA6D6767A -- 添加主键约束,但设置为非聚集索引
alter table UserInfo add constraint PK__UserInfo__5A2040BBA6D6767A primary key nonclustered (U_Id)-- 添加一个聚集索引,并使用分区方案指定分区的列create clustered index CLU_StuNo -- 索引名称
on UserInfo(U_Id)  -- 指定添加索引的表(添加索引的列)
on Part_Plan(U_Id)        -- 分区方案名称(分区依据的列)
复制代码

为这个表也插入5000条数据,看看效果:

复制代码
declare @I    int
select @I=U_Id from UserInfo order by U_Id desc
while(@I<=5000)
begininsert into UserInfo(U_No,U_Name,U_Pwd)values('demo'+convert(nvarchar,@I),'demo'+convert(nvarchar,@I),'40D1C69C7B86064EA140C13CE8ED0E15')set @I=@I+1
endselect * from UserInfo
go
复制代码

查看分区表中,每个分区存在的数据的行数:

--查看分区表中,每个分区存在的数据的行数
select $partition.Part_Fun(U_Id) as Part_Num,count(1) as R_Count
from UserInfo 
group by  $partition.Part_Fun(U_Id)
order by Part_Num 

查看数据库分区信息 SQL(复制来的):

复制代码
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_id AND 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_id AND prv_left.boundary_id = p.partition_number - 1
LEFT JOIN sys.partition_range_values AS prv_rightON ps.function_id = prv_right.function_id AND prv_right.boundary_id = p.partition_number 
WHERE OBJECTPROPERTY(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 i ON i.object_id = p.object_id AND i.index_id = p.index_id
JOIN sys.data_spaces AS ds ON ds.data_space_id = i.data_space_id
JOIN sys.filegroups AS fg ON fg.data_space_id = i.data_space_id
WHERE OBJECTPROPERTY(p.object_id, 'ISMSShipped') = 0
ORDER BY ObjectName,IndexID,PartitionNumber
复制代码

参考:

http://www.cnblogs.com/knowledgesea/p/3696912.html

http://blog.csdn.net/lgb934/article/details/8662956

转载于:https://www.cnblogs.com/gered/p/8074747.html

相关文章:

浅谈New关键字

new关键字在我们的程序中可谓是无时不刻在用到&#xff0c;那么new关键字都可以用在哪些地方呢&#xff1f;考虑以下几个问题&#xff1a; 1、new一个class对象和new一个struct或者new一个enum有什么不同&#xff1f; 答&#xff1a;new一个class时&#xff0c;new完成2个内容&…

SpringBoot 框架中 使用Spring Aop 、创建注解、创建枚举类 使用过程记录

1、开始 在Springboot框架中引入AOP <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency> 2、创建注解 因需要在方法层面上进行控制 所以使用注解 import java.…

Linux下屏蔽Ctrl+Alt+Delete

1、Redhat 5.X/CentOS5.X--------------------------------------使用Root账户登陆系统&#xff0c;修改/etc/inittab# Trap CTRL-ALT-DELETEca::ctrlaltdel:/sbin/shutdown -t3 -r now这句前面加“#”注销掉 就可以了&#xff01;--------------------------------------2、Fe…

Python网络爬虫--urllib

本篇随便记录学习崔庆才老师编著的《Python3 网络爬虫开发实战》以及urllib标准库使用 urllib库是Python内置的HTTP请求库&#xff0c;包含四个模块&#xff1a; request&#xff1a;最基本的HTTP请求模块&#xff0c;可以用来模拟发送请求。error&#xff1a;异常处理模块&…

Python基础三--字典,集合,编码,深浅copy,元祖、文件操作

字典 dict数据类型划分&#xff1a;可变数据类型&#xff0c;不可变数据类型不可变数据类型&#xff1a; 元组&#xff0c;bool值&#xff0c;int&#xff0c;str 可哈希可变数据类型&#xff1a; list&#xff0c;dict&#xff0c;set 不可哈希dict key…

springboot +security +mybatis+thymeleaf 实现简单的用户 角色 权限(资源) 管理

1、用户 角色 资源的关系 2、实现思路 3、参考资料 Spring Boot Security Redis 实现简单权限控制 将返回结果变成json 响应改客户端 在第六项 4、实现代码 https://github.com/huyande/springsecurity.git 5、其他问题记录 在使用springboot 2.1.X 版本 &#xff0…

在JS中最常看到切最容易迷惑的语法(转)

发现一篇JS中比较容易迷惑的语法的解释,挺有用的,转载下,与大家分享: js中大括号有四种语义作用语义1&#xff0c;组织复合语句,这是最常见的 Js代码 if( condition ) { //... }else { //... } for() { //... } if( condition ) {//... }else {//... } f…

三、类型设计规范

一、类型的逻辑分组从CLR的角度来看&#xff0c;只有两种类型&#xff1a;引用类型和值类型。但从框架设计来说&#xff0c;可以进行更细致的分类 1、引用类型&#xff0c;包括&#xff1a;类、静态类、集合、数组、异常、属性2、值类型&#xff0c;包括&#xff1a;枚举和结构…

使用mybatis一次性添加多条数据 在oracle 数据库上

1、sql 语句 #sql 语句 insert into STD_XXXX &#xff08;表名&#xff09; (ID,NAME,CLASSNAME ) select STD_XXX_SEQUENCE.Nextval,&#xff08;自增序列名称&#xff09; XXX.* from (select 1,3 from dual unionselect 2,3 from dual)XXX 2、mybatis #多条插入 &…

使用SharpPCap在C#下进行网络抓包

转自http://www.cnblogs.com/billmo/archive/2008/11/09/1329972.html 在做大学最后的毕业设计了,无线局域网络远程安全监控策略那么抓包是这个系统设计的基础以前一直都是知道用winpcap的,现在网上搜了一下,有用C#封装好了的,很好用下面是其中的几个用法这个类库作者的主页:ht…

Spring Security的RBAC数据模型嵌入

1.简介 ​ 基于角色的权限访问控制&#xff08;Role-Based Access Control&#xff09;作为传统访问控制&#xff08;自主访问&#xff0c;强制访问&#xff09;的有前景的代替受到广泛的关注。在RBAC中&#xff0c;权限与角色相关联&#xff0c;用户通过成为适当角色的成员而得…

实用Jquery开发自己的插件

实用Jquery开发自己的插件 jQuery.fn.extend(object); jQuery.extend(object); jQuery.extend(object); 为扩展jQuery类本身.为类添加新的方法。 jQuery.fn.extend(object);给jQuery对象添加方法。 fn 是什么东西呢。查看jQuery代码&#xff0c;就不难发现。 jQuery.fn jQuery…

无线网中的一些技术名词和解释

现在大家到处都可以听到在说WLAN&#xff0c;到底 个WLAN是什么意思呢&#xff1f;WLAN&#xff1a;Wireless Local Area Network的缩写&#xff0c;也是无线局域网的意思。AP&#xff1a;Access Point,无线接入器&#xff0c;常常缩写为AP。SSID&#xff1a;也缩写国ESSID&…

说到心里的哲理个性签名 学生时代的恋爱无非就是陪伴二字

学生时代的恋爱无非就是陪伴二字 也许因为得不到所以空想总是美好 . 让一个男人哭了 没错你赢了 但是你玩大了 曾经我们都那样嚣张后来怎么也学会了退让. 爱一个人成为习惯就会失去放手的勇敢. 有时沉默并不是因为词穷而是因为心空. 前任也曾是对的人 别打听我我没故事可说. 你…

切换用户启动程序

#!/bin/bash su - elasticsearch <<EOF /opt/elasticsearch-6.6.2/bin/elasticsearch -d exit EOF转载于:https://www.cnblogs.com/divl/p/10826803.html

即将到来的日子 ,你会寂寞吗?

见到如此的数字&#xff0c;不知道身边的你是否会想起一些往事&#xff0c;我想这一刻很难去形容&#xff0c;因为哥也会有寂寞的一天。 从来不太喜欢的节日&#xff0c;但是每逢到来的时候&#xff0c;总会有一阵阵的痛。今天不是好的节日&#xff0c;在地球上某一个角落&…

Mybatis 获取当前序列和下一个序列值 以及在一个方法中写多条SQL 语句

目录 1、Mybatis 获取当前序列和下一个序列值 2、Mybatis 在一个方法中写多条SQL 语句 1、Mybatis 获取当前序列和下一个序列值 #获取当前序列值 select XXX_sequence.currval from dual#获取下一个序列值 select XXX_sequence.Nextval from dual2、Mybatis 在一个方法中写多条…

MikuMikuDance 6 菜单汉化补丁

MikuMikuDance是日本人樋口优所开发&#xff0c; 将VOCALOID2的初音未来等角色制作3D模组的免费软件。 简称为MMD。 汉化过程中 有同学反映 原来4.0 完全汉化版会出错 而不得不用回原版故这次 汉化仅汉化菜单部分 理论上不会出错如果是日文模式请选择ヘルプ(&H)-&…

收缩临时库 shrink tempdb

tempdb实际占用空间40mb,文件大小70G, 原始大小2GB 无法使用dbcc shrinkfile进行收缩. 看到的解决方案是 重启数据库DBCC FREESYSTEMCACHE (ALL) ,然后再收缩.http://social.msdn.microsoft.com/Forums/en/sqldatabaseengine/thread/7b45f0de-2aa3-4de0-930b-d9d0fe931b3a http…

H5如何测试?

它跟安卓APP与IOS APP有什么样的区别呢&#xff1f;★ 我们以往的APP是使用原生系统内核的&#xff0c;相当于直接在系统上操作&#xff0c;是我们传统意义上的软件&#xff0c;更加稳定★ H5的APP先得调用系统的浏览器内核&#xff0c;相当于是在网页中进行操作&#xff0c;较…

二维数组练习--矩阵的加法和乘法

数组的练习示例展示&#xff1a; package arrayList; /*** 矩阵的集中运算法则&#xff1a;求和&#xff0c;求积&#xff0c;求逆矩阵&#xff0c;转置矩阵......* author Drew**/ public class Arrays {/*** 两个二维数组&#xff08;矩阵&#xff09;求和。* param a 矩阵&a…

文件分享微信小程序的设计与开发 Java开发微信小程序 毕业设计

目录 使用的技术 2、功能介绍 3、此小程序未部署 所以体验不了 4、如何联系我或需要源码进行联系 使用的技术 SpringbootMybatisMysql 微信小程序Mpvue 1、小程序展示 后台管理 2、功能介绍 用户第一次使用小程序 用户授权上传视频和图片设置密码和有效期分享给微信好友…

Silverlight 3发布新版3.0.50106.0

微软1月19日发布Silverlight 3新版本3.0.50106.0.该版本主要修复以下几个问题&#xff1a;问题一&#xff1a; 当使用图形硬件加速功能&#xff08;GPU&#xff09;的时候&#xff0c;如果GPU驱动报错&#xff0c;Silverlight 3应用将不再正确显示内容。该问题是因为Silverligh…

递归该怎么写(二)

对于简单的递归&#xff08;可以写出数学表达式的递归&#xff09;&#xff0c;我们已经熟练掌握&#xff0c;但是对于有些递归我们有时候无从下手。这时候我们需要将抽象的问题数学化&#xff0c;或者能表达出来。 &#xff08;本节需要掌握&#xff1a; 熟悉递归函数的返回是…

chrome 浏览器打开静态html 获取json文件失败 解决方法

如图加&#xff1a; --allow-file-access-from-files

个人站立会议6

昨天做&#xff1a; 软件的出租功能部分 遇到问题&#xff1a; jsp 与数据库的连接 解决方法&#xff1a;查找资料&#xff0c;向他人请教。 今天做&#xff1a; 软件的出租功能部分。转载于:https://www.cnblogs.com/luohaochi/p/8092589.html

IIS配置跨服务器迁移

这几天&#xff0c;因为服务器要重装&#xff0c;要将此服务器的IIS网站搬到别一台服务器&#xff0c;因运行在此服务器上的站点有200多&#xff0c;不可能手动去重新设置&#xff0c;在网上找了一些迁移的工具&#xff0c;效果不理想&#xff0c;仔细研究IIS后&#xff0c;终天…

Express4.x API (四):Router (译)

Express4.x API 译文 系列文章 Express4.x API (一)&#xff1a;application (译) -- 完成Express4.x API (二)&#xff1a;request (译) -- 完成Express4.x API (三)&#xff1a;Response (译) -- 完成Express4.x API (四)&#xff1a;router (译) -- 完成已经完成了Express4.…

JavaScript(转载)

正则表达式用于字符串处理&#xff0c;表单验证等场合&#xff0c;实用高效&#xff0c;但用到时总是不太把握&#xff0c;以致往往要上网查一番。我将一些常用的表达式收藏在这里&#xff0c;作备忘之用。 匹配中文字符的正则表达式&#xff1a; [\u4e00-\u9fa5]匹配双字节字符…

复杂JSON参数传递后台处理方式

如图 或者使用 requestBoby 注解