原文:第十三章——表和索引分区(1)——使用Range Left进行表分区

前言:

如果数据表的数据持续增长,并且表中的数据量已经达到数十亿甚至更多,数据的查询和操作将非常困难,面对非常庞大的表,几时简单的增删改操作都会花费非常多的时间,如删除某个数据然后重建索引这些操作,会很难实现。在这种情况下,管理和维护查询性能就成为了一种挑战。

在过去的日子,也就是2005之前,你可能需要使用分区视图来处理大数据量的数据,从2005开始,微软引入了叫做表分区的新特性。允许水平分割数据成为多个分区。并且也允许把这些分区放到不同的文件组从然后放到不同的磁盘上。由于在访问的时候只需要访问部分的分区,从而减少了不必要的查询范围。

通过表分区,下面的操作将能很好地实现:

1、 查找一定范围的数据。

2、 删除和归档旧数据。

3、 加载大量数据。

4、 重建和重组索引。

同样可以把大表上的索引进行分区。在SQLServer2012中,最多能达到15000个分区,但是不能对text,ntext,image,xml,timestamp,varchar(max),nvarchar(max)或varbinary(max)数据列进行分区。

带有Range Left的表分区:

假设需要设计一个数据库,并且有一个表需要存放几百万数据,为了提高性能,你决定基于ID列来分区,一开始,暂定分4个区:

1、 ID大于等于0

2、 ID从1~1000000

3、 ID从1000001~2000000

4、 ID从2000001~3000000

但是,在这里,分区1将永远不会有任何数据,因为ID值是从1开始,并以1增长的。此时,需要有一个好的分区范围来达到数据要求。

表分区有两个配置选项去设定分区范围:RANGE LEFT 和RANGE RIGHT。本文中将演示使用RANGE LEFT来实现分区。

为了把表分区,有两个重要的对象需要创建:分区函数和分区架构。首先,使用分区函数定义范围值,然后使用分区架构定义物理存储位置。

本例中,将会演示如何创建一个分区函数和分区架构,并应用到分区表中。

准备工作:

本文需要一个示例数据库,创建在C:\SQLData上的Sample_DB,确保有这个路径。

步骤:

1、 打开SQLServer

2、 执行下面语句创建Sample_DB:

  1. USE master
  2. GO
  3. IF DB_ID('Sample_DB') IS NOT NULL
  4. DROP DATABASE [Sample_DB]
  5.  
  6. CREATE DATABASE [Sample_DB] ON PRIMARY
  7. (
  8. NAME =N'Sample_DB',FILENAME=N'C:\SQLData\Sample_DB.mdf',
  9. SIZE=3072KB,FILEGROWTH=1024KB
  10. ), FILEGROUP [FG_1]
  11. (
  12. NAME =N'FG_1_DataFile',FILENAME=N'C:\SQLData\FG_1_DataFile.ndf',
  13. SIZE=3072KB,FILEGROWTH=1024KB
  14. ), FILEGROUP [FG_2]
  15. (
  16. NAME =N'FG_2_DataFile',FILENAME=N'C:\SQLData\FG_2_DataFile.ndf',
  17. SIZE=3072KB,FILEGROWTH=1024KB
  18. ), FILEGROUP [FG_3]
  19. (
  20. NAME =N'FG_3_DataFile',FILENAME=N'C:\SQLData\FG_3_DataFile.ndf',
  21. SIZE=3072KB,FILEGROWTH=1024KB
  22. ), FILEGROUP [FG_N]
  23. (
  24. NAME =N'FG_N_DataFile',FILENAME=N'C:\SQLData\FG_N_DataFile.ndf',
  25. SIZE=3072KB,FILEGROWTH=1024KB
  26. ) LOG ON
  27. (
  28. NAME =N'Sample_DB_log',FILENAME=N'C:\SQLData\Sample_DB_log.ldf',
  29. SIZE=3072KB,FILEGROWTH=10%
  30. )
  31. GO

3、 创建一个带有RANGE LEFT的分区函数pf_OneMillion_LeftRange:

  1. USE Sample_DB
  2. GO
  3.  
  4. CREATE PARTITION FUNCTION pf_OneMillion_LeftRange(INT)
  5. AS RANGE LEFT FOR VALUES(0,1000000,2000000,3000000)
  6. GO

4、 验证分区函数:

  1. USE Sample_DB
  2. GO
  3. SELECT name ,
  4. function_id ,
  5. type ,
  6. type_desc ,
  7. fanout ,
  8. boundary_value_on_right ,
  9. create_date
  10. FROM sys.partition_functions
  11.  
  12. SELECT function_id ,
  13. boundary_id ,
  14. parameter_id ,
  15. value
  16. FROM sys.partition_range_values
  17. GO

5、 得到下面的结果:

6、 现在运行下面的脚本,创建并验证分区架构:

  1. USE Sample_DB
  2. GO
  3.  
  4. CREATE PARTITION SCHEME ps_OneMillion_LeftRange
  5. AS PARTITION pf_OneMillion_LeftRange
  6. TO ([primary],[FG_1],[FG_2],[FG_3],[FG_N])
  7.  
  8. SELECT name ,
  9. data_space_id ,
  10. type ,
  11. type_desc ,
  12. function_id
  13. FROM sys.partition_schemes
  14. GO

7、 下面是结果:

8、 现在创建一个表tbl_SampleRecords,并插入500万数据:

  1. USE Sample_DB
  2. GO
  3.  
  4. IF OBJECT_ID('tbl_SampleRecords') IS NOT NULL
  5. DROP TABLE tbl_SampleRecords
  6.  
  7. CREATE TABLE tbl_SampleRecords
  8. (
  9. id INT ,
  10. SomeDate SYSNAME ,
  11. CONSTRAINT pk_tbl_SampleRecords_id PRIMARY KEY CLUSTERED ( id )
  12. )
  13. ON ps_OneMillion_LeftRange(id)
  14. GO
  15.  
  16. INSERT INTO tbl_SampleRecords
  17. SELECT TOP 5000000
  18. id = ROW_NUMBER() OVER ( ORDER BY C1.name ) ,
  19. somedata = c1.NAME
  20. FROM sys.columns AS C1
  21. CROSS JOIN sys.columns AS C2
  22. CROSS JOIN sys.columns AS C3
  23. GO

9、 现在来验证一下分区数和行数:

  1. USE Sample_DB
  2. GO
  3.  
  4. SELECT partition_id ,
  5. object_id ,
  6. index_id ,
  7. partition_number ,
  8. rows
  9. FROM sys.partitions
  10. WHERE object_id = OBJECT_ID('tbl_SampleRecords')
  11. GO

10、             下面是截图:

RANGE LEFT定义每个分区的边界值,指定每个范围值是当前分区中最高值,也就是说分区的边界是属于左边值。

第十三章——表和索引分区(1)——使用Range Left进行表分区的更多相关文章

  1. 【HICP Gauss】数据库 数据库管理(数据库对象 表空间 索引 序列 分区 视图)-8

    什么是数据库对象 数据库对象包括 表 索引 分区 视图 序列 同义词 数据库支持对象存储过程 自定义函数 触发器 表空间 高级包 表 数据库中的数据结构 存储数据以及描述数据间的关系 表由行和列组成 ...

  2. MySQL查看表的索引【转】

    查看表的索引: show index from table_name(表名) 结果列表中各字段的含义: · Non_unique 如果索引不能包括重复词,则为0.如果可以,则为1. · Key_nam ...

  3. ORACLE表、索引和分区详解

    ORACLE表.索引和分区 一.数据库表 每种类型的表都有不同的特性,分别应用与不同的领域 堆组织表 聚簇表(共三种) 索引组织表 嵌套表 临时表 外部表和对象表 1.行迁移 建表过程中可以指定以下两 ...

  4. Phoenix表和索引分区优化方法

    Phoenix表和索引分区,基本优化方法 优化方法 1. SALT_BUCKETS RowKey SALT_BUCKETS 分区 2. Pre-split RowKey分区 3. 分列族 4. 使用压 ...

  5. SQL Server 表和索引存储结构

    在上一篇文章中,我们介绍了SQL Server数据文件的页面类型,系统通过96个字节的头部信息和系统表从逻辑层面上将表的存储结构管理起来,具体到表的存储结构上,SQL Server引入对象.分区.堆或 ...

  6. perl5 第十三章 Perl的面向对象编程

    第十三章 Perl的面向对象编程 by flamephoenix 一.模块简介二.Perl中的类三.创建类四.构造函数 实例变量 五.方法六.方法的输出七.方法的调用八.重载九.析构函数十.继承十一. ...

  7. 【书评:Oracle查询优化改写】第五至十三章

    [书评:Oracle查询优化改写]第五至十三章 一.1  BLOG文档结构图 一.2  前言部分 一.2.1  导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知 ...

  8. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十三章:计算着色器(The Compute Shader)

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十三章:计算着色器(The Compute Shader) 代码工程 ...

  9. Mysql分表和分区的区别、分库分表介绍与区别

    分表和分区的区别: 一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看:mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这 ...

随机推荐

  1. hdu4126(最小生成树+dfs)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4126 题意:给出一幅3000个点的图,有10000次操作: 求将某条边的权值变大后的最小生成树,最后输 ...

  2. 《软件project》课程报告 —国土资源执法监察管理信息系统建模

    ***********************************************声明*************************************************** ...

  3. 使用异步HTTP提升客户端性能(HttpAsyncClient)

    使用异步HTTP提升客户端性能(HttpAsyncClient) 大家都知道,应用层的网络模型有同步.异步之分. 同步,意为着线程阻塞,只有等本次请求全部都完成了,才能进行下一次请求. 异步,好处是不 ...

  4. spring的长处 ioc aop

    spring 的长处? 1.减少了组件之间的耦合性 ,实现了软件各层之间的解耦 2.能够使用easy提供的众多服务.如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它非 ...

  5. 基于CentOS 5.4搭建nginx+php+spawn-fcgi+mysql高性能php平台

    一.安装准备 1.1平台环境: CentOS 5.4 x86_64 GNU/Linux nginx-0.8.21 php-5.2.9 spawn-fcgi-1.6.3 mysql-5.1.34 .2系 ...

  6. ssh 实体关系分析确立(ER图-实体关系图)

    比較简单的方式就是依据模仿同类产品,依据同类产品的进行模仿,表单就是一个起码要加的字段,然后依据项目须要额外添加字段. 注意:实体类之间的引用关系还须要考虑性能的影响.如:单向或是双向. 表设计: 设 ...

  7. hdu4336压缩率大方的状态DP

    Card Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  8. UVa 442 Matrix Chain Multiplication(矩阵链,模拟栈)

    意甲冠军  由于矩阵乘法计算链表达的数量,需要的计算  后的电流等于行的矩阵的矩阵的列数  他们乘足够的人才  非法输出error 输入是严格合法的  即使仅仅有两个相乘也会用括号括起来  并且括号中 ...

  9. 集成框架 javaweb开发平台ssmy_m(生成代码) java struts2 mybatis spring maven jquery

    网页地址 http://blog.csdn.net/lpy3654321/article/details/31841573 项目设想,在项目开发中,我们的开发者大多数时间都在反复开发 相同的keywo ...

  10. 关于产品的一些思考——腾讯之QQ音乐

    --------------------2014.5.11-------------------- 原来一直使用小米手机自带的音乐播放器,除了搜歌下载不方便,其它的还好(省电是最大的长处),用过Jin ...