sql server 分区

一.分区表概念

1.1、什么是分区表

分区表是SQL Server2005新引入的概念,这个特性允许把逻辑上的一个表在物理上分为很多部分(即它允许将一个表存储在不同的物理磁盘里),分区表在逻辑上是一个表,而物理上是多个表。

1.2、分区与分表的区别

分区:就是把一张表的数据分成N个区块,从逻辑上看只是一张表,但底层是由N个物理区块组成的。

分表:就是把一张表按一定的规则分解成N个具有独立存储空间的实体表。

1.3、水平分表与垂直分表的区别

水平分表:将一张表中的数据分成多个表且表结构不变。

垂直分表:将一张表按照字段分成不同表且表结构发生改变。

二.分区表优点

2.1、使用多个文件分布数据到多个硬盘中,可以极大地提高IO性能,提升查询速度。

2.2、当一个分区出了问题,不会影响其他分区,仅仅是当前坏的分区不可用,提高了稳定性。

2.3、把一个大表分成若干个小表,则备份和恢复的时候不再需要备份整个表,可以单独备份分区,便于管理。

2.4、将一些不太常用的数据单独存档。

三.分区表使用场景

3.1、数据库中某个表的数据量很大,在查询数据时会明显感觉到速度很慢,这种情况可以考虑分区表。

3.2、数据是分段的,如以年份为分隔的数据,对于当前的数据经常进行增删改查操作,而对于往年的数据几乎不做操作或只做查询操作,这种情况可以考虑分区表。

3.3、对数据的操作如果只涉及一部分数据而非全部数据,这种情况可以考虑分区表。

3.4、如果一张表的数据经常进行增删改查操作,而不管年份之类的因素,这种情况最好不要考虑分区表。

四.创建分区表步骤

4.1、创建数据库文件组
4.2、创建数据库文件

注:应将文件组和文件存放于不同的硬盘甚至不同的服务器中,因为数据的读取瓶颈很大程度在于硬盘的读写速度,多个硬盘存储一个表可以实现负载均衡。

4.3、创建分区函数

即声明分区的标准

4.4、创建分区方案

即哪些区域使用哪个分区函数,形成完整的分区方案。

4.5、创建分区表

五.创建分区表实战演练

数据库:MingDataBaseOld 表:DtbUserLoginLog 分区规则:按照该表的时间划分,按天进行分区,设置5个边界值,对应5个分区。

5.1、数据库点击"右键"->"属性"。

5.2、点击"文件组"->"添加文件组"->分别建立FG20200706、FG20200707、FG20200708、FG20200707、FG20200710等5个文件组->"确定"。

 

 

5.3、点击"文件"->"添加"->分别建立FL20200706、FL20200707、FL20200708、FL20200709、FL20200710等5个文件->选择对应的文件组及存放路径->"确定"。

 

 

5.4、选中DtbUserLoginLog表,点击"右键"->"存储"->"创建分区"->"下一步"。

5.5、选中需要分区的列名。然后点击“下一步”。

5.6、输入分区函数名"DtbUserLoginLog_AddTime"->点击"下一步"。

 

 

5.7、输入分区方案名"DtbUserLoginLog_AddTime"->点击"下一步"。

 

 

5.8、映射分区范围选择"左边界"->点击"设置边界"->开始日期:"2020/07/06"、结束日期:"2020/07/10"、日期范围:"每天"->点击"确定"。

 

 

5.9、依边界值选择相对应的文件组->点击"预计存储空间"可查看行计数及空间信息->点击"下一步"。

 

 

5.10、选择"立即运行"->点击"下一步"->点击"完成"。

 

 

 

 

 

 

 

六.分区表检查

6.1、检查分区函数与分区方案

 

 

6.2、检查分区文件

 

 

七.分区表查询

7.1、查看分区及行计数
 1 SELECT CONVERT(VARCHAR(50),A.NAME) Partition_Scheme,D.Partition_Number,CONVERT(VARCHAR(10),E.NAME) FileGroup,
 2        CONVERT(VARCHAR(19),ISNULL(G.VALUE,''),120) Range_Boundary,STR(D.ROWS,9) Rows
 3 FROM SYS.PARTITION_SCHEMES A INNER JOIN SYS.DESTINATION_DATA_SPACES B ON A.DATA_SPACE_ID=B.PARTITION_SCHEME_ID
 4     INNER JOIN SYS.INDEXES C ON A.DATA_SPACE_ID=C.DATA_SPACE_ID
 5     INNER JOIN SYS.PARTITIONS D ON B.DESTINATION_ID=D.PARTITION_NUMBER AND C.OBJECT_ID=D.OBJECT_ID AND C.INDEX_ID=D.INDEX_ID
 6     INNER JOIN SYS.DATA_SPACES E ON B.DATA_SPACE_ID=E.DATA_SPACE_ID
 7     INNER JOIN SYS.PARTITION_FUNCTIONS F ON A.FUNCTION_ID=F.FUNCTION_ID
 8     LEFT JOIN SYS.PARTITION_RANGE_VALUES G ON F.FUNCTION_ID=G.FUNCTION_ID AND D.PARTITION_NUMBER-F.BOUNDARY_VALUE_ON_RIGHT=G.BOUNDARY_ID
 9 WHERE C.OBJECT_ID=OBJECT_ID('DtbUserLoginLog')    --分区表名
10     AND C.INDEX_ID IN (0,1)
11 ORDER BY Partition_Scheme,D.Partition_Number

 

 

 

7.2、查看文件及文件组
1 SELECT A.[NAME],A.PHYSICAL_NAME,A.[SIZE],A.GROWTH,B.[NAME] [FILEGROUP],B.IS_DEFAULT
2 FROM SYS.DATABASE_FILES A INNER JOIN SYS.FILEGROUPS B ON A.DATA_SPACE_ID=B.DATA_SPACE_ID

 

 

 

posted @ 2022-12-25 21:44  相遇就是有缘  阅读(192)  评论(0)    收藏  举报