第十三章——表和索引分区(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-07-29 09:40:36

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

ZT:Move表、索引、LOB/Long

http://xsb.itpub.net/post/419/113947 Move表.索引.LOB/Long [zt] move一个表到另外一个表空间时,索引不会跟着一起move,而且会失效.(LOB类型例外) 表move,我们分为:*普通表move*分区表move*LONG,LOB大字段类型move来进行测试和说明. 索引的move,我们通过rebuild来实现SQL> select * from v$version;Oracle9i Enterprise Edition Release 9.

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

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

mysql-《疯狂java实战演义》里面的第十三章MySQL管理器程序有没有做出往数据库导入Excel表的?

问题描述 <疯狂java实战演义>里面的第十三章MySQL管理器程序有没有做出往数据库导入Excel表的? 本人想在MySQL管理器程序源代码里面加上导入表的代码,但是总是失败,想向个位请教一下,有人这么做过吗,能否给一下代码,谢谢! 解决方案 http://download.csdn.net/detail/qianfu123/3589697 源代码,自己下

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

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

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

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

Mysql建表与索引使用规范详解

本篇文章是对Mysql建表和索引使用规范进行了详细的分析介绍,需要的朋友参考下   一. MySQL建表,字段需设置为非空,需设置字段默认值. 二. MySQL建表,字段需NULL时,需设置字段默认值,默认值不为NULL. 三. MySQL建表,如果字段等价于外键,应在该字段加索引. 四. MySQL建表,不同表之间的相同属性值的字段,列类型,类型长度,是否非空,是否默认值,需保持一致,否则无法正确使用索引进行关联对比. 五. MySQL使用时,一条SQL语句只能使用一个表的一个索引.所有的字段

python 教程 第十三章、 特殊的方法

第十三章. 特殊的方法 1)    特殊的方法 __init__(self,...) 这个方法在新建对象恰好要被返回使用之前被调用. __del__(self) 恰好在对象要被删除之前调用. __str__(self) 在我们对对象使用print语句或是使用str()的时候调用. __lt__(self,other) 当使用 小于 运算符(<)的时候调用.类似地,对于所有的运算符(+,>等等)都有特殊的方法. __getitem__(self,key) 使用x[key]索引操作符的时候调用.

Mysql建表与索引使用规范详解_Mysql

一. MySQL建表,字段需设置为非空,需设置字段默认值.二. MySQL建表,字段需NULL时,需设置字段默认值,默认值不为NULL.三. MySQL建表,如果字段等价于外键,应在该字段加索引.四. MySQL建表,不同表之间的相同属性值的字段,列类型,类型长度,是否非空,是否默认值,需保持一致,否则无法正确使用索引进行关联对比.五. MySQL使用时,一条SQL语句只能使用一个表的一个索引.所有的字段类型都可以索引,多列索引的属性最多15个.六. 如果可以在多个索引中进行选择,MySQL通常

查看数据库、表、索引的物理存储情况

在管理.维护数据库时,经常需要查看数据库文件.日志文件所占用的磁盘空间,以及磁盘还剩下的磁盘空间,你可以通过下面几种方面 查看数据库文件详细情况:   1: 是通过远程连接(或VPN)连接到数据库服务器,直接去查看.   2: 你连接到数据库后,可以通过mssms管理器,选择要查看的数据库,单击右键选择属性.然后选择文件选项,如下图所示.   3: 通过SQL命令.脚本查看.     3.1: sys.database_files 视图中保存着数据库文件(数据文件.日志文件)等的详细信息  SE