分区表_Leon_He2014的博客-程序员秘密

技术标签: SQL SERVER  

分区表

分区表的基本操作和通过分区切换来操作分区表

 

1.创建数据库和添加文件组

IF DB_ID('TestDB_PT') IS NOT NULL
   DROP DATABASE TestDB_PT;
GO
CREATE DATABASE TestDB_PT
ON
PRIMARY
(Name=TestDB_PT,
FILENAME='C:\DB\TestDB_PT\TestDB_PT.mdf',
SIZE=2MB,MAXSIZE=1024MB,FILEGROWTH=10MB
)
LOG ON
(
Name=TestDB_PT_LOG,
FILENAME='C:\DB\TestDB_PT\TestDB_PT_LOG.ldf',
SIZE=1MB,MAXSIZE=1024MB,FILEGROWTH=10MB
)
GO
USE TestDB_PT
GO

-- 添加文件组到数据库TestDB_PT

DECLARE @Count INT =4; -- 添加4个文件组
DECLARE @i INT =0;
DECLARE @SQL varchar(1000)='';
WHILE (@i<@Count)
BEGIN
SET @SQL='ALTER DATABASE TestDB_PT ADD FILEGROUP FG'+convert(varchar(10),@i+1)+';'
Exec (@SQL);
SET @[email protected]+1;
END
-- 添加文件到文件组
SET @i =0;
SET @SQL =''
WHILE (@i<@Count)
BEGIN
SET @SQL='ALTER DATABASE TestDB_PT ADD FILE( NAME=FG'+CONVERT(VARCHAR(10),@i+1)+'_Data1,FILENAME=''C:\DB\TestDB_PT\FG'+CONVERT(VARCHAR(10),@i+1)+'_Data1.ndf'' ,SIZE=1MB,MAXSIZE=100MB,FILEGROWTH=1MB ) TO FILEGROUP FG'+CONVERT(VARCHAR(10),@i+1)
Exec (@SQL)
SET @[email protected]+1;
END

 2.创建分区函数

CREATE PARTITION FUNCTION PFMonthly(int)
AS RANGE RIGHT –- 还可以是RANGE LEFT.详细了解RANGE RIGHT就足够了
FOR VALUES(20130601,20130701,20130801)

     数据的分布如下所示:

3.创建分区方案

CREATE PARTITION SCHEME PSMonthly
AS PARTITION PFMonthly -- 分区函数
TO (FG1,FG2,FG3,FG4) -- 对应文件组个数为分区函数范围值加1

    数据的分布如下所示:

 

4.创建分区表

CREATE TABLE [dbo].[TB](
   [DateKey] [int] NOT NULL,
   [number] [int]  NULL
) ON PSMonthly([DateKey]) -- 此处对应分区方案和分区列

分区函数,分区方案,分区表关系如下图:

  

5.用切换分区的方式填充分区表

-- 创建切换时需要的临时表
IF OBJECT_ID('TestDB_PT.dbo.Stage_TB') IS NOT NULL
DROP TABLE TestDB_PT.dbo.Stage_TB
GO
CREATE TABLE [dbo].[Stage_TB](
   [DateKey] [int] NOT NULL,
   [number] [int]  NULL
) ON FG1 --必须是将要加载的数据对应的文件组

-- 添加DateKey的约束。这个必须添加,否则在切换的时候会报语法错误。这个约束的目的是防止切换的时候需要将临时表中的数据切换到不同的分区。
ALTER TABLE [dbo].[Stage_TB]
ADD CONSTRAINT CK_Stage_TB_DateKey CHECK(DateKey>= 20130501and DateKey<20130601)
-- 添加数据到Stage_TB
insert into dbo.Stage_TB
SELECT Convert(varchar(20), Dateadd(DAY,number,'2013-05-21'),112 ) DateKey
,number
FROM master.dbo.spt_values
where type='p'
and Dateadd(DAY,number,'2013-05-21') <'20130601'           
--  通过switch语句做切换
ALTER TABLE  Stage_TB
SWITCH  TO TB PARTITION 1 -- 这个地方的分区号在前面的查询中能看到

 切换前如下图:

 

切换后入下图:

                 

其他分区的数据加载,以此类推。加载完5,6,7月份的数据后,如下图:

  

-- 查询分区表中实际数据情况
select $partition.PFMonthly(DateKey) as [Partition#]
,count(*) RowCnt
,Min(DateKey) AS MinDate
,Max(DateKey) AS MaxDate
from TB
group by $partition.PFMonthly(DateKey)
order by [Partition#]    
--  删除临时表
DROP TABLE Stage_TB

 6.用切换分区的方式删除最早分区数据

--   删除20130501到20130531的数据
-- 创建切换时需要的临时表
IF OBJECT_ID('TestDB_PT.dbo.Stage_TB') IS NOT NULL
DROP TABLE TestDB_PT.dbo.Stage_TB
GO
CREATE TABLE [dbo].[Stage_TB](
   [DateKey] [int] NOT NULL,
   [number] [int]  NULL
) ON FG1 --必须是将要加载的数据对应的文件组
--  通过switch语句,切换数据到临时表
ALTER TABLE  TB
SWITCH PARTITION 1 TO Stage_TB  -- 这个地方的分区号在前面的查询中能看到
-- 查看对应的分区值
SELECT 
     SPS.name AS PartitionSchemeName
   , CASE WHEN SDD.destination_id <= SPF.fanout THEN SDD.destination_id
        ELSE NULL END AS PartitionID
   , SPF.name AS PartitionFunctionName
   , SPRV.value AS BoundaryValue
   , CASE WHEN SDD.destination_id > SPF.fanout THEN 1 
        ELSE 0 END AS NextUsed
   , SF.name AS FileGroup
FROM sys.partition_schemes AS SPS
JOIN sys.partition_functions AS SPF 
   ON SPS.function_id = SPF.function_id
JOIN sys.destination_data_spaces AS SDD 
   ON SDD.partition_scheme_id = SPS.data_space_id
JOIN sys.filegroups AS SF 
   ON SF.data_space_id = SDD.data_space_id
LEFT JOIN sys.partition_range_values AS SPRV 
   ON SPRV.function_id = SPF.function_id
   AND SDD.destination_id = 
CASE WHEN SPF.boundary_value_on_right = 0 THEN SPRV.boundary_id
   ELSE SPRV.boundary_id + 1 END 
WHERE SPS.name = 'PSMonthly';
-- 从分区函数中去掉对应值
ALTER PARTITION FUNCTION PFMonthly()
MERGE RANGE(20130601)
-- 删除临时表
DROP TABLE Stage_TB

删除前如下图:

                 

删除后如下图:

 

注意:RANGE RIGHT的分区表。合并两个相邻分区后,数据存放在左边分区对应数据文件组。上图中分区1和分区2合并后存放在FG1 。

7.用切换分区的方式添加8月份数据

--将FG2设置为 NEXT USED,用split添加新的分区后,新的分区的数据将存放在FG2
ALTER PARTITION SCHEME [PSMonthly] NEXT USED FG2
-- 添加新分区值
ALTER PARTITION FUNCTION PFMonthly()
SPLIT RANGE(20130901)

添加新分区值前:

添加新分区值后:

  

通过临时表切换分区的方式加载8月份的数据,参照“5.用切换分区的方式填充分区表”。

更多详细信息参见:http://download.microsoft.com/download/D/B/D/DBDE7972-1EB9-470A-BA18-58849DB3EB3B/PartTableAndIndexStrat.docx

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/stublue/article/details/8960879

智能推荐

20. “我”模块(二)之星座_Jennyni1122的博客-程序员秘密

上一节对欢迎模块进行了综述(可参见 “我”模块(一) 进行了解),接下来将从“我”模块(二)开始详细介绍:[“我”模块(二)之日历][“我”模块(二)之星座][“我”模块(二)之星座选择][“我”模块(二)之涂鸦][“我”模块(二)之地图]知识点掌握“日历”界面的开发,使用日历展示当前年份掌握“星座”界面的开发,选择不同的星座展示不同...

[传统图像处理]-------HOG方向梯度直方图_ZJE_ANDY的博客-程序员秘密

Histogram of Oriented Gridients,缩写为HOG,是目前计算机视觉、模式识别领域很常用的一种描述图像局部纹理的特征。就是说先计算图片某一区域中不同方向上梯度的值,然后进行累积,得到直方图,这个直方图呢,就可以代表这块区域了,也就是作为特征,可以输入到分类器里面了。HOG算法过程:1. 把整张图片分成多个部分(多个cell,一个cell是8*8像素)2.每个cell生成一个梯度方向直方图计算每一个像素的梯度:计算方式:如下图为A像素及其上...

IIC通信之EEPROM_eeprom通信_big__C的博客-程序员秘密

目录一,I2C串行总线概述二,I2C总线的数据传送1、数据位的有效性规定2、起始和终止信号3、I2C的低层时序三,EEPROM有关知识和读写操作AT24c02写操作AT24c02读操作一,I2C串行总线概述 I2C总线是PHLIPS公司推出的一种串行总线,是具备多主机系统所需的包括总线裁决和高低速器件同步功能的高性能串行总线。 I2C总线只有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。 I2C总线通过上拉电阻接正电源。当总线空闲时,两根线均为高电平。连到总线上的任一器件输出的低电平

kanzi文档_蓝牙先生的博客-程序员秘密

https://docs.kanzi.com/3.6.16/en-us/Default.htm#Best%20practices/Rendering/Composition%20and%20blending.htm?Highlight=glBlendFunchttps://docs.kanzi.com/3.6.16/en-us/Default.htm#Best%20practices/Rendering/Composition%20and%20blending.htm?Highlight=glBlendFu

eSIM(Embedded-SIM)-嵌入式SIM卡_esim卡引脚定义_qq_40691316的博客-程序员秘密

介绍eSIM概念eSIM卡,即Embedded-SIM,嵌入式SIM卡。eSIM卡的概念就是将传统SIM卡直接嵌入到设备芯片上,而不是作为独立的可移除零部件加入设备中,用户无需插入物理SIM卡,如同早年的小灵通。这一做法将允许用户更加灵活的选择运营商套餐,或者在无需解锁设备、购买新设备的前提下随时更换运营商。未来通用的eSIM标准建立将为普通消费者、企业用户节省更多移动设备使用成本,并带...

linux 后台运行程序 查看运行输出_Camilla77的博客-程序员秘密

1、 Linux下从一个终端获取另一个终端正在运行的程序的输出内容的方法:reptyr &lt;PID&gt;具体安装:使用reptyrUbuntu下,直接sudo apt-get install reptyr安装即可使用方法就是reptyr &lt;PID&gt;比如你需要获取的程序PID为7191,那么需要执行的命令就是reptyr 7191如果出现这种情况[-] ...

随便推点

Day41.Java比较器.Comparable自然排序、Comparator定制排序 -Java常用类#、集合、IO_阿昌喜欢吃黄桃的博客-程序员秘密

Java比较器在Java中经常会设计到对象数组的排序问题,那么就设计到对象之间的比较问题。Java实现对象排序的方法有两种:方式一: 自然排序: java.lang.Comparable方式二: 定制排序: java.util.Comparator自然排序: Comparable/* 一.说明: Java中的对象,正常情况下,只能进行比较: == 或 != 。不能使用 &gt; 或 &lt; 的 但是在开发场景中,我们需要对多个对象进行排序,言外之

试题库问题 网络流24题_乌鸡哈拉王的博客-程序员秘密

«问题描述:假设一个试题库中有n道试题。每道试题都标明了所属类别。同一道题可能有多个类别属性。现要从题库中抽取m 道题组成试卷。并要求试卷包含指定类型的试题。试设计一个满足要求的组卷算法。«编程任务:对于给定的组卷要求,计算满足要求的组卷方案。输入输出格式输入格式:第1行有2个正整数k和n (2 &amp;lt;=k&amp;lt;= 20, k&amp;lt;=n&amp;lt;= 1000)k 表示题库中试题类型总数,n 表...

C#使用itextsharp生成PDF文件含页脚页眉_itextsharp页眉页脚_牛奶咖啡13的博客-程序员秘密

一、引用itextsharp库文件下载链接为:https://download.csdn.net/download/xiaochenxihua/11014068二、编写生成PDF的基础页面框架生成脚本/**** Title:&quot;智慧工厂&quot; 项目* 主题:PDF基础设置* Description:* 功能:XXX* Date:2018* Version:1.2版本* A...

负载均衡_weixin_33857230的博客-程序员秘密

为什么80%的码农都做不了架构师?&gt;&gt;&gt; ...

SLB/ULB等负载均衡器+nginx完美结合_hu_wenjie的博客-程序员秘密

    相信很多同行都使用阿里云产品或者其它的云产品ucloud之类的负载均衡器,但是这些负载均衡器有个问题是对外一个公网IP,负载的模式是根据前端端口监听然后后端配置多台服务器实现负载功能,但是很多网站的域名地址都希望使用默认80端口即不带端口号访问,那么问题来了,一个负载均衡器只能监听一个80端口,所以我们可以在后端部署nginx集群,前端使用80端口    这样就可以快乐的在nginx完美的...

Gerrit+apache安装_https://lxb.wiki的博客-程序员秘密

使用gerrit自带的数据库h2, 验证方式为HTTP, SMTP 服务器未配置git 安装可直接从yum 源安装gerrit 安装先添加gerrit 用户. gerrit 从2.10开始, 换成了新版界面. 几乎国内所有的镜像都会下载失败, 需要翻墙下载. 下载完成后, 初始化命令为: java -jar gerrrit-war init -d /home/gerr...

推荐文章

热门文章

相关标签