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

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

前言:

很多时候需要对大数据量进行归档或者删除,并周期性加载大数据量到一个大表中,现在来做个简单的例子,你经常需要删除大数据量表中的大量数据。同时,你想加载大量数据到这个表中,当表中数据有数十亿时,这个操作可能消耗几个小时,但是如果你的表有分区,那么执行起来会很有效。

本文将模拟删除一个季度的数据,并加载整个季度到现有表,其中使用了拆分(splitting)、合并(merging)和切换分区(switching)。

假设我们需要存储季度数据,并且每个季度存放在一个分区。现在需要清除最久的季度和加载最新的季度数据,比如分区中包含:

1、 季度1:2011年1月到2011年3月

2、 季度2:2011年4月到2011年6月

3、 季度3:2011年7月到2011年9月

4、 季度4:2011年10月到2011年12月

现在需要删除季度1并加载2012年第一季度的数据到一个新的分区中。为了实现这个功能,可以使用在date和time列上针对每个季度创建分区。可以合并两个分区或者拆分现有有分区。

本文将演示使用滑动窗口实现,在滑动窗口中,可以清除最久的分区。

步骤:

1、 打开SQLServer

2、 执行下面脚本,创建一个分区函数,并使用RANGE RIGHT,然后创建一个分区架构:

USE Sample_DBUSE 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
) LOG ON
(
	NAME =N‘Sample_DB_log‘,FILENAME=N‘C:\SQLData\Sample_DB_log.ldf‘,
	SIZE=1024KB ,FILEGROWTH=10%
)
GO

USE Sample_DB
GO
CREATE PARTITION FUNCTION pf_Quaterly_RangeRight(DATETIME)
AS RANGE RIGHT FOR VALUES
(‘20110101‘,‘20110401‘,‘20110701‘,‘20111001‘,‘20120101‘)
GO

CREATE PARTITION SCHEME ps_Quaterly_RangeRight
AS PARTITION pf_Quaterly_RangeRight ALL TO ([PRIMARY])
GO

注意:当分区列是datetime类型时,应该总是尝试使用RANGE RIGHT,这样会使得分区更好,如果使用RANGE LEFT,你必须考虑特定的time部分,包含毫秒。


3、 创建一个表tbl_MyData并插入275000行数据:

USE Sample_DB
GO

CREATE TABLE tbl_MyData
    (
      RecordDateTime DATETIME NOT NULL ,
      RecordID INT NOT NULL ,
      RecordData VARCHAR(40) NOT NULL
    )
GO

CREATE CLUSTERED INDEX idx_tbl_MyData_RecordDateTime
ON tbl_MyData(RecordDateTime,RecordID) ON ps_Quaterly_RangeRight(RecordDateTime)

INSERT  INTO tbl_MyData
        SELECT  ‘2011‘ + RIGHT(‘0‘ + CAST(( CASE WHEN ID % 12 = 0 THEN 12
                                                 ELSE ID % 12
                                            END ) AS VARCHAR), 2) + RIGHT(‘0‘
                                                              + CAST(( CASE
                                                              WHEN ID % 28 = 0
                                                              THEN 28
                                                              ELSE ID % 28
                                                              END ) AS VARCHAR),
                                                              2) AS RecordDateTime ,
                ID ,
                RecordData
        FROM    ( SELECT TOP 275000
                            ID = ROW_NUMBER() OVER ( ORDER BY c1.name ) ,
                            RecordData = NEWID()
                  FROM      sys.columns AS C1
                            CROSS JOIN sys.columns AS C2
                            CROSS JOIN sys.columns AS C3
                ) AS T
GO

4、 执行下面语句,检验分区数量:

USE Sample_DB
GO

SELECT  partition_number ,
        rows
FROM    sys.partitions
WHERE   object_id = OBJECT_ID(‘tbl_MyData‘)
ORDER BY partition_number

5、 结果如下:

6、 现在先移除2011年第一个季度也就是分区1的数据:

USE Sample_DB
GO

IF OBJECT_ID(‘tbl_MyStagingData‘) IS NOT NULL
    DROP TABLE tbl_MyStagingData

CREATE TABLE tbl_MyStagingData
    (
      RecordDateTime DATETIME NOT NULL ,
      RecordID INT NOT NULL ,
      RecordData VARCHAR(40) NOT NULL
    )
GO

CREATE CLUSTERED INDEX idx_tbl_MyStagingData_RecordDateTime ON tbl_MyStagingData(RecordDateTime,RecordID)
GO

7、 现在,切换tbl_MyData的分区2到分期表tbl_MyStagingData并清空分期表。在清空以后,检查分区数据:

USE Sample_DB
GO

ALTER TABLE tbl_MyData
SWITCH PARTITION 2 TO tbl_MyStagingData PARTITION 1
GO
TRUNCATE TABLE tbl_MyStagingData
GO

SELECT  partition_number ,
        rows
FROM    sys.partitions
WHERE   object_id = OBJECT_ID(‘tbl_MyData‘)
ORDER BY partition_number

8、 结果可见,分区已经清空:

9、 现在,把分区2与分区1合并,设置下一个使用分区架构的文件组到PRIMARY并验证数据:

 USE Sample_DB
GO

ALTER PARTITION FUNCTION pf_Quaterly_RangeRight()
MERGE RANGE (‘20110101‘)
GO

ALTER PARTITION SCHEME ps_Quaterly_RangeRight
NEXT USED [PRIMARY]

SELECT  partition_number ,
        rows
FROM    sys.partitions
WHERE   object_id = OBJECT_ID(‘tbl_MyData‘)
ORDER BY partition_number

10、  结果如下:

11、 现在加载数据到tbl_MyData,为了实现这个步骤,需要生成一些数据并插入到分期表tbl_MyStagingData:

USE Sample_DB
GO

ALTER TABLE tbl_MyStagingData
ADD CONSTRAINT ck_tbl_MyStagingData_RecordDateTime
CHECK (RecordDateTime>=‘20120101‘ AND RecordDateTime<‘20120401‘)

INSERT  INTO tbl_MyStagingData
        SELECT  ‘2012‘ + RIGHT(‘0‘ + CAST(( CASE WHEN ID % 3 = 0 THEN 3
                                                 ELSE ID % 3
                                            END ) AS VARCHAR), 2) + RIGHT(‘0‘
                                                              + CAST(( CASE
                                                              WHEN ID % 28 = 0
                                                              THEN 28
                                                              ELSE ID % 28
                                                              END ) AS VARCHAR),
                                                              2) AS RecordDateTime ,
                ID ,
                RecordData
        FROM    ( SELECT TOP 275000
                            ID = ROW_NUMBER() OVER ( ORDER BY c1.name ) ,
                            RecordData = NEWID()
                  FROM      sys.columns AS C1
                            CROSS JOIN sys.columns AS C2
                            CROSS JOIN sys.columns AS C3
                ) AS T
GO

12、  现在通过拆分最后一个空的分区来创建一个新的分区,拆分后,把分区tbl_MyStagingData切换到tbl_MyData的分区5中,并设置下一个分区架构使用Primary:

USE Sample_DB
GO

ALTER PARTITION FUNCTION pf_Quaterly_RangeRight()
SPLIT RANGE (‘20120401‘)
GO

ALTER TABLE tbl_MyStagingData
SWITCH PARTITION 1 TO tbl_MyData PARTITION 5

ALTER PARTITION SCHEME ps_Quaterly_RangeRight
NEXT USED [PRIMARY]
GO

13、现在来验证一下数据:

USE Sample_DB
GO

SELECT  partition_number ,
        rows
FROM    sys.partitions
WHERE   object_id = OBJECT_ID(‘tbl_MyData‘)
ORDER BY partition_number

14、结果如下:

分析:

本文使用了CREATEPARTITION FUNCTION命令,首先创建了一个分区函数pf_Quaterly_RangeRight,通过定义RecordDateTime来做分区列,使得20110101~20120101进行分区。然后使用CREATE PARTITION SCHEME命令创建分区架构ps_Quaterly_RangeRight,映射所有分区到PRIMARY文件组。通过一些列的操作处理分区中的数据。

扩展知识:

本文显示了一个简单的例子,可以在生产环境中配置周期性实现。重点是脚本要足够智能化和动态化。

时间: 2024-07-29 03:39:28

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

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

原文:第十三章--表和索引分区(1)--使用Range Left进行表分区 前言: 如果数据表的数据持续增长,并且表中的数据量已经达到数十亿甚至更多,数据的查询和操作将非常困难,面对非常庞大的表,几时简单的增删改操作都会花费非常多的时间,如删除某个数据然后重建索引这些操作,会很难实现.在这种情况下,管理和维护查询性能就成为了一种挑战. 在过去的日子,也就是2005之前,你可能需要使用分区视图来处理大数据量的数据,从2005开始,微软引入了叫做表分区的新特性.允许水平分割数据成为多个分区.并且也允

ajax验证表单元素规范正确与否 ajax展示加载数据库数据 ajax三级联动

一.ajax验证表单元素规范正确与否 以用ajax来验证用户名是否被占用为例 1创建表单元素<input type="text" id="t"> 2在js中用keyup事件来进行操作 3创建ajax格式和内容:格式: $.ajax({ url:"哪一个服务端处理器", data:{"自己起名",所需要传给处理器的数据}, type:"post", dataType:"json"

c# 模拟表单提交,post form 上传文件、大数据内容

表单提交协议规定:要先将 HTTP 要求的 Content-Type 设为 multipart/form-data,而且要设定一个 boundary 参数,这个参数是由应用程序自行产生,它会用来识别每一份资料的边界 (boundary),用以产生多重信息部份 (message part).而 HTTP 服务器可以抓取 HTTP POST 的信息, 基本内容:1. 每个信息部份都要用 --[BOUNDARY_NAME] 来包装,以分隔出信息的每个部份,而最后要再加上一个 --[BOUNDARY_N

柯南君 :Oracle 分区技术 之 如何支撑大数据操作?

前段时间,看了罗女士( 资深技术顾问 - Oracle 中国 顾问咨询部)关于<大批量数据处理技术的演讲>视频,感觉受益良多,结合多年的知识积累,柯南君给大家分享一下: 交流内容: 一.Oracle的分区技术 (一)分区技术内容 1. 什么是分区? 分区就是将一个非常大的table或者index 按照某一列的值,分解为更小的,易于管理的逻辑片段---分区.将表或者索引分区不会影响SQL语句以及DML(见备注)语句,就和使用非分区表一样,每个分区拥有自己的segment(见备注),因为,DDL(

Laxcus大数据管理系统(5)- 第二章 数据组织

第二章 数据组织 在数据的组织结构设计上,Laxcus严格遵循数据和数据描述分离的原则,这个理念与关系数据库完全一致.在此基础上,为了保证大规模数据存取和计算的需要,我们设计了大量新的数据处理技术.同时出于兼顾用户使用习惯和简化数据处理的目的,继续沿用了一些关系数据库的设计和定义,其中不乏对SQL做适量的修订.在这些变化中,核心仍然是以关系代数的理念去处理数据,以及类自然语言风格的数据描述.所以用户在使用体验上,和关系数据库相比,不会感觉到有太多的差异. 本章将介绍Laxcus数据结构的组成,并

大数据存储的秘密之分区

分区,又称为分片,是解决大数据存储的常见解决方案,大数据存储量超过了单节点的存储上限,因此需要进行分区操作将数据分散存储在不同节点上,通常每个单个分区可以理解成一个小型的数据库,尽管数据库能同时支持多个分区操作:分区引入多分区概念,可以同时对外服务提高性能. 常常和分区一并提及的概念是复制,分区通常与复制结合使?,使得每个分区的副本存储在多个节点上. 这意味着,即使每条记录属于?个分区,它仍然可以存储在多个不同的节点上以获得容错能?.分区在许多技术或框架中都有体现,例如MQ中topic下的分区消

大数据架构-使用HBase和Solr将存储与索引放在不同的机器上

摘要:HBase和Solr可以通过协处理器Coprocessor的方式向Solr发出请求,Solr对于接收到的数据可以做相关的同步:增.删.改索引的操作,这样就可以同时使用HBase存储量大和Solr检索性能高的优点了,更何况HBase和Solr都可以集群.这对海量数据存储.检索提供了一种方式,将存储与索引放在不同的机器上,是大数据架构的必须品. 关键词:HBase, Solr, Coprocessor, 大数据, 架构 正如我的之前的博客“Solr与HBase架构设计”http://http:

表分区及索引分区

分区概述 为了简化数据库大表的管理,例如在数据仓库中一般都是TB级的数量级.ORACLE8以后推出了分区选项.分区将表分离在若于不同的表空间上,用分而治之的方法来支撑元限膨胀的大表,组大表在物理一级的可管理性.将大表分割成较小的分区可以改善表的维护.备份.恢复.事务及查询性能. 分区的优点: 1.  增强可用性:如果表的一个分区由于系统故障而不能使用,表的其余好的分区仍可以使用: 2.  减少关闭时间:如果系统故障只影响表的一部份分区,那么只有这部份分区需要修复,矿能比整个大表修复花的时间更少:

oracle表分区与索引分区

今天是2016年4月13号,清晨据说是50年来深圳最大的雨把我给吵醒了,上午腾讯新闻弹出新闻说这是谣言~!我信了~! 今天把tiptop的一个功能实现了~心情还不错.不瞎扯了,今天开始学习oracle表分区和索引分区!坚持就是胜利~ oracle是支持物理分区的数据库管理系统,据说是最早支持的!优点如下 1:减少维护工作量,独立管理每个分区比管理大的单分区简单 2:数据可用性增强,一个分区坏了不影响所有数据 3:提高查询速度 4:均衡I/O 创建表分区 create table ware_ret