分区表_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

智能推荐

ASP.NET ViewState详解_weixin_30375247的博客-程序员秘密

概述ViewState是一个被误解很深的动物了。我希望通过此文章来澄清人们对 ViewState的一些错误认识。为了达到这个目的,我决定从头到尾详细的描述一下整个ViewState的工作机制,其中我会同时用一些例子说明我文 章中的观点,结论。比如我会用静态控件(declared controls)和动态控件(dynamic controls)两个方面来说明同一个问题。现在有关ViewSta...

使用Airtest完美替代Auto.JS_和autojs差不多的软件_m0_48342140的博客-程序员秘密

最近几年某些引流圈子都是在用auto.js来编写一些所谓的私域流量脚本, 但是autojs有自身的缺点, 比如需要购买授权, 最新版本封禁了某些操作等等, 而且语言为javascript, 全异步的写法很容易导致逻辑混乱, 目前看airtest是一个不错的替代一、Airtest 简介:AirtestIDE 是一个跨平台的UI自动化测试编辑器,适用于游戏和App。自动化脚本录制、一键回放、报告查看,轻而易举实现自动化测试流程支持基于图像识别的 Airtest 框架,适用于所有Android和Wi.

类的基本使用方法_伟大的小西西的博客-程序员秘密

#define  _CRT_SECURE_NO_WARNINGS #include &amp;lt;iostream&amp;gt;using namespace std;struct Hero{    char name[64];    int sex;};void printHero(struct Hero &amp;amp;h){    cout &amp;lt;&amp;lt; &quot;name=&quot; &amp;lt;&amp;l...

自动Ping脚本的编写要点_ping脚本怎么写_svnLight的博客-程序员秘密

 因为工作关系,最近需要每天对干线网络进行连通性及时延测试,执行大量的ping命令,还要记住大量的IP地址。于是设计了一个NetTest.cmd命令行脚本。主要过程及代码如下: 第一步:获取本机地址。代码如下::获取本机的IP地址@if exist %TEMPFILE% del %TEMPFILE%@ipconfig | find "IP Address" > %TEM

handler message使用方法Android_hsj-obj的博客-程序员秘密

使用更新UI线程方法; message发生数据,在handler里提取处理,然后更新UI 其中 message发生数据是在子线程里发送的, handler是在主线程里获取到的数据。Handler myhandler=new Handler(){ @Override public void handleMessage(Message msg) {

详细讲解 ascii 、byte 以及 UTF-8、base64 的转码规则_hell8088的博客-程序员秘密

多年来闲麻烦,只记录笔记,不曾编写BLOG,本文为原创,如需转载请标明出处废话不说,直奔主题ascii  ASCII 码的范围是 0-127,即用 7 位二进制数表示&quot;字符&quot;和&quot;符号&quot;,在通过二进制转为电压让计算机识别(计算机不认识你是谁,它只接受 “高”、“低”电压,所以使用二进制  1  和  0 分别代表高低电压)国际标准  0111 1111byte 字节1 byte = 8 bit   ...

随便推点

通信 三元组/五元组_dhwu43996的博客-程序员秘密

几个定义:(1)IP地址:即依照TCP/IP协议分配给本地主机的网络地址,两个进程要通讯,任一进程首先要知道通讯对方的位置,即对方的IP。(2)端口号:用来辨别本地通讯进程,一个本地的进程在通讯时均会占用一个端口号,不同的进程端口号不同,因此在通讯前必须要分配一个没有被访问的端口号。(3)连接:指两个进程间的通讯链路。(4)半相关:网络中用一个三元组可以在全局唯一标志一个进程:(协议,本...

eclipse复制代码连接数据库404_Eclipse下载|Eclipse 4.8.0 官方版_weixin_40000430的博客-程序员秘密

选择这一款软件还是感觉比较靠谱的,毕竟经过了这么多年的用户反馈,在很多方面也解决了刚开始的小BUG,而且看下载量,一直都是比较受到欢迎的软件。相比见同类型的软件,能够看到很多独特的设定。 Eclipse软件特色 1、NLS string hover有一个Open in Properties File动作 2、在Caller模式下,调用层级(Call Hi...

数的机器码表示——彻底弄清什么是原码、反码、补码、移码_数码管机器码_「已注销」的博客-程序员秘密

数的机器码表示文章目录数的机器码表示原码定点整数定点小数原码的计算反码定点整数定点小数反码的运算补码补码的由来定点整数定点小数补码的运算移码移码的表示移码的特点原码、反码、补码、移码为了妥善的处理数据运算过程中符号位的问题,于是就产生了把符号位和数值位一起编码起来表示相应的数的各种表示方法。例如我们熟悉的原码、反码、补码、移码等。通常将未经编码的数称为真值,编码后的数称为机器数或者机器码。...

编译原理实验:词法分析_编译原理实验一 词法分析_Todd222的博客-程序员秘密

编译原理实验:词法分析1. 实验题目:词法分析实验目的实验内容实验要求输入输出2. 设计思想3.算法流程4. 源程序5. 调试数据1. 实验题目:词法分析实验目的根据PL/0语言的文法规范,编写PL/0语言的词法分析程序;或者调研词法分析程序的自动生成工具LEX或FLEX,设计并实现一个能够输出单词序列的词法分析器。通过设计调试词法分析程序,实现从源程序中分出各种单词的方法;加深对课堂教......

Run PrintfFunctionNames example of Clang_weixin_34381666的博客-程序员秘密

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

ZOJ-3609(Modular Inverse )(拓展欧几里得)_henuzxy的博客-程序员秘密

The modular modular multiplicative inverse of an integer a modulo m is an integer x such that a-1≡x (mod m). This is equivalent to ax≡1 (mod m).Input There are multiple test cases. The first line o...

推荐文章

热门文章

相关标签