SQL Server表分区降低运维和维护成本


Posted in SQL Server onApril 08, 2022

1.简介

当一个表数据量很大时候,很自然我们就会想到将表拆分成很多小表,在执行查询时候就到各个小表去查,最后汇总数据集返回给调用者加快查询速度。比如电商平台订单表,库存表,由于长年累月读写较多,积累数据都是异常庞大的,这时候,我们可以想到表分区这个做法,降低运维和维护成本,提高读写性能。比如将前半年订单放一个历史分区表,不活跃库存放一个历史分区表。截止到SQL Server 2016,一张表或一个索引最多可以有15000个分区。

2.表分区

2.1分区范围

分区范围是指在要分区的表中,根据业务选择表中的关键字段做为分区边界条件,分区后,数据所在的具体位置至关重要,这样才能在需要时只访问相应的分区。注意分区是指数据的逻辑分离,不是数据在磁盘上的物理位置,数据的位置由文件组来决定,所以一般建议一个分区对应一个文件组。

2.2分区键

分区表中的字段可以作为分区键,比如库存表中供应商ID。对表和索引进行分区的第一步就是定义分区的关键数据。

2.3索引分区

除了对表的数据集进行分区之外,还可以对索引进行分区,使用相同的函数对表及其索引进行分区通常可以优化性能。

3.创建表分区

3.1创建文件组

在这里演示示例当中,我根据业务场景在TestDB数据库新增三个文件组,而三个文件组分别对应三个分区。而多个文件组好处是可以按照不同业务场景将数据放在对应文件组当中,优化性能同时好维护数据。文件组数量由硬件决定,最好是一个文件组对应一个分区,好维护。而通常文件组都处于不同磁盘上的,但是由于是演示,我只在一个磁盘中存放。

--创建四个文件组
ALTER DATABASE [TestDB] ADD FILEGROUP SupIDGroup1
ALTER DATABASE [TestDB] ADD FILEGROUP SupIDGroup2
ALTER DATABASE [TestDB] ADD FILEGROUP SupIDGroup3

3.2指定文件组存放路径

在创建文件组之后,指定文件组存放磁盘位置,文件大小。

--创建四个ndf文件,对应到各文件组中,FILENAME文件存储路径
ALTER DATABASE [TestDB] ADD FILE(
NAME='SupIDGroupFile1',
FILENAME='D:\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\SupIDGroupFile1.ndf',
SIZE=10MB,
FILEGROWTH=10MB)
TO FILEGROUP SupIDGroup1

ALTER DATABASE [TestDB] ADD FILE(
NAME='SupIDGroupFile2',
FILENAME='D:\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\SupIDGroupFile2.ndf',
SIZE=10MB,
FILEGROWTH=10MB)
TO FILEGROUP SupIDGroup2

ALTER DATABASE [TestDB] ADD FILE(
NAME='SupIDGroupFile3',
FILENAME='D:\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\SupIDGroupFile3.ndf',
SIZE=10MB,
FILEGROWTH=10MB)
TO FILEGROUP SupIDGroup3

注(附上删除文件组T-SQL):

ALTER DATABASE [TestDB] REMOVE FILE SupIDGroupFile3

SQL Server表分区降低运维和维护成本
可以通过以下T-SQL语句查看文件组存放相关信息:

SELECT file_id,type,type_desc,data_space_id,name,physical_name,state_desc,size,growth
FROM sys.database_files

SQL Server表分区降低运维和维护成本

3.3创建分区函数

如何创建表分区边界值,我们肯定要根据业务场景来决定。比如我测试库库存表有36万左右数据,而有些供应商的库存数据远远比其他供应商大,那么我可以考虑使用供应商ID字段作为边界值分区。例如:根据T-SQL统计,18080供应商库存数据最大,那么我可以根据18080供应商上下分为三个区。
SQL Server表分区降低运维和维护成本
第一个分区范围记录:供应商ID小于等于13570的39097条库存数据。
SQL Server表分区降低运维和维护成本
第二个分区范围记录:供应商ID大于13570和小于等于18079的45962条库存数据。
SQL Server表分区降低运维和维护成本
第三个分区范围记录:供应商ID大于18079小于等于18080的164937条库存数据。
SQL Server表分区降低运维和维护成本
第四个分区范围记录:供应商ID大于18080的111116条库存数据。
SQL Server表分区降低运维和维护成本
根据上述分区范围记录,我们可以将供应商ID作为边界值设置,执行以下T-SQL语句设置边界值:

--设置边界值
CREATE PARTITION FUNCTION PF_SupplierID(int)
AS RANGE LEFT FOR VALUES (13570,18079,18080)

执行完毕后如图所示:

SQL Server表分区降低运维和维护成本

3.4创建分区方案

执行以下T-SQL语句创建分区方案:

--创建分区方案
CREATE PARTITION SCHEME PS_SupplierID
AS PARTITION PF_SupplierID TO ([PRIMARY], [SupIDGroup1],[SupIDGroup2],[SupIDGroup3])

执行完毕后如图所示:

SQL Server表分区降低运维和维护成本

3.5创建分区表

上面那些分区步骤都是为了接下来创建分区表这一步骤而准备的。废话不多说,现在我们来看看如何创建分区表。右键需要分区的表->储存->创建分区,具体步骤如下图所示:
SQL Server表分区降低运维和维护成本

SQL Server表分区降低运维和维护成本
SQL Server表分区降低运维和维护成本
SQL Server表分区降低运维和维护成本
SQL Server表分区降低运维和维护成本

SQL Server表分区降低运维和维护成本

3.6创建分区索引

--创建分区索引
CREATE NONCLUSTERED INDEX [NCI_SupplierID] ON dbo.Stock
(
    SupplierID ASC
)
INCLUDE ( [Model],[Brand],[Encapsulation]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
GO

或者
SQL Server表分区降低运维和维护成本
执行完毕后如图所示:

SQL Server表分区降低运维和维护成本
创建好索引之后,我们来看看分区情况:

--查看各分区有多少行数据
SELECT * FROM (
SELECT $PARTITION.PF_SupplierID([SupplierID]) AS Patition,COUNT(*) AS CountRows FROM dbo.Stock
GROUP BY $PARTITION.PF_SupplierID([SupplierID])
)TB ORDER BY Patition

SQL Server表分区降低运维和维护成本

最后我们来看看加了索引之后表数据查询情况:
SQL Server表分区降低运维和维护成本

4.表分区的优缺点

优点:
改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。
增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用。
维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可。
均衡I/O:可以把不同的分区映射到不同磁盘以平衡I/O,改善整个系统性能。
缺点:
分区表相关:已经存在的表没有方法可以直接转化为分区表。

SQL Server 相关文章推荐
2021-4-3课程——SQL Server查询【2】
Apr 05 SQL Server
Sql-Server数据库单表查询 4.3实验课
Apr 05 SQL Server
SQLServer 错误: 15404,无法获取有关 Windows NT 组/用户 WIN-8IVSNAQS8T7\Administrator 的信息
Jun 30 SQL Server
sql通过日期判断年龄函数的示例代码
Jul 16 SQL Server
SQL写法--行行比较
Aug 23 SQL Server
SQL中的三种去重方法小结
Nov 01 SQL Server
SQL Server实现分页方法介绍
Mar 16 SQL Server
sqlserver连接错误之SQL评估期已过的问题解决
Mar 23 SQL Server
SQL Server使用导出向导功能
Apr 08 SQL Server
SQL Server使用T-SQL语句批处理
May 20 SQL Server
SQL Server一个字符串拆分多行显示或者多行数据合并成一个字符串
May 25 SQL Server
SQL Server数据库备份和恢复数据库的全过程
Jun 14 SQL Server
SQL Server使用导出向导功能
SQL Server内存机制浅探
sqlserver连接错误之SQL评估期已过的问题解决
SQL Server远程连接的设置步骤(图文)
SQLServer RANK() 排名函数的使用
SQL CASE 表达式的具体使用
Mar 21 #SQL Server
SQL Server数据库基本概念、组成、常用对象与约束
Mar 20 #SQL Server
You might like
转PHP手册及PHP编程标准
2006/12/17 PHP
php生成不重复随机数、数组的4种方法分享
2015/03/30 PHP
PHP获取链表中倒数第K个节点的方法
2018/01/18 PHP
关于实现代码语法标亮 dp.SyntaxHighlighter
2007/02/02 Javascript
jquery 关键字“拖曳搜索”之“拖曳”以及 图片“提示自适应放大”效果 的实现
2010/04/18 Javascript
用XMLDOM和ADODB.Stream实现base64编码解码实现代码
2010/11/28 Javascript
jQuery中removeData()方法用法实例
2014/12/27 Javascript
学习JavaScript设计模式(代理模式)
2015/12/03 Javascript
一句jQuery代码实现返回顶部效果(简单实用)
2016/12/28 Javascript
bootstrap下拉菜单使用方法解析
2017/01/13 Javascript
一文了解vue-router之hash模式和history模式
2019/05/31 Javascript
小程序外卖订单界面的示例代码
2019/12/30 Javascript
JS常见内存泄漏及解决方案解析
2020/05/30 Javascript
解决微信授权成功后点击按返回键出现空白页和报错的问题
2020/06/08 Javascript
Javascript前端下载后台传来的文件流代码实例
2020/08/18 Javascript
vue实现前端列表多条件筛选
2020/10/26 Javascript
[02:10]三分钟回顾完美世界城市挑战赛
2019/01/24 DOTA
python 字符串转列表 list 出现\ufeff的解决方法
2017/06/22 Python
pycharm下打开、执行并调试scrapy爬虫程序的方法
2017/11/29 Python
python numpy数组的索引和切片的操作方法
2018/10/20 Python
python批量从es取数据的方法(文档数超过10000)
2018/12/27 Python
实例讲解Python3中abs()函数
2019/02/19 Python
python定时检测无响应进程并重启的实例代码
2019/04/22 Python
Python数据类型之Number数字操作实例详解
2019/05/08 Python
使用python 对验证码图片进行降噪处理
2019/12/18 Python
IE矩阵Matrix滤镜旋转与缩放及如何结合transform
2012/11/29 HTML / CSS
会议邀请函范文
2014/01/09 职场文书
毕业生自我鉴定实例
2014/01/21 职场文书
投标邀请书范文
2014/01/31 职场文书
学生逃课检讨书1000字
2014/10/20 职场文书
2015年公司工作总结
2015/04/25 职场文书
教师继续教育反思周记
2015/06/25 职场文书
给校长的建议书作文500字
2015/09/14 职场文书
2016年学校爱国卫生月活动总结
2016/04/06 职场文书
导游词之昭君岛
2020/01/17 职场文书
java如何实现获取客户端ip地址的示例代码
2022/04/07 Java/Android