第十三章——表和索引分区(1)——使用Range Left进行表分区
原文:第十三章——表和索引分区(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:
USE master
GO
IF DB_ID('Sample_DB') IS NOT NULL
DROP DATABASE [Sample_DB] CREATE DATABASE [Sample_DB] ON PRIMARY
(
NAME =N'Sample_DB',FILENAME=N'C:\SQLData\Sample_DB.mdf',
SIZE=3072KB,FILEGROWTH=1024KB
), FILEGROUP [FG_1]
(
NAME =N'FG_1_DataFile',FILENAME=N'C:\SQLData\FG_1_DataFile.ndf',
SIZE=3072KB,FILEGROWTH=1024KB
), FILEGROUP [FG_2]
(
NAME =N'FG_2_DataFile',FILENAME=N'C:\SQLData\FG_2_DataFile.ndf',
SIZE=3072KB,FILEGROWTH=1024KB
), FILEGROUP [FG_3]
(
NAME =N'FG_3_DataFile',FILENAME=N'C:\SQLData\FG_3_DataFile.ndf',
SIZE=3072KB,FILEGROWTH=1024KB
), FILEGROUP [FG_N]
(
NAME =N'FG_N_DataFile',FILENAME=N'C:\SQLData\FG_N_DataFile.ndf',
SIZE=3072KB,FILEGROWTH=1024KB
) LOG ON
(
NAME =N'Sample_DB_log',FILENAME=N'C:\SQLData\Sample_DB_log.ldf',
SIZE=3072KB,FILEGROWTH=10%
)
GO
3、 创建一个带有RANGE LEFT的分区函数pf_OneMillion_LeftRange:
USE Sample_DB
GO CREATE PARTITION FUNCTION pf_OneMillion_LeftRange(INT)
AS RANGE LEFT FOR VALUES(0,1000000,2000000,3000000)
GO
4、 验证分区函数:
USE Sample_DB
GO
SELECT name ,
function_id ,
type ,
type_desc ,
fanout ,
boundary_value_on_right ,
create_date
FROM sys.partition_functions SELECT function_id ,
boundary_id ,
parameter_id ,
value
FROM sys.partition_range_values
GO
5、 得到下面的结果:

6、 现在运行下面的脚本,创建并验证分区架构:
USE Sample_DB
GO CREATE PARTITION SCHEME ps_OneMillion_LeftRange
AS PARTITION pf_OneMillion_LeftRange
TO ([primary],[FG_1],[FG_2],[FG_3],[FG_N]) SELECT name ,
data_space_id ,
type ,
type_desc ,
function_id
FROM sys.partition_schemes
GO
7、 下面是结果:

8、 现在创建一个表tbl_SampleRecords,并插入500万数据:
USE Sample_DB
GO IF OBJECT_ID('tbl_SampleRecords') IS NOT NULL
DROP TABLE tbl_SampleRecords CREATE TABLE tbl_SampleRecords
(
id INT ,
SomeDate SYSNAME ,
CONSTRAINT pk_tbl_SampleRecords_id PRIMARY KEY CLUSTERED ( id )
)
ON ps_OneMillion_LeftRange(id)
GO INSERT INTO tbl_SampleRecords
SELECT TOP 5000000
id = ROW_NUMBER() OVER ( ORDER BY C1.name ) ,
somedata = c1.NAME
FROM sys.columns AS C1
CROSS JOIN sys.columns AS C2
CROSS JOIN sys.columns AS C3
GO
9、 现在来验证一下分区数和行数:
USE Sample_DB
GO SELECT partition_id ,
object_id ,
index_id ,
partition_number ,
rows
FROM sys.partitions
WHERE object_id = OBJECT_ID('tbl_SampleRecords')
GO
10、 下面是截图:

RANGE LEFT定义每个分区的边界值,指定每个范围值是当前分区中最高值,也就是说分区的边界是属于左边值。
第十三章——表和索引分区(1)——使用Range Left进行表分区的更多相关文章
- 【HICP Gauss】数据库 数据库管理(数据库对象 表空间 索引 序列 分区 视图)-8
什么是数据库对象 数据库对象包括 表 索引 分区 视图 序列 同义词 数据库支持对象存储过程 自定义函数 触发器 表空间 高级包 表 数据库中的数据结构 存储数据以及描述数据间的关系 表由行和列组成 ...
- MySQL查看表的索引【转】
查看表的索引: show index from table_name(表名) 结果列表中各字段的含义: · Non_unique 如果索引不能包括重复词,则为0.如果可以,则为1. · Key_nam ...
- ORACLE表、索引和分区详解
ORACLE表.索引和分区 一.数据库表 每种类型的表都有不同的特性,分别应用与不同的领域 堆组织表 聚簇表(共三种) 索引组织表 嵌套表 临时表 外部表和对象表 1.行迁移 建表过程中可以指定以下两 ...
- Phoenix表和索引分区优化方法
Phoenix表和索引分区,基本优化方法 优化方法 1. SALT_BUCKETS RowKey SALT_BUCKETS 分区 2. Pre-split RowKey分区 3. 分列族 4. 使用压 ...
- SQL Server 表和索引存储结构
在上一篇文章中,我们介绍了SQL Server数据文件的页面类型,系统通过96个字节的头部信息和系统表从逻辑层面上将表的存储结构管理起来,具体到表的存储结构上,SQL Server引入对象.分区.堆或 ...
- perl5 第十三章 Perl的面向对象编程
第十三章 Perl的面向对象编程 by flamephoenix 一.模块简介二.Perl中的类三.创建类四.构造函数 实例变量 五.方法六.方法的输出七.方法的调用八.重载九.析构函数十.继承十一. ...
- 【书评:Oracle查询优化改写】第五至十三章
[书评:Oracle查询优化改写]第五至十三章 一.1 BLOG文档结构图 一.2 前言部分 一.2.1 导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知 ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十三章:计算着色器(The Compute Shader)
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十三章:计算着色器(The Compute Shader) 代码工程 ...
- Mysql分表和分区的区别、分库分表介绍与区别
分表和分区的区别: 一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看:mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这 ...
随机推荐
- coding.net解决github上下载速度慢问题
由 于众所周知的原因,从github下载项目很慢,一般不超过10kb(我的是20兆公司网)例如我下载OpenRefine,没有3个小时搞不定.所以想 到了一个方法来解决他.就是使用国内其他代码托管平台 ...
- svn rm --keep-local ./QueryParser_kill.logs
svn rm --keep-local ./QueryParser_kill.logs
- Win7下不能查看xp系统共享的文件,解决方法
近期在做一个程序,xp执行良好.win7总是打不开文件,输入地址訪问\\192.168.0.254,发现须要输入usernamepassword 局域网内的XP电脑能够訪问WIN7的共享文件.而WIN ...
- SVN的命令解析(感觉不错就转了)
本文链接: http://www.php-oa.com/2008/03/12/svnminglingzailinuxxiadeshiyong.html .将文件checkout到本地目录 svn ch ...
- SWT的TitleAreaDialog详解
转自:http://www.cnblogs.com/AllenYoung/archive/2006/10/05/521805.html Dialog是SWT和JFace的一个重要的组成部分,我们在开发 ...
- Git管理工具对照(GitBash、EGit、SourceTree)
Git管理工具对照(GitBash.EGit.SourceTree) GitBash是採用命令行的方式对版本号进行管理,功能最为灵活强大,可是由于须要手动输入希望改动的文件名称,所以相对繁琐. EGi ...
- OpenCV中的SVM參数优化
SVM(支持向量机)是机器学习算法里用得最多的一种算法.SVM最经常使用的是用于分类,只是SVM也能够用于回归,我的实验中就是用SVM来实现SVR(支持向量回归). 对于功能这么强的算法,opencv ...
- Python学习入门基础教程(learning Python)--3.3.2 Python的关系运算
如果if的condition不用布尔表达式来做条件判断而采用关系表达式,实际上关系表达式运算的结果要么是True要么是False.下面我们先了解一些有关关系运算符的基础知识,如下表所示. 做个小程序测 ...
- html弹窗,与弹出对话框
弹出对话框 <script type="text/JavaScript"> <!-- alert("Good Morning!"); //al ...
- Java的wait(), notify()和notifyAll()使用心得(转)
本篇文章是对java的 wait(),notify(),notifyAll()进行了详细的分析介绍,需要的朋友参考下wait(),notify()和notifyAll()都是java.lang.Obj ...