第十三章——表和索引分区(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定义每个分区的边界值,指定每个范围值是当前分区中最高值,也就是说分区的边界是属于左边值。

时间: 2024-08-26 19:53:45

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

第十三章——表和索引分区(2)——使用拆分删除和加载大数据

原文:第十三章--表和索引分区(2)--使用拆分删除和加载大数据 前言: 很多时候需要对大数据量进行归档或者删除,并周期性加载大数据量到一个大表中,现在来做个简单的例子,你经常需要删除大数据量表中的大量数据.同时,你想加载大量数据到这个表中,当表中数据有数十亿时,这个操作可能消耗几个小时,但是如果你的表有分区,那么执行起来会很有效. 本文将模拟删除一个季度的数据,并加载整个季度到现有表,其中使用了拆分(splitting).合并(merging)和切换分区(switching). 假设我们需要存

第六章——根据执行计划优化性能(2)——查找表/索引扫描

原文:第六章--根据执行计划优化性能(2)--查找表/索引扫描 前言: 在绝大部分情况下,特别是从一个大表中返回少量数据时,表扫描或者索引扫描并不是一种高效的方式.这些必须找出来并解决它们从而提高性能,因为扫描将遍历每一行,查找符合条件的数据,然后返回结果.这种处理是相当耗时耗资源的.在性能优化过程中,一般集中于: 1.  CPU 2.  Network 3.  磁盘IO 而扫描操作会增加这三种资源的开销. 准备工作: 下面将创建两个表来查看不同的物理关联操作的不同影响.创建脚本已经在本系列的第

ORACLE表、索引和分区

一.数据库表 每种类型的表都有不同的特性,分别应用与不同的领域 堆组织表 聚簇表(共三种) 索引组织表 嵌套表 临时表 外部表和对象表 1.行迁移 建表过程中可以指定以下两个参数:  PCTFREE:自由空间,默认值10 PCTUSED(只适用于MSSM):默认值40 设置这两个参数很重要:  一方面避免迁移过多的行,影响性能  一方面避免浪费太多的空间 当自由空间存不下更新后的某一行时,这一行将会发生行迁移,在两个块上存储这一行数据,如下图: 2.堆组织表 基本上我们使用的表都是堆组织表(he

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

第十三章 Perl的面向对象编程 by flamephoenix 一.模块简介二.Perl中的类三.创建类四.构造函数 实例变量 五.方法六.方法的输出七.方法的调用八.重载九.析构函数十.继承十一.方法的重载十二.Perl类和对象的一些注释 本章介绍如何使用Perl的面向对象编程(OOP)特性及如何构建对象,还包括继承.方法重载和数据封装等内容.一.模块简介    模块(module)就是Perl包(pachage).Perl中的对象基于对包中数据项的引用.(引用见第x章引用).详见http:

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

[书评:Oracle查询优化改写]第五至十三章 一.1  BLOG文档结构图 一.2  前言部分 一.2.1  导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① 字符串的处理 ② 常用分析函数 ③ 用sql输出九九乘法表 本文如有错误或不完善的地方请大家多多指正,ITPUB留言或QQ皆可,您的批评指正是我写作的最大动力. 一.2.2  实验环境介绍 oracle 11g 一.2.3  相关参考文章链接 前4章的链接参考相关连接:

Java编程思想第四版读书笔记——第十三章 字符串

Java编程思想第四版读书笔记--第十三章 字符串 字符串的操作是计算机程序设计中最常见的行为. 关键词: StringBuilder ,StringBuffer,toString(),format转换,正则表达式, 1.不可变String String对象时不可变的.每当把String对象作为方法的参数时,都会复制一份引用.(其实就是对函数中参数列表中参数的操作不会影响外面的原参数) 如下: import static net.mindview.util.Print.*; public cla

SQL Server 表和索引存储结构

在上一篇文章中,我们介绍了SQL Server数据文件的页面类型,系统通过96个字节的头部信息和系统表从逻辑层面上将表的存储结构管理起来,具体到表的存储结构上,SQL Server引入对象.分区.堆或B树.分配单元等概念. 下图显示了表的存储组织,每张表有一个对应的对象ID,并且包含一个或多个分区,每个分区会有一个堆或者多个B树,堆或者B树的结构是预留的.每个堆或者是B树都有三个分配单元用来存放数据,分别是数据.LOB.行溢出,使用最多的分配单元是数据.如果有LOB数据或者是长度超过8000字节

c++第十三章 -(副本构造器)

逐位复制(bitwise copy):编译器将生成必要的代码把“源”对象各属性的值分别赋值给“目标”对象的对应成员的行为.对对象的地址赋值操作,于是乎,当删除一个对象时,它包含的指针也将被删除,但万一此时另一个副本(对象)还在引用这个指针,就会出问题! 要是程序员在当初进行对象“复制”时能够精确地表明应该复制些什么和如何赋值,那就理想了.为解决该问题,我们可以对=操作符进行重载,其中对指针进行处理:MyClass &operator= (const MyClass &rhs);该语句的意思

CSS3秘笈复习:十三章&十四章&十五章&十六章&十七章

第十三章 1.在使用浮动时,源代码的顺序非常重要.浮动元素的HTML必须处在要包围它的元素的HTML之前. 2.清楚浮动: (1).在外围div的底部添加一个清除元素:clear属性可以防止元素包围浮动元素.关键字:left.right或both. (2).浮动外围元素:让包含浮动元素的<div>也浮动.选择这种方法一定要在浮动容器后面的任何元素中添加一个clear属性,确保浮动元素落到容器的下方. (3).利用overflow : hidden.另一种常见的方法是在外围的样式中添加以下属性: