首页 > 数据库 >MS SQLServer 2005 分区表的使用(表分区)

MS SQLServer 2005 分区表的使用(表分区)

时间:2022-12-05 12:07:53浏览次数:40  
标签:function name CREATE partition 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



是分区函数的名称。分区函数名称在数据库内必须唯一,并且符合标识符的规则。

input_parameter_type



是用于分区的列的数据类型。当用作分区列时,除 text、ntext、image、xml、timestamp、varchar(max)、nvarchar(max)、varbinary(max)、别名数据类型或 CLR 用户定义数据类型外,所有数据类型均有效。

实际列(也称为分区列)是在 CREATE TABLE 或 CREATE INDEX 语句中指定的。

boundary_value


为使用 partition_function_name 的已分区表或索引的每个分区指定边界值。如果 boundary_value 为空,则分区函数使用 partition_function_name 将整个表或索引映射到单个分区。只能使用 CREATE TABLE 或 CREATE INDEX 语句中指定的一个分区列。

boundary_value 是可以引用变量的常量表达式。这包括用户定义类型变量,或函数以及用户定义函数。它不能引用 Transact-SQL 表达式。boundary_value 必须与 input_parameter_type 中提供的数据类型相匹配或者可隐式转换为该数据类型,并且如果该值的大小和小数位数与 input_parameter_type 中相应的值的大小和小数位数不匹配,则在隐式转换过程中该值不能被截断。

...n



指定 boundary_value 提供的值的数目,不能超过 999。所创建的分区数等于 n + 1。不必按顺序列出各值。如果值未按顺序列出,则 Microsoft SQL Server 2005 Database Engine 将对它们进行排序,创建函数并返回一个警告,说明未按顺序提供值。如果 n 包括任何重复的值,则数据库引擎将返回错误。

LEFT | RIGHT



指定当间隔值由 数据库引擎 按升序从左到右排序时,boundary_value [ ,...n ] 属于每个边界值间隔的哪一侧(左侧还是右侧)。如果未指定,则默认值为 LEFT。有关详细信息,请参阅示例。

举例:

CREATE PARTITION FUNCTION customer_partfunc(int)
AS RANGE RIGHT FOR VALUES(250000,500000,750000)

图表:

分区

1

2

3

4

Values

col1 <= ​​250000​

col1 > 250000 AND col1 <= ​​500000​

col1 > ​​500000​​​且 col1 <= 750​​000​

col1 > ​​750000​

只要使用customer_partfunc分区函数,就可以按照上图对数据表进行分区

步骤二:创建一个分区架构

在当前数据库中创建一个将已分区表或已分区索引的分区映射到文件组的方案。使用CREATE PARTITION SCHEME创建分区架构是创建已分区表或索引的第二步.

语法


 

CREATE PARTITION SCHEME partition_scheme_nameAS PARTITION partition_function_name[ ALL ] TO ( { file_group_name | [ PRIMARY ] } [ ,...n ] )[ ; ]


partition_scheme_name



分区方案的名称。分区方案名称在数据库中必须是唯一的,并且符合标识符规则。

partition_function_name



使用分区方案的分区函数的名称。分区函数所创建的分区将映射到在分区方案中指定的文件组。partition_function_name 必须已经存在于数据库中。

ALL



指定所有分区都映射到在 file_group_name 中提供的文件组,或映射到主文件组(如果指定了 [PRIMARY]。如果指定了 ALL,则只能指定一个 file_group_name。

file_group_name | [ PRIMARY ] [ ,...n]



指定用来持有由 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,因为它是关键字。

举例:

CREATE PARTITION SCHEME customer_partscheme
  AS PARTITION customer_partfunc
  TO(fg1,fg2,fg3,fg4)

图表:


文件组

​fg1​

​fg2​

​fg3​

​fg4​

分区

1

2

3

4

Values

col1 <= 250000

col1 > 250000

col1 > ​​500000​​​ AND col1 <= ​​750000​

col1 > ​​750000​

步骤三:对一个表进行分区

  定义好一个分区架构后,就可以着手创建一个分区表了。这是整个分区操作过程中最简单的一个步骤。只需要在表创建指令中添加一个"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转的,处理千万行这样的大行级数据库就没有什么问题了.

标签:function,name,CREATE,partition,SQLServer,指定,分区表,2005,分区
From: https://blog.51cto.com/u_11295556/5911822

相关文章

  • .Net和SqlServer的事务处理实例
    1,SqlServer存储过程的事务处理一种比较通用的出错处理的模式大概如下:CreateprocdureprInsertProducts( @intProductIdint, @chvProductNamevarchar(30), @intPr......
  • SqlServer表分区
    你是否在千方百计优化SQLServer数据库的性能?如果你的数据库中含有大量的表格,把这些表格分区放入独立的文件组可能会让你受益匪浅。SQLServer2005引入的表分区技术,让用......
  • SQLSERVER 2005 表分区说明
    2005 分区表实际应用例子  定义,原理网上讲得多了.在这就不费口舌,记录下创建过程.  一. 最基本,最重要的一步就是创建分区函数.创建分区函数首先要确定分区键--既......
  • SQLServer 2005 海量数据解决方案(分区表)与对已存在的表进行分区
    这两天一直在研究2005中如何对表进行分区,但是参考了多数资料都是说新建表后再将原表中数据插入到新表中,这样有些不方便.  最后找到了在已有表上做分区表的方法.见......
  • SQL2005中设置自动编号字段
    如果希望重新定义在表中添加新记录时该列中自动生成并存储于列中的序列号,则可以更改该列的标识属性。在每个表中只能设置一个列的标识属性。具有标识属性的列包含系统生成的......
  • VC6.0和VS2005:C++和C#编写调用COM组件
    这篇文章就是关于COM组件的编写和调用的,主要包含了使用VC6.0编写和调用COM组件,VS2005中使用C#编写和调用COM组件,以及在VC6.0和VS2005之间互相调用COM组件。前一阵在......
  • 在sqlserver2008中收缩日志文件
    —先备份数据库(含日志文件)usemyhisgobackupdatabasemyhistodisk=’d:\myhis_rzbak’go—设为简单恢复模式use[master]goalterdatabasemyhissetr......
  • sql server 2005中对CLR的允许设置
    在sqlserver2005中,可以允许用vs.net2005来编写存储过程了,这比T-SQL有很大好处,但要注意的是,当要使用SQLSERVER2005这个功能时,在安全性方面会......
  • sqlserver 中len和DataLength的区别
    https://zhuanlan.zhihu.com/p/342051927LEN()函数返回文本字段中值的长度。DataLength()函数返回文本字段中值的字符长度。区别在于:len()只返回字符数,一个汉字代表一个......
  • MySQL和SQLserver中group by的区别
    https://blog.csdn.net/weixin_48720080/article/details/126289174力扣中做了一道题,groupby可以在mysql中用,不能在mysqlserver中用,因为groupby后面没有select中的字段......