zoukankan      html  css  js  c++  java
  • 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:Testfg1.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
    

      


    虽然语句的对比性不是很强烈,但是我们可以看到,分区表的读取速度确实是比普通表的要快。所以对于单表大数据的问题,我们可以尝试着使用这种方式来处理。
    ————————————————
    版权声明:本文为CSDN博主「二月十六」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/sinat_28984567/article/details/79840051

  • 相关阅读:
    img的srcset和sizes属性作用
    屏幕尺寸,分辨率,像素,PPI之间到底什么关系
    img 的 srcset、sizes 属性和 picture 元素
    收房细则
    购买雅居乐湖居笔记不得不知。
    Andoird Studio 错误: 非法字符: 'ufeff' 解决方案。
    解决mysql 1040错误Too many connections的方法
    Android布局优化之include、merge、ViewStub的使用
    美国人、英国人、中国人一生都是如何度过
    Android常用正则工具类
  • 原文地址:https://www.cnblogs.com/hesijian/p/12536759.html
Copyright © 2011-2022 走看看