SQL server 如何创建分区表

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lanxingbudui/article/details/84792123

一、分区表的定义:

        一般情况下,我们建立数据库表时,表数据都存放在一个文件里。但是如果是分区表的话,表数据就会按照你指定的规则分放到不同的文件里,把一个大的数据文件拆分为多个小文件,还可以把这些小文件放在不同的磁盘下由多个cpu进行处理。这样文件的大小随着拆分而减小,还得到硬件系统的加强,自然对我们操作数据是大大有利的。所以大数据量的数据表,对分区的需要还是必要的,因为它可以提高select效率,还可以对历史数据强行区分存档,对于多渠道导入数据时不容易锁表。

二、创建分区表的步骤:

  • 1、创建数据库文件组
  • 2、创建数据库文件
  • 3、创建分区函数
  • 4、创建分区方案
  • 5、创建分区表

三、举例说明:

还是拿出实际的例子来说明如何创建分区表吧。小公主,走起!

3.1、先创建一个新的数据库mysqlDB,创建数据库文件组和文件,添加文件组。

3.2 创建数据文件,并为数据文件分配文件组。

完成创建后的数据库文件信息

创建数据库文件组和文件,添加文件组,并为数据文件分配文件组--SQL脚本如下:

alter database mysqlDB add filegroup server2015
alter database mysqlDB add filegroup server2016
alter database mysqlDB add filegroup server2017
alter database mysqlDB add filegroup server2018
alter database mysqlDB add filegroup server2019
ALTER DATABASE [mysqlDB] ADD FILE(NAME=N'mysqlDB_2015',FILENAME=N'D:\DATEBASE\mysqlDB_2015.ndf',SIZE=3MB, MAXSIZE=UNLIMITED,FILEGROWTH=5MB)
TO FILEGROUP SERVER2015 --文件组
ALTER DATABASE [mysqlDB] ADD FILE(NAME=N'mysqlDB_2016',FILENAME=N'D:\DATEBASE\mysqlDB_2016.ndf',SIZE=3MB, MAXSIZE=UNLIMITED,FILEGROWTH=5MB)
TO FILEGROUP SERVER2016
ALTER DATABASE [mysqlDB] ADD FILE(NAME=N'mysqlDB_2017',FILENAME=N'D:\DATEBASE\mysqlDB_2017.ndf',SIZE=3MB, MAXSIZE=UNLIMITED,FILEGROWTH=5MB)
TO FILEGROUP SERVER2017
ALTER DATABASE [mysqlDB] ADD FILE(NAME=N'mysqlDB_2018',FILENAME=N'D:\DATEBASE\mysqlDB_2018.ndf',SIZE=3MB, MAXSIZE=UNLIMITED,FILEGROWTH=5MB)
TO FILEGROUP SERVER2018
ALTER DATABASE [mysqlDB] ADD FILE(NAME=N'mysqlDB_2019',FILENAME=N'D:\DATEBASE\mysqlDB_2019.ndf',SIZE=3MB, MAXSIZE=UNLIMITED,FILEGROWTH=5MB)
TO FILEGROUP SERVER2019

查看数据库文件组SQL语句:

select *  from sys.filegroups

3.3 创建分区函数

创建分区函数Transact-SQL语法:

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 用户定义数据类型外,所有数据类型均有效。
  boundary_value:为使用 partition_function_name 的已分区表或索引的每个分区指定边界值。 如果 boundary_value 为空,则分区函数使 partition_function_name 将整个表或索引映射到单个分区。 只能使用 CREATE TABLE 或 CREATE INDEX 语句中指定的一个分区列。
  LEFT | RIGHT 指定当间隔值由 数据库引擎 按升序从左到右排序时,boundary_value [ ,...n ] 属于每个边界值间隔的哪一侧(左侧还是右侧)。 如果未指定,则默认值为 LEFT。

实例示范:

CREATE PARTITION FUNCTION PARTITION_FUNCTION_mysqlDB_date( DATETIME )
AS RANGE RIGHT
FOR VALUES( '2016-01-01','2017-01-01', '2018-01-01', '2019-01-01')

SELECT * FROM sys.partition_functions

完成创建分区函数之后,可以通过以下SQL语句查看已创建的分区函数情况:

SELECT * FROM sys.partition_functions

3.4 创建分区方案

       分区方案的作用是将分区函数生成的分区映射到文件组中去,分区方案是让SQL Server将已分区的数据放在哪个文件组中。
  在当前数据库中创建一个将已分区表或已分区索引的分区映射到文件组的方案。 已分区表或已分区索引的分区的个数和域在分区函数中确定。 必须首先在 CREATE PARTITION FUNCTION 语句中创建分区函数,然后才能创建分区方案。

       创建分区方案的Transact-SQL语法:

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 必须已经存在于数据库中。 单个分区不能同时包含 FILESTREAM 和非 FILESTREAM 文件组。
  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 PARTITION_SCHEME_mysqlDB_date
AS PARTITION PARTITION_FUNCTION_mysqlDB_date
TO (SERVER2015, SERVER2016, SERVER2017, SERVER2018, SERVER2019 )

SELECT * FROM sys.partition_schemes

分区函数和分区方案创建之后,可以在数据库的【存储】中查看:

通过可以通过以下SQL语句查看已创建的分区方案:

SELECT * FROM sys.partition_schemes

3.5 创建分区表(test_table)

CREATE TABLE [test_table]
(
statdate DATETIME NOT NULL,
tableid int not null,
table_name varchar(20) null,
) ON PARTITION_SCHEME_mysqlDB_date ( statdate )

完成test_table表创建之后,查看表的属性,可以看到test_table表已经是分区表。

四、验证分区表是否可行:

向测试表test_table插入数据,查看分区效果。

INSERT INTO [dbo].[test_table] (statdate,tableid ,table_name) VALUES ('2015-10-10','6','test6');
INSERT INTO [dbo].[test_table] (statdate,tableid ,table_name) VALUES ('2016-12-31','2','test2');
INSERT INTO [dbo].[test_table] (statdate,tableid ,table_name) VALUES ('2017-01-20','3','test3');
INSERT INTO [dbo].[test_table] (statdate,tableid ,table_name) VALUES ('2018-10-20','4','test4');
INSERT INTO [dbo].[test_table] (statdate,tableid ,table_name) VALUES ('2019-10-20','5','test5');
SELECT $PARTITION.PARTITION_FUNCTION_mysqlDB_date(statdate) AS 分区编号, COUNT(1) AS 记录数 
FROM [test_table]
GROUP BY $PARTITION.PARTITION_FUNCTION_mysqlDB_date(statdate)

猜你喜欢

转载自blog.csdn.net/lanxingbudui/article/details/84792123