SQL SERVER 表分区技术

当一个数据库表的数据达到千万级别的时候,这时候磁盘的I/O就成了性能的瓶颈,因此如果能提高磁盘的I/O能力,也就相应的提高了数据库的效率。SQL Server推出了表分区技术。

表分区就是把一个数据库表文件拆分成多个文件,并放到不同的文件组甚至是不同的磁盘中,但是在外界访问时看到的还是一个数据库表,这样不同的磁盘不同的文件组可以提高并发访问效率,而对于开发技术人员来说面对还只是那一张表,和单表没有区别。

表分区带来的优点:

1、提高I/O效率,插入、查询的效率都大大的得到提升,提高性能,这也是主要的优点

2、提高容灾能力,当一个分区数据出现问题时,不会影响其他分区内容。

3、备份管理更方便,可以单独对分区文件进行备份。

表分区的实现也比较简单,主要分为三点:

1、创建分区函数。

2、创建分区架构。

3、创建分区表。

第一步,创建分区函数:

CREATE PARTITION FUNCTION [fnPartition](INT) AS RANGE LEFT FOR VALUES (1, 2)

[fnPartition]是方法名,后边是分区依据列的类型,然后有一个RANGE这里可以写left和right,这个值代表临界值归属那边,VALUES就是分区的临界值。例子中写的left,那么如果插入的数据中,分区依据列的值为1或者小于1的,那么就归属到第一个数据文件中,值为2的归属到第二个文件中,大于2的就属于第三个数据文件。这里的1、2可以是任何数据,时间也可以,自己规定好即可。

第二步,创建分区架构:

在创建分区架构之前我们要先创建分区的各个数据文件。创建方法如下:

ALTER DATABASE Test ADD FILEGROUP fg1

然后我们再把数据文件放到文件组中:

ALTER DATABASE Test ADD FILE 
(NAME=N'fg1',FILENAME=N'F:\Test\fg1.ndf',SIZE=5MB,FILEGROWTH=5MB)
TO FILEGROUP fg1

我们建立三个文件和文件组,这里不再重复上述代码,下面就要开始创建分区架构了:

CREATE PARTITION SCHEME [SchemaForParirion] AS PARTITION [fnPartition] TO ([fg1], [fg2], [fg3])

[SchemaForParirion]是架构名称,[fnPartition]是我们前边创建的分区函数,fg1、2、3是分区存储的三个数据文件。

第三步,创建分区表:

CREATE TABLE [dbo].[TestTable](
	[Id] [INT] IDENTITY(1,1) NOT NULL,
	[ProvinceId] [INT] NOT NULL,
	[Data] [NVARCHAR](50) NULL
)ON SchemaForParirion(ProvinceId)

新建数据库表,我们都会,但是这里需要注意,要添加一个指定该表为分区表的操作,ON SchemaForParirion(ProvinceId),这个SchemaForParirion是我们刚刚定义的分区架构,参数为分区列。

这里还有一点需要注意:如果在表中创建主键或唯一索引,则分区依据列必须为该列所以我们如果不是用主键或者索引来进行分区的话,在建表的时候就要主意不要给表设置主键或索引。当然索引能够提高查询效率,具体情况还需要具体考虑。

还有几个方法需要记录一下:

1、查看分区依据列的指定值所在的分区,例如,查询省Id是2的存储在第几个分区,语句如下:

SELECT  $partition.fnPartition(2)

结果为:2.就是说省Id为2的数据在存储的时候是存储到了第二个数据库文件中。

2、查看分区表中,每个非空分区存在的行数:

SELECT  $partition.fnPartition(ProvinceId) AS Num ,
        COUNT(*) AS recordCount
FROM    TestTable
GROUP BY $partition.fnPartition(ProvinceId)

结果显示三个ProvinceId各个数据库文件的数据量,都是1千万。

3、查看指定分区中的数据记录,查询省Id为1的数据

SELECT  *
FROM    TestTable
WHERE   $partition.fnPartition(ProvinceId) = 1

好了下边该看表区的成果了。TestTable表进行了分区处理,数据按照省Id(ProvinceId)等于1、2、3分别存储到了三个文件里面,每个文件里1千万数据,一共3千万。这里直接写插入语句就行,SQL Server会自己判断存储文件是哪个。TestTable_1表的结构和TestTable一样,没有做分区处理,存储了3千万的数据,省Id都是123。接下来我们看一下查询结果对比,结果只做参考,查询语句如下:

SELECT TOP 10000 * FROM dbo.TestTable where ProvinceId = 1 AND Id>0
SELECT TOP 10000 * FROM dbo.TestTable where ProvinceId = 2 AND Id>10000000
SELECT TOP 10000 * FROM dbo.TestTable where ProvinceId = 3 AND Id>20000000

TestTable_1表中读取数据的语句如下

SELECT TOP 10000 * FROM dbo.TestTable_1 WHERE ProvinceId = 123 AND Id>0
SELECT TOP 10000 * FROM dbo.TestTable_1 WHERE ProvinceId = 123 AND Id>10000000
SELECT TOP 10000 * FROM dbo.TestTable_1 WHERE ProvinceId = 123 AND Id>20000000

虽然语句的对比性不是很强烈,但是我们可以看到,分区表的读取速度确实是比普通表的要快。所以对于单表大数据的问题,我们可以尝试着使用这种方式来处理。


猜你喜欢

转载自blog.csdn.net/sinat_28984567/article/details/79840051