什么是表分区?
表分区其实就是将一个大表分成若干个小表。
表分区可以从物理上将一个大表分成几个小表,但是逻辑上还是一个表。所以当执行插入、更新等操作的时候,不需要我们去判断应该插入或更新到哪个表中。只需要插入大表中就可以了。SQL Server会自动的将它放在对应的表中。对于查询也是一样,直接查询大表就可以了。

如何创建分区表

一、创建文件组

其实可以使用默认的primary组,但是为了更方便管理以及提高运行速度,所以还是应该创建几个分组。

1、使用SSMS创建文件组

2、使用T-SQL创建文件组

  1. --alter database <数据库名> add filegroup <文件组名>
  2. alter database webDB add filegroup group2013
  3. alter database webDB add filegroup group2014
  4. alter database webDB add filegroup group2015

二、为文件组添加数据库文件

1、使用SSMS添加数据库文件

2、使用T-SQL添加数据库文件

  1. --alter database <数据库名称> add file <数据标识> to filegroup <文件组名称>
  2. alter database webDB add file
  3. (
  4. name='web2013',
  5. filename='D:\web2013.ndf',
  6. size=5mb,
  7. filegrowth=5mb
  8. )
  9. to filegroup group2013
  10. alter database webDB add file
  11. (
  12. name='web2014',
  13. filename='D:\web2014.ndf',
  14. size=5mb,
  15. filegrowth=5mb
  16. )
  17. to filegroup group2014
  18.  
  19. alter database webDB add file
  20. (
  21. name='web2015',
  22. filename='D:\web2015.ndf',
  23. size=5mb,
  24. filegrowth=5mb
  25. )
  26. to filegroup group2015

注意:尽可能的将不同的文件放在不同的硬盘分区里,或者独立硬盘中。这样可以加快SQL Server运行速度。

三、创建分区函数

分区函数用来告诉SQL Server用什么样的规则进行分区,这一步必须使用T-SQL脚本来执行了。

  1. create partition function fenqu(datetime) --分区函数名
  2. as range right --right分区方式 边界值去左表还是右表
  3. for values ('2014-01-01','2015-01-01') --按这些值来分区
  4. --group2013 : 2014-01-01 之前的
  5. --group2014 : 2014-01-01 2014-12-31
  6. --group2015 : 2015-01-01 之后的

四、创建分区方案

  1. create partition scheme SchemeFenqu --分区方案名
  2. as partition fenqu --之前创建的分区函数
  3. to(group2013,group2014,group2015) --跟放的文件组

创建完分区函数和分区方案后可以在存储中查看

五、创建分区表

  1. create table fenquTable
  2. (
  3. id int identity(1,1) not null,
  4. name varchar(20) not null,
  5. createTime datetime not null
  6. ) on SchemeFenqu(createTime) --调用分区方案

注意:不可以使用聚集索引,因为聚集索引是存在连续的物理地址中的,而表分区是将数据分别存储在不同表中的。

至此物理上分离的,逻辑上一体的分区表就创建完了。

操作分区表

一、插入数据

  1. --插入测试数据
  2. insert into fenquTable(name,createTime) values ('隔壁老王','2010-01-01')
  3. insert into fenquTable(name,createTime) values ('隔壁老张','2011-01-01')
  4. insert into fenquTable(name,createTime) values ('隔壁老赵','2012-01-01')
  5. insert into fenquTable(name,createTime) values ('隔壁老李','2013-01-01')
  6. insert into fenquTable(name,createTime) values ('老李儿子','2013-10-01')
  7. insert into fenquTable(name,createTime) values ('隔壁老田','2014-01-01')
  8. insert into fenquTable(name,createTime) values ('隔壁老梁','2015-01-01')
  9. insert into fenquTable(name,createTime) values ('老梁姑娘楠楠','2015-10-10')

跟插入普通表没有任何区别,不用管他放在哪个物理磁盘上。

二、查询数据

  1. --查询数据
  2. select * from fenquTable

查询也是如此,不用考虑哪个磁盘,逻辑上都属于同一个表,基本上看不出区别。如果需要查看哪条插入到哪个物理的分区表中,可以使用$partition函数查看。

  1. --语法:$partition.分区函数名(表达式)
  2. --查看该表达式下有多少数据
  3. select $partition.fenqu('2015-01-01') --返回3
  4.  
  5. --查看分区表明细
  6. select * from fenquTable where $partition.fenqu(createTime)=1
  7. select * from fenquTable where $partition.fenqu(createTime)=2
  8. select * from fenquTable where $partition.fenqu(createTime)=3
  9.  
  10. --查看分区表中的记录数
  11. select $partition.fenqu(createTime) as 分区 ,count(id) from fenquTable
  12. group by $partition.fenqu(createTime)

三、修改数据

  1. select $partition.fenqu(createTime) as 分区,count(id) as 数量 from fenquTable
  2. group by $partition.fenqu(createTime)
  3. --分区 数量
  4. --1 5
  5. --2 1
  6. --3 2
  7.  
  8. update fenquTable set createTime ='2015-01-01' where id = 1
  9.  
  10. select $partition.fenqu(createTime) as 分区,count(id) as 数量 from fenquTable
  11. group by $partition.fenqu(createTime)
  12. --分区 数量
  13. --1 4
  14. --2 1
  15. --3 3

可以明显看到,跟普通修改没有区别,SQL Server可以自动帮我们重新划分分区,将数据从第一个分区移动到第五个分区中。

普通表转分区表

上面介绍了如何在创建表的时候进行分区,但往往我们需要的是将现有的普通表在数据保留的情况下进行分区。

普通表一般都有主键,同时还是聚集索引。分区是以某个字段为条件进行的,而除了这个字段其他字段是不可以创建聚集索引的。所以需要先删除表中的聚集索引,再新建一个聚集索引。

  1. --删除主键,自动同时删除索引
  2. alter table newTable drop constraint PK_newTable
  3.  
  4. --创建主键,但不创建聚集索引
  5. alter table newTable add constraint PK_newTable
  6. primary key nonclustered --非聚集
  7. (
  8. id asc
  9. ) on [primary]
  10.  
  11. --然后给我们亲爱的时间创建一个聚集索引
  12. create clustered index CT_newTable on newTable(createTime)
  13. on schemeFenqu(createTime) --并调用分区方案
  14.  
  15. --然后再查询分区,发现数据保留情况下,已经将数据按规则进行分区了
  16. select $partition.fenqu(createTime) as 分区,count(id) as 数量
  17. from newTable group by $partition.fenqu(createTime)

添加分区

向上面只分了3个区,而15年以后的都存在第三个分区中,到16年还是会存在这个分区中,这时候需要再新加一个16年的分区。

添加新的分区意味着要新建一个文件组和文件来存放这个分区表,然后在分区方案中用到这个文件组,最后再修改一下分区函数的规则即可。文件组和分区数量要保持一致。

  1. --创建文件组
  2. alter database webDB add filegroup group2016
  3.  
  4. --添加数据库文件
  5. alter database webDB add file
  6. (
  7. name='web2016',
  8. filename='D:\web2016.ndf',
  9. size=5mb,
  10. filegrowth=5mb
  11. )
  12. to filegroup group2016
  13.  
  14. --修改分区方案
  15. alter partition scheme SchemeFenqu
  16. next used group2016
  17.  
  18. --修改分区函数
  19. alter partition function fenqu()
  20. split range('2016-01-01')
  21.  
  22. --添加2016年数据
  23. insert into newTable (name,createTime) values ('16年小明','2016-03-05')
  24.  
  25. --查看分区及统计
  26. select $partition.fenqu(createTime) as 分区,count(id) as 数量
  27. from newTable group by $partition.fenqu(createTime)

删除分区

删除分区就是将分区函数中多余的边界值删除。

如:2013,2014,2015,2016 现在需要将13年和14年进行合并,删除13年的分区。

  1. --查看分区及统计
  2. select $partition.fenqu(createTime) as 分区,count(id) as 数量
  3. from newTable group by $partition.fenqu(createTime)
  4. --分区 数量
  5. --1 4
  6. --2 1
  7. --3 3
  8. --4 1
  9.  
  10. --删掉该边界值
  11. alter partition function fenqu() merge range('2014-01-01')
  12.  
  13. --再次查询
  14. select $partition.fenqu(createTime) as 分区,count(id) as 数量
  15. from newTable group by $partition.fenqu(createTime)
  16. --分区 数量
  17. --1 5
  18. --2 3
  19. --3 1

拆分分区

有的时候某一分区中数据量过大,需要将这个分区再次拆分为多个分区,以加快访问速度。

拆分分区的操作其实与添加分区类似,首先要添加文件组、文件、修改分区方案、修改分区函数(新增一个边界值)。

如:2014,2015,2015年6月份以上一个 6月份一下一个。

  1. --查看分区及统计
  2. select $partition.fenqu(createTime) as 分区,count(id) as 数量
  3. from newTable group by $partition.fenqu(createTime)
  4. --分区 数量
  5. --1 5
  6. --2 3
  7. --3 1
  8.  
  9. --创建文件组
  10. alter database webDB add filegroup group2014_2015
  11.  
  12. --添加数据库文件
  13. alter database webDB add file
  14. (
  15. name='web2014_2015',
  16. filename='D:\web2014_2015.ndf',
  17. size=5mb,
  18. filegrowth=5mb
  19. )
  20. to filegroup group2014_2015
  21.  
  22. --修改分区方案
  23. alter partition scheme SchemeFenqu
  24. next used group2014_2015
  25.  
  26. --修改分区函数
  27. alter partition function fenqu()
  28. split range('2015-06-01')
  29.  
  30. --查看分区及统计
  31. select $partition.fenqu(createTime) as 分区,count(id) as 数量
  32. from newTable group by $partition.fenqu(createTime)
  33. --分区 数量
  34. --1 5
  35. --2 2
  36. --3 1
  37. --4 1

分区表转普通表

  1. --修改分区函数 将边界值都删除
  2. alter partition function fenqu()
  3. merge range('2013-01-01')
  4. alter partition function fenqu()
  5. merge range('2014-01-01')
  6. alter partition function fenqu()
  7. merge range('2015-01-01')
  8. alter partition function fenqu()
  9. merge range('2015-06-01')
  10.  
  11. select $partition.fenqu(createTime) as 分区,count(id) as 数量
  12. from newTable group by $partition.fenqu(createTime)
  13. --这时只有一个分区了
  14. --分区 数量
  15. --1 9

这样虽然只有一个分区了,但是查看数据表存储位置,是否进行分区:True,分区数1.

  1. --重新建立聚集索引
  2. create clustered index CT_newTable on newTable(createTime)
  3. with(drop_existing=on) --如果存在则删除
  4. on [primary]

删除分区索引后,重新建立聚集索引,这时再此查看数据表的存储位置,是否分区:Flase。

8、SQL Server 表分区的更多相关文章

  1. SQL Server表分区的NULL值问题

    SQL Server表分区的NULL值问题 SQL Server表分区只支持range分区这一种类型,但是本人觉得已经够用了 虽然MySQL支持四种分区类型:RANGE分区.LIST分区.HASH分区 ...

  2. SQL Server表分区【转】

    转自:http://www.cnblogs.com/knowledgesea/p/3696912.html SQL Server表分区   什么是表分区 一般情况下,我们建立数据库表时,表数据都存放在 ...

  3. SQL Server表分区详解

    原文:SQL Server表分区详解 什么是表分区 一般情况下,我们建立数据库表时,表数据都存放在一个文件里. 但是如果是分区表的话,表数据就会按照你指定的规则分放到不同的文件里,把一个大的数据文件拆 ...

  4. SQL Server表分区-水平分区

    SQL Server表分区,sql server水平分区 转自:http://www.cnblogs.com/knowledgesea/p/3696912.html  根据时间的,直接上T-SQL代码 ...

  5. SQL Server 表分区备忘

    1.创建的代码如下: )) AS RANGE LEFT FOR VALUES ( N', N', N',... ) CREATE PARTITION SCHEME [01_SubjectiveScor ...

  6. SQL Server表分区案例

    --学习创建表分区脚本/*SQL SERVER 2005中以上版本,终于引入了表分区,就是说,当一个表里的数据很多时,可以将其分拆到多个的表里,大大提高了性能.下面举例子说明之*/ --------- ...

  7. sql server 表分区

    背景: 一般情况下,我们建立数据库表时,表数据都存放在一个文件里. 但是如果是分区表的话,表数据就会按照你指定的规则分放到不同的文件里,把一个大的数据文件拆分为多个小文件,还可以把这些小文件放在不同的 ...

  8. SQL Server表分区(水平分区及垂直分区)

    什么是表分区? 表分区分为水平表分区和垂直表分区,水平表分区就是将一个具有大量数据的表,进行拆分为具有相同表结构的若干个表:而垂直表分区就是把一个拥有多个字段的表,根据需要进行拆分列,然后根据某一个字 ...

  9. SQL Server 表分区之水平表分区

    什么是表分区? 表分区分为水平表分区和垂直表分区,水平表分区就是将一个具有大量数据的表,进行拆分为具有相同表结构的若干个表:而垂直表分区就是把一个拥有多个字段的表,根据需要进行拆分列,然后根据某一个字 ...

随机推荐

  1. unity, reduce android size

    参考: https://www.youtube.com/watch?v=TYSmf_zgtZo http://stackoverflow.com/questions/41087220/how-to-u ...

  2. C# Marshal.GetActiveObject() 遭遇 HRESULT:0x800401E3 (MK_E_UNAVAILABLE))

    解决办法: 勿以管理员权限运行Visual Studio

  3. c#线程之异步委托begininvoke、invoke、AsyncWaitHandle.WaitOne 、异步回调

    单靠自己看书学总是会走很多弯路,任何人也不列外,有些时候自己遇到的很多问题,其它别人在很久之前也可能遇到过,上网查查可以走很大捷径,对自己的学习有很大帮助,刚开始弄线程这块,一开始只是看书,很多东西都 ...

  4. javascript介绍

    1.javascript的简介 1.1javascript的特点 1.安全性(不允许方问本地硬盘),它可以做的是信息的动态交互. 2.跨平台.(只要是可以解释js的浏览器都可以执行,与平台无关) 1. ...

  5. 承接cardboard外包,unity3d外包(北京动软— 谷歌CARDBOARD真强大)

    手把手教你玩转googlecardboard[不知道在这里发可以不?] 谷歌Google I/O开发者大会于北京时间6月26日0点在美国旧金山举行,谷歌发布了Android L手机系统:Android ...

  6. pickle序列化

    通过pickle来序列化: # -*- coding: utf-8 -*- import pickle #-------------------序列化--------------------- zoo ...

  7. Debugging Maya Plugin(C++) with CodeBlocks in Linux

    My system is CentOS7 x64, Maya2015 x64 for Linux. - Make sure that your project is built with flag - ...

  8. PHP购物车类

    <?php /** * 购物车类 */ session_start(); class Cart{ private static $ins = null; private $items = arr ...

  9. opengl入门学习

    OpenGL入门学习 说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640 ...

  10. 51nod 1643 小Q的家庭作业

    题意: f(n) = sigma(gcd(i,n))  1 <= i <= n g(n) = sigma(f(d))    d | n n = x1 * x2 * ... * xm 其中 ...