MS SQLServer 2005 分区表的使用(表分区)
一直以来,都以数据表单表记录数作为标尺,凡是大于100W的则使用Oracle等数据库,小于100W的才考虑使用Microsoft SQLServer.
在SQLServer2000的时候为了能够适应100W以上的数据量,很多设计者选择了手动分区表,创建大量表结构相同的表,来存放相同的记录.
用视图和触发器来模拟出Oracle中的表分区,是一种伪分区.
在SQLServer2005中,分区表出现了,只须三步就能够将数据表实现分区,从而提高单表的操作效率:
1. 创建分区函数
2. 创建分区架构
3. 对表进行分区
下面详细介绍下: 友情提示(对于那些只想快速浏览内容的朋友,只须关注蓝色字体的内容即可)
步骤一:创建一个分区函数
使用 CREATE PARTITION FUNCTION 是创建已分区表或索引的第一步,
语法
CREATE PARTITION FUNCTION partition_function_name ( input_parameter_type ) AS RANGE [ LEFT | RIGHT ] FOR VALUES ( [ boundary_value [ ,...n ] ] ) [ ; ] |
-
是分区函数的名称。分区函数名称在数据库内必须唯一,并且符合标识符的规则。
partition_function_name
-
是用于分区的列的数据类型。当用作分区列时,除 text、ntext、image、xml、timestamp、varchar(max)、nvarchar(max)、varbinary(max)、别名数据类型或 CLR 用户定义数据类型外,所有数据类型均有效。
实际列(也称为分区列)是在 CREATE TABLE 或 CREATE INDEX 语句中指定的。
input_parameter_type
-
为使用 partition_function_name 的已分区表或索引的每个分区指定边界值。如果 boundary_value 为空,则分区函数使用 partition_function_name 将整个表或索引映射到单个分区。只能使用 CREATE TABLE 或 CREATE INDEX 语句中指定的一个分区列。
boundary_value 是可以引用变量的常量表达式。这包括用户定义类型变量,或函数以及用户定义函数。它不能引用 Transact-SQL 表达式。boundary_value 必须与 input_parameter_type 中提供的数据类型相匹配或者可隐式转换为该数据类型,并且如果该值的大小和小数位数与 input_parameter_type 中相应的值的大小和小数位数不匹配,则在隐式转换过程中该值不能被截断。
boundary_value
-
指定 boundary_value 提供的值的数目,不能超过 999。所创建的分区数等于 n + 1。不必按顺序列出各值。如果值未按顺序列出,则 Microsoft SQL Server 2005 Database Engine 将对它们进行排序,创建函数并返回一个警告,说明未按顺序提供值。如果 n 包括任何重复的值,则数据库引擎将返回错误。
...n
-
指定当间隔值由 数据库引擎 按升序从左到右排序时,boundary_value [ ,...n ] 属于每个边界值间隔的哪一侧(左侧还是右侧)。如果未指定,则默认值为 LEFT。有关详细信息,请参阅示例。
LEFT | RIGHT
举例:
CREATE PARTITION FUNCTION customer_partfunc(int)
AS RANGE RIGHT FOR VALUES(250000,500000,750000)
图表:
分区 | 1 | 2 | 3 | 4 |
---|---|---|---|---|
Values | col1 <= | col1 > 250000 AND col1 <= | col1 > | col1 > |
只要使用customer_partfunc分区函数,就可以按照上图对数据表进行分区
步骤二:创建一个分区架构
在当前数据库中创建一个将已分区表或已分区索引的分区映射到文件组的方案。使用CREATE PARTITION SCHEME创建分区架构是创建已分区表或索引的第二步.
语法
CREATE PARTITION SCHEME partition_scheme_name AS PARTITION partition_function_name [ ALL ] TO ( { file_group_name | [ PRIMARY ] } [ ,...n ] ) [ ; ] |
-
分区方案的名称。分区方案名称在数据库中必须是唯一的,并且符合标识符规则。
partition_scheme_name
-
使用分区方案的分区函数的名称。分区函数所创建的分区将映射到在分区方案中指定的文件组。partition_function_name 必须已经存在于数据库中。
partition_function_name
-
指定所有分区都映射到在 file_group_name 中提供的文件组,或映射到主文件组(如果指定了 [PRIMARY]。如果指定了 ALL,则只能指定一个 file_group_name。
ALL
-
指定用来持有由 partition_function_name 指定的分区的文件组的名称。file_group_name 必须已经存在于数据库中。
如果指定了 [PRIMARY],则分区将存储于主文件组中。如果指定了 ALL,则只能指定一个 file_group_name。分区分配到文件组的顺序是从分区 1 开始,按文件组在 [,...n] 中列出的顺序进行分配。在 [,...n] 中,可以多次指定同一个 file_group_name。如果 n 不足以拥有在 partition_function_name 中指定的分区数,则 CREATE PARTITION SCHEME 将失败,并返回错误。
如果 partition_function_name 生成的分区数少于文件组数,则第一个未分配的文件组将标记为 NEXT USED,并且出现显示命名 NEXT USED 文件组的信息。如果指定了 ALL,则单独的 file_group_name 将为该 partition_function_name 保持它的 NEXT USED 属性。如果在 ALTER PARTITION FUNCTION 语句中创建了一个分区,则 NEXT USED 文件组将再接收一个分区。若要再创建一个未分配的文件组来拥有新的分区,请使用 ALTER PARTITION SCHEME。
在 file_group_name[ 1,...n] 中指定主文件组时,必须像在 [PRIMARY] 中那样分隔 PRIMARY,因为它是关键字。
file_group_name | [ PRIMARY ] [ ,...n]
举例:
CREATE PARTITION SCHEME customer_partscheme
AS PARTITION customer_partfunc
TO(fg1,fg2,fg3,fg4)
图表:
文件组 |
|
|
|
|
分区 | 1 | 2 | 3 | 4 |
Values | col1 <= 250000 | col1 > 250000 AND col1 <= 500000 | col1 > | col1 > |
步骤三:对一个表进行分区
定义好一个分区架构后,就可以着手创建一个分区表了。这是整个分区操作过程中最简单的一个步骤。只需要在表创建指令中添加一个"ON"语句,用来指定分区架构以及应用该架构的表列。因为分区架构已经识别了分区函数,所以不需要再指定分区函数了。
CREATE TABLE customers
(
FirstName nvarchar(40),
LastName nvarchar(40),
CustomerNumber int
)
ON customer_partscheme(CustomerNumber)
对于第二部中的fg1 fg2 fg3 fg4可能有些人不明白,那些是数据库的文件组.
下面再举例说下文件组:
USE master
CREATE DATABASE Sales ON PRIMARY
(
NAME = 'Sales_Data',
FILENAME='C:/Databases/Sales_dat.mdf',
SIZE=3MB,
MAXSIZE=10000MB,
FILEGROWTH=10%
),
FILEGROUP FG1
(
NAME = 'File1',
FILENAME = 'D:/Databases/File1_dat.ndf',
SIZE = 1MB,
MAXSIZE = 10000MB,
FILEGROWTH = 10%
),
FILEGROUP FG2
(
NAME = 'File2',
FILENAME = 'E:/Databases/File2_dat.ndf',
SIZE = 1MB,
MAXSIZE = 10000MB,
FILEGROWTH = 10%
),
FILEGROUP FG3
(
NAME = 'File3',
FILENAME = 'F:/Databases/File3_dat.ndf',
SIZE = 1MB,
MAXSIZE = 10000MB,
FILEGROWTH = 10%
) ,
FILEGROUP FG4
(
NAME = 'File4',
FILENAME = 'G:/Databases/File4_dat.ndf',
SIZE = 1MB,
MAXSIZE = 10000MB,
FILEGROWTH = 10%
)
LOG ON
(
NAME = 'Sales_Log',
FILENAME = 'C:/Databases/Sales_Log.ldf',
SIZE = 1MB,
MAXSIZE = 10MB,
FILEGROWTH = 10%
)
上面这个T-sql语句创建了一个数据库,并且这个数据拥有4个附加文件组.这四个文件组分部在不同的物理硬盘分区上.
可以设想下,C盘D盘E盘F盘和G盘如果是单独的rad5硬盘塔,这就是5个分区*3块硬盘,15块硬盘的处理速度,而且服务器硬盘式1.5W转的,处理千万行这样的大行级数据库就没有什么问题了.
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
· 面试官:你是如何进行SQL调优的?