SQL SERVER 表分区

news2024/11/27 23:41:08

1. 概要说明

SQL SERVER的表分区功能是为了将一个大表(表中含有非常多条数据)的数据根据某条件(仅限该表的主键)拆分成多个文件存放,以提高查询数据时的效率。创建表分区的主要步骤是

1、确定需要以哪一个字段作为分区条件;

2、拆分成多少个文件保存该表;

3、分区函数(拆分条件);

4、分区方案(按拆分函数拆分后需要对应到哪些文件组中去)。

不是企业版的sql server不支持分区;

参考:SQL SERVER 表分区实施步骤_sqlserver表分区步骤_Henry_Wu001的博客-CSDN博客

sql server 分区表 性能 sqlserver分区表实战_mob6454cc77db30的技术博客_51CTO博客

(0.1)SQL Server分区介绍
在SQL Server中,数据库的所有表和索引都视为已分区表和索引,默认这些表和索引值包含一个分区;也就是说表或索引至少包含一个分区。SQL Server中数据是按水平方式分区,是多行数据映射到单个分区。已经分区的表或者索引,在执行查询或者更新时,将被看作为单个逻辑实体;简单说来利用分区将一个表数据分多个表来存储,对于大数据量的表,将表分成多块查询,若只查询某个分区数据将降低消耗提高效率。需要注意的是单个索引或者表的分区必须位于一个数据库中。在使用大量数据管理时,SQL Server使用分区可以快速访问数据子集,减少io提高效率。

同时不同分区可以存放在不同文件组里,文件组若能存放在不同逻辑磁盘上,则可以实现io的并发使用以提高效率

(0.2)SQL Server分区创建概述
创建分区函数:确定分区方式和界点
创建分区架构:将分区函数指定的分区映射到文件组
新建分区表
索引分区知识详解
(0.3)SQL Server分区管理概述
拆分分区(split)
合并分区(merge)
切换分区(switch)
$PARTION

【1】创建表分区
未分区的表,相当于只有一个分区,只能存储在一个FileGroup中;对表进行分区后,每一个分区都存储在一个FileGroup,或分布式存储在不同的FileGroup中。对表进行分区的过程,实际上是将逻辑上完整的一个表,按照特定的字段拆分成多个分区,分散到相同或不同的FileGroup中,每一个部分叫做表的一个分区(Partition),一个分区实际上是一个独立的,内部的物理表。也就是说,分区表在逻辑上是一个表,而在物理上是多个完全独立的表。

分区(Partition)的特性是:

每一个Partition在FileGroup中都独立存储,分区之间是相互独立的
每一个parititon都属于唯一的表对象,
每一个Partition 都有唯一的ID,
每一个Partition都有一个编号(Partition Number),同一个表的分区编号是唯一的,从1开始递增;

Step0,准备工作:构建文件组和文件
登录后复制 
--添加文件组
alter database testSplit add filegroup db_fg1

--添加文件到文件组
alter database testSplit add file 
(name=N'ById1',filename=N'J:\Work\数据库\data\ById1.ndf',size=5Mb,filegrowth=5mb)
to filegroup db_fg1
 

一,新建分区表分为三步

Step1, 创建分区函数
要先创建函数

分区函数的作用是提供分区字段的类型和分区的边界值,进而决定分区的数量

CREATE PARTITION FUNCTION [pf_int](int) 
AS RANGE LEFT 
FOR VALUES (10, 20)
 

分区函数pf_int 的含义是按照int类型分区,分区的边界值是10,20,left表示边界值属于左边界。两个边界值能够分成三个分区,别是(-infinite,10],(10,20],(20,+infinite)。

Step2,创建分区架构(Scheme)
再创建架构、应用函数

分区架构的作用是为Parition分配FileGroup,在逻辑上,Partition Scheme和FileGroup是等价的,都是数据存储的逻辑空间,只不过Partition Scheme指定的是多个FileGroup。

CREATE PARTITION SCHEME [ps_int] 
AS PARTITION [pf_int] 
TO ([PRIMARY], [db_fg1], [db_fg1])
 

不管是在不同的FileGroup中,还是在相同的FileGroup中,分区都是独立存储的。

分区scheme的所有分区都存储到相同的文件组中:

CREATE PARTITION SCHEME [ps_int] 
AS PARTITION [pf_int] 
ALL TO ([PRIMARY])

 

Step3,新建分区表
新建分区表,实际上是在创建Table时,使用on子句指定数据存储的逻辑位置是分区架构(Partition Scheme)

create table dbo.dt_test
(
    ID int,
    code int
)
on [ps_int] (id)
 

查看分区编号(Partition Number)
分区编号(Partition Number) 从1开始,从最左边的分区向右依次递增+1,边界值最小的分区编号是1,

例如,对于以下分区函数:

CREATE PARTITION FUNCTION pf_int_Left (int)
AS 
RANGE LEFT 
FOR VALUES (10,20);

分区的边界值(Boundary Value)是10,20, 边界值属于左边界(Range Left),该分区函数 pf_int_Left 划分了三个分区(Partition),范围区间是:(-infinite,10], (10,20], (20,+infinite),(小括号表示不包括边界值,中括号表示包括边界值),系统分配的分区编号分别是:1,2,3。用户可以通过使用$Partition函数 查看分区编号,调用语法格式是:
$Partition.Partition_Function(Partition_Column_Value)

例如,通过$Partition函数 查看分区列值为21时,该行数据所在的分区编号:

select $Partition.pf_int_left(21)

由于分区列值是21, 属于范围(20,+infinite),因此分区编号是:3。

【2】对现有表分区
在SQL Server中,普通表可以转化为分区表,而分区表不能转化为普通表,普通表转化成分区表的过程是不可逆的,将普通表转化为分区表的方法是:

在分区架构(Partition Scheme)上创建聚集索引,就是说,将聚集索引分区。

数据库中已有分区函数(partition function) 和分区架构(Partition scheme):

-- create parition function
CREATE PARTITION FUNCTION pf_int_Left (int)
AS RANGE LEFT 
FOR VALUES (10,20);

--determine partition number
select $Partition.pf_int_left(21)

CREATE PARTITION SCHEME PS_int_Left
AS PARTITION pf_int_Left
TO ([primary], [primary], [primary]);
如果在普通表上存在聚集索引,并且聚集索引列是分区列,那么重建聚集索引,就能使表转化成分区表。聚集索引的创建有两种方式:使用clustered 约束(primary key 或 unique约束)创建,使用 create clustered index 创建。

【2.1】在分区架构(Partition Scheme)上,创建聚集索引
如果聚集索引是使用 create clustered index 创建的,并且聚集索引列就是分区列,使普通表转换成分区表的方法是:删除所有的 nonclustered index,在partition scheme上重建clustered index

1,表dbo.dt_partition的聚集索引是使用 create clustered index 创建的,

create table dbo.dt_partition
(
ID int,
Code int
)

create clustered index cix_dt_partition_ID 
on dbo.dt_partition(ID)

2,从系统表Partition中,查看该表的分区只有一个

select *
from sys.partitions p 
where p.object_id=object_id(N'dbo.dt_partition',N'U')

3,使用partition scheme,重建表的聚集索引

create clustered index cix_dt_partition_ID 
on dbo.dt_partition(ID)
with(drop_existing=on)
on PS_int_Left(ID)

4,重建聚集索引之后,表的分区有三个

select *
from sys.partitions p 
where p.object_id=object_id(N'dbo.dt_partition',N'U')

【2.4】普通表=》分区表,不可逆
普通表转化成分区表的过程是不可逆的,普通表能够转化成分区表,而分区表不能转化成普通表。

普通表存储的Location是FileGroup,分区表存储的Location是Partition Scheme,在SQL Server中,存储表数据的Location叫做Data Space。

通过在Partition Scheme上创建Clustered Index ,能够将已经存在的普通表转化成partition table,但是,将Clustered index删除,表仍然是分区表,转化过程(将普通表转换成分区表)是不可逆的;

一个Partition Table 是不能转化成普通表的,即使通过合并分区,使Partiton Table 只存在一个Partition,这个表的仍然是Partition Table,这个Table的Data Space 是Partition Scheme,而不会转化成File Group。

从 sys.data_spaces 中查看Data Space ,共有两种类型,分别是FG 和 PS。

FG是File Group,意味着数据表的数据存储在File Group分配的存储空间,一个Table 只能存在于一个FileGroup中。PS 是Partition Scheme,意味着将数据分布式存储在不同的File Groups中,存储数据的File Group是根据Partition column值的范围来分配的。对于分区表,SQL Server从指定的File Group分配存储空间,虽然一个Table只能指定一个Partition Scheme,但是其数据却分布在多个File Groups中,这些File Groups由Partition Scheme指定,可以相同,也可以不同。
【3】分区切换
在SQL Server中,对超级大表做数据归档,使用select和delete命令是十分耗费CPU时间和Disk空间的;

SQL Server必须记录相应数量的事务日志,而使用switch操作归档分区表的老数据,十分高效,switch操作不会移动数据,只是做元数据的置换;

因此,执行分区切换操作的时间是非常短暂的,几乎是瞬间完成,但是,在做分区切换时,源表和靶表必须满足一定的条件:

表的结构相同:列的数据类型,可空性(nullability)相同;
索引结构必须相同:索引键的结构,聚集性,唯一性,列的可空性必须相同;
主键约束:如果源表存在主键约束,那么靶表必须创建等价的主键约束;
唯一约束:唯一约束可以使用唯一索引来实现;
索引键的结构:索引键的顺序,包含列,唯一性,聚集性都必须相同;
存储的数据空间(data space)相同:源表和靶表必须创建在相同的FileGroup或Partition Scheme上;
分区切换是将源表中的一个分区,切换到靶表(target_table)中,靶表可以是分区表,也可以不是分区表,switch操作的语法是:

ALTER TABLE schema_name . table_name 
SWITCH [ PARTITION source_partition_number_expression ]
TO target_table  [ PARTITION target_partition_number_expression ]

【3.2】源表和目标表的结构必须相同
1,数据列的可空性必须相同(nullability)

2,数据列的数据类型必须相同

1,数据列的可空性必须相同(nullability)

【3.5】交换分区:总结
在执行分区操作时,要求源表和靶表必须满足:

表的结构相同:列的数据类型,可空性(nullability)相同;
索引结构必须相同:索引键的结构,聚集性,唯一性,列的可空性必须相同;
主键约束:如果源表存在主键约束,那么靶表必须创建等价的主键约束;
唯一约束:唯一约束可以使用唯一索引来实现;
索引键的结构:索引键的顺序,包含列,唯一性,聚集性都必须相同;
存储的数据空间(data space)相同:源表和靶表必须创建在相同的FileGroup或Partition Scheme上;
 

(1)时间分区
代码:现有表转成分区表

--  创建测试数据,测试表  part_test
use test1;
if object_id('part_test' ) is not null
    drop table part_test;
;with t1 as (
select 1 as id,1 as num ,cast('2021-01-01 00:01:01' as datetime) as day_info
union all
select id+1 ,num+1 ,dateadd(day,1,day_info) from t1
where id<=1000000
)
select * into part_test from t1  option(maxrecursion 0)

-- 分区函数
CREATE PARTITION FUNCTION [pf_datetime](datetime) 
AS RANGE LEFT for values(
'2021-01-01' ,
'2022-01-01' ,
'2023-01-01' ,
'2024-01-01' ,
'2025-01-01' ,
'2026-01-01' ,
'2027-01-01' ,
'2028-01-01' ,
'2029-01-01' ,
'2030-01-01' ,
'2031-01-01' ,
'2032-01-01' ,
'2033-01-01' ,
'2034-01-01' ,
'2035-01-01' ,
'2036-01-01' ,
'2037-01-01' ,
'2038-01-01' ,
'2039-01-01' ,
'2040-01-01' ,
'2041-01-01' ,
'2042-01-01' ,
'2043-01-01' ,
'2044-01-01' ,
'2045-01-01' ,
'2046-01-01' ,
'2047-01-01' ,
'2048-01-01' 
);

-- 分区架构 
CREATE PARTITION SCHEME [ps_datetime] 
AS PARTITION [pf_datetime] 
ALL TO ([PRIMARY])


-- 创建聚集索引和耳机索引
create clustered index PIX_id on part_test(id)
create index ix_dayinfo on part_test(day_info)

-- 查看是否还有二级索引 
-- sp_help part_test

-- 删掉二级索引,重建聚集索引并应用分区架构
drop index ix_dayinfo on  part_test

-- 重建聚集索引=》现有表改成分区表,分区列必须是在主键内,比如这里的 day_info 就必须在主键内
create clustered index PIX_id
on dbo.part_test(ID,day_info)
with(drop_existing=on)
on [ps_datetime](day_info)

--创建索引对齐分区索引
create index id_p_num on part_test(num) on [ps_datetime](day_info)
create index id_p_dayinfo on part_test(day_info) on [ps_datetime](day_info)

select * from part_test where day_info='2021-01-11 00:01:01.000'

-- 拆分分区(最末尾)
-- 在分区函数中新增一个边界值,即可将一个分区变为2个。一般边界值默认是 left ;放到最前或者最后来拆分就是新增分区
alter partition function pf_datetime()
split range('2049-01-01')  --将第二个分区拆为2个分区

-- 归档到历史表
alter table bigorder switch partition 1 to <同表结构、默认值、null约束一致的表>
 

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

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

相关文章

语雀P0级时间爆发,留给运维的时间不多了?

事件背景 打工人的焦虑&#xff0c;已经延伸到在线文档了。近日&#xff0c;语雀P0级故障想必大家都有所体会&#xff0c;宕机近8小时&#xff0c;笔记、离线同步完全不可用。作为用户尤其担心我的文档资料是否会因此消失。 这泼天的8小时&#xff0c;放眼互联网界也是相当炸裂…

重生奇迹MU的三大知名宝石

一、祝福宝石 祝福宝石也是重生奇迹中的一种知名宝石&#xff0c;它的体积要比玛雅宝石大一些&#xff0c;颜色是一种粉色&#xff0c;呈菱形的一个多面体&#xff0c;掉在地上或是鼠标移上去&#xff0c;你就能看到“祝福宝石”这几个字样。 如果你打到祝福宝石的话&#xf…

记录微调chatglm3

用于记录chatglm3的过程&#xff0c;防止忘记 需要注意的 可以使用xtuner -h查看有哪些功能可以使用。 [2023-10-31 11:40:18,643] [INFO] [real_accelerator.py:158:get_accelerator] Setting ds_accelerator to cuda (auto detect) 10/31 11:40:22 - mmengine - INFO - Ar…

在Windows上安装Elasticsearch-8.x.x

前言 Elasticsearch 是一种流行的开源搜索和分析引擎&#xff0c;它提供了强大的全文搜索和实时数据分析功能&#xff0c;被广泛应用于各种领域&#xff0c;包括大数据分析、日志处理、企业搜索等。 一、下载 Elasticsearch 官方网站&#xff08;https://www.elastic.co/dow…

R语言在生态环境领域中的实践技术应用

R语言作为新兴的统计软件&#xff0c;以开源、自由、免费等特点风靡全球。生态环境领域研究内容广泛&#xff0c;数据常多样而复杂。利用R语言进行多元统计分析&#xff0c;从复杂的现象中发现规律、探索机制正是R的优势。为此&#xff0c;以鱼类、昆虫、水文、地形等多样化的生…

Django开发实例总结(入门级、4.2.6、详细)

目录 概述 Django的核心组件包括 Django的项目结构 创建工程&#xff08;4.2.6&#xff09; 实例一&#xff1a;Hello world 实例二&#xff1a;访问一个自定义主页 实例三&#xff1a;通过登录跳转到主页 实例四&#xff1a;主页添加静态文件&#xff0c;包含js、css、…

学习Python,为什么可以轻松应对工作大小事?

Python&#xff0c;大名鼎鼎&#xff0c;它在工作中到底能发挥什么样的作用&#xff1f;在现代职场&#xff0c;Python如同一把瑰丽的多功能钥匙&#xff0c;能打开各行各业的大门。无论你是行政助手、财务分析师、电商经营者&#xff0c;还是数据研究员&#xff0c;Python都能…

pychram中cmd已导入docx库仍报错ModuleNotFoundError: No module named ‘docx‘

已经在cmd里pip install python-docx了&#xff0c;但是执行py文件时依然报错&#xff0c;解决方式是在File-Setting-Python Interpreter中点击号&#xff0c;搜索python-docx点击install package等待安装成功再执行文件就不会报错了。

SkyWalking官方文档-1-概述

概述 SkyWalking是一个开源的可观测平台&#xff0c;用于收集&#xff0c;分析&#xff0c;聚合&#xff0c;以及可视化处理来自服务和云原生框架的数据。SkyWalking提供了一种简单的方法来维护分布式系统的清晰视图&#xff0c;即使是跨云。 它是一种现代APM&#xff0c;专门…

手机app爬虫配置(模拟机)

近期在做某个项目,涉及到需要对手机app的进行数据爬取。 下面将讲述具体配置步骤 1、安装手机模拟器 在百度上搜索手机模拟器就可以啦,这里以夜神模拟器夜神安卓模拟器-安卓模拟器电脑版下载_安卓手游模拟器_手机模拟器_官网为例子。 下载后,直接点击安装即可。 2、安装…

多模态对比语言图像预训练CLIP:打破语言与视觉的界限

项目设计集合&#xff08;人工智能方向&#xff09;&#xff1a;助力新人快速实战掌握技能、自主完成项目设计升级&#xff0c;提升自身的硬实力&#xff08;不仅限NLP、知识图谱、计算机视觉等领域&#xff09;&#xff1a;汇总有意义的项目设计集合&#xff0c;助力新人快速实…

美国人工智能政策公布

美国总统拜登 30 号上午发布了一项关于人工智能&#xff08;AI&#xff09;的行政命令&#xff08;EO&#xff09;。该行政命令最初以白宫情况说明书的形式向公众提供&#xff0c;“为人工智能安全和安保制定了新标准&#xff0c;保护美国人的隐私&#xff0c;促进公平和公民权…

【C++指针】类的指针

/*** file * author jUicE_g2R(qq:3406291309) * brief 类的指针* copyright 2023.10* COPYRIGHT 原创学习笔记&#xff1a;转载需获得博主本人同意&#xff0c;且需标明转载源* language C*/1 类 类 类 需要在 . h 文件 .h文件 .h文件 先声明 //…

MyBatis批量插入数据优化,新增参数大幅提升操作效率

项目中进行接口压测&#xff0c;发现批量插入的速度有点超出预期&#xff0c;感觉很奇怪&#xff0c;经过定位后发现mybatise-plus批量保存的处理十分缓慢&#xff0c;使用的是saveBatch方法&#xff0c;这点有点想不通。于是就进行了相关内容分析。 根据mybatise-plus中saveB…

ecplise中导入或更新项目之后出现的jsp文件一直显示红叉

解决办法&#xff1a;右键---build path或者properties中找java build path 先检查项目本身的jre版本是不是不与你本身的加热版本相同&#xff0c;如果不相同&#xff0c;则选中这个jre Systemlibrary -----右边有一个remove删除点。。。 &#xff08;2&#xff09;重新添加一…

(自适应手机端)厨师招聘信息发布类网站模板

(自适应手机端)厨师招聘信息发布类网站模板 PbootCMS内核开发的网站模板&#xff0c;该模板适用于信息发布网站等企业&#xff0c;当然其他行业也可以做&#xff0c;只需要把文字图片换成其他行业的即可&#xff1b; 自适应手机端&#xff0c;同一个后台&#xff0c;数据即时同…

chatgpt中文翻译英文

chatgpt中文翻译英文 chatgpt很适合用于将翻译英文&#xff0c;在英文论文写作上&#xff0c;日常翻译任务都有很大帮助。 使用方法 给出下面这段话&#xff1a; 下面我让你来充当翻译家&#xff0c;你的目标是把中文翻译成英文&#xff0c;请翻译时不要带翻译腔&#xff0c…

灯串上亚马逊加拿大合规标准CSA认证如何办理?

灯串 灯串和配件都是插头连接的便携式、临时性商品&#xff0c;最大额定输入电压为 120 伏。 本政策适用于季节性照明、装饰性灯具以及灯串。 亚马逊灯串政策 根据亚马逊的要求&#xff0c;所有季节性和装饰性灯串均应经过检测&#xff0c;并且遵守下列法规、标准和要求&…

【数电知识点_2023.10.28】

数制与码制 十进制转二进制 8 bits 1 Byte 2|12 //121100自下而上 商为0为止 2|_ 6_…0 2|_ 3_…0 2|1…1 0…1 0.375 //0.3750.011自上而下 小数点为0为止 x 2 ———— 0.75…0 x 2 ———— 1.5…1 x 2 ———— 1…1 BCD码&#xff1a;每4位二进制表示一位十进制 8421…

装修怎么快速除甲醛 房间装修除装修异味方法

装修怎么快速除甲醛 房间装修除装修异味方法 甲醛问题在装修中引起关注&#xff0c;装修房子是每个家庭都会经历的事情&#xff0c;而甲醛污染也是其中的一个难题。甲醛是一种有害物质&#xff0c;对人体健康造成严重影响&#xff0c;尤其对婴幼儿更为敏感。在装修过程中&#…