设为首页 收藏本站
查看: 564|回复: 0

[经验分享] SQL server 2005 切换分区表

[复制链接]

尚未签到

发表于 2016-11-1 07:58:43 | 显示全部楼层 |阅读模式
  如转载,请注明出处:http://blog.csdn.net/robinson_0612/archive/2009/11/10/4794371.aspx
  
  
  SQL server 2005 切换分区表
在日常工作中经常需要用到分区表切换的问题,笔者在此列出几种常见的分区表切换的问题,供参考。
一、分区表的切换无外乎以下三种形式:
1.将一个分区中的数据切换成单个表。
2.将表作为分区切换到已分区的表中。
3.将分区从一个已分区表切换到另一个已分区表。
  
二、切换分区表的主要手段:
ALTER TABLE Table_name SWITCH
[ PARTITION source_partition_number_expression ]
TO [ schema_name. ] target_table [ PARTITION target_ partition_number_expression ]
  三、切换分区时的注意事项:
1.源表为已分区的表,必须创建所需的目标表,目标表可以为单个表(用于分区切换到单个表),也可以为已分区的表(用于分区表之间的切换)。
2.源表和目标表必须位于同一文件组,具有相同的表结构,且它们的大型值列也必须存储于同一文件组,任何对应的索引或索引分区也必须位于同一文件组。
3.无论目标表是已分区表还是普通表,目标表必须为空。
4.对目标表定义了任何 CHECK 约束,则对源表也需要定义这些约束
  传输分区时,能够实现数据的快速切换,因为它并没有物理上移动数据,只是更改了有关数据存储位置的元数据。故在执行 SWITCH 操作之前,从中移出该分区的表(源表)以及接收该分区的表(目标表)都必须存在于数据库中。
  
四、以下演示切换分区使用的数据库和表,使用SQL server 2005自带的数据库AdventureWorks中的Sales.SalesOrderHeader表来创建分区,考虑到该表太多的参照和约束关系,采取应用该表的数据来生成一张新表dbo.Orders,再将dbo.Orders转换为分区表,关于普通表转换为分区表请参照:实验三:SQL server 2005基于已存在的表创建分区。 */
  USE AdventureWorks
GO
CREATE PARTITION FUNCTION Part_func_orders(DATETIME) AS
RANGE RIGHT
FOR VALUES('20020101 00:00:00.000',
'20030101 00:00:00.000',
'20040101 00:00:00.000');
GO
----------------------------------------------------------------
ALTER DATABASE AdventureWorks
ADD FILEGROUP [FG1];
GO
ALTER DATABASE AdventureWorks
ADD FILEGROUP [FG2];
GO
ALTER DATABASE AdventureWorks
ADD FILEGROUP [FG3];
GO
  ALTER DATABASE AdventureWorks
ADD FILE
(NAME = FG1_data,FILENAME = 'C:/Program Files/Microsoft SQL Server/MSSQL.1/MSSQL/Data/FG1_data.ndf',SIZE = 3MB)
TO FILEGROUP [FG1];
ALTER DATABASE AdventureWorks
ADD FILE
(NAME = FG2_data,FILENAME = 'C:/Program Files/Microsoft SQL Server/MSSQL.1/MSSQL/Data/FG2_data.ndf',SIZE = 3MB)
TO FILEGROUP [FG2];
ALTER DATABASE AdventureWorks
ADD FILE
(NAME = FG3_data,FILENAME = 'C:/Program Files/Microsoft SQL Server/MSSQL.1/MSSQL/Data/FG3_data.ndf',SIZE = 3MB)
TO FILEGROUP [FG3];
GO
-------------------------------------------------------------------
  CREATE PARTITION SCHEME Part_func_orders_scheme
AS PARTITION Part_func_orders
TO ([FG1],[FG2],[FG3],[Primary]);
GO
  --------------------------------------------------------------------
IF OBJECT_ID('dbo.Orders') IS NOT NULL
DROP TABLE dbo.Orders;
GO
CREATE TABLE dbo.Orders
(
SalesOrderID INT NOT NULL,
SalesPersonID INT ,
CustomerID INT NOT NULL,
SalesOrderNumber NVARCHAR(25) NOT NULL,
Orderdate DATETIME NOT NULL,
Shipdate DATETIME
)ON Part_func_orders_scheme(Orderdate);
GO
ALTER TABLE dbo.Orders
ADD CONSTRAINT PK_Orders PRIMARY KEY NONCLUSTERED(SalesOrderID,Customerid,Orderdate),
CONSTRAINT FK_Orders_Customer_CustomerID FOREIGN KEY(CustomerID) REFERENCES Sales.Customer(Customerid),
CONSTRAINT FK_Orders_SalesPerson_SalesPersonID FOREIGN KEY(SalesPersonID) REFERENCES Sales.SalesPerson(SalesPersonID);
GO
CREATE CLUSTERED INDEX Idx_Orderdate ON dbo.Orders(Orderdate);
GO

-------------------------------------------------------------------
INSERT INTO dbo.Orders
SELECT SalesOrderID,SalesPersonID,CustomerID,SalesOrderNumber,Orderdate,Shipdate
FROM Sales.SalesOrderHeader

-------------------------------------------------------------------
--查看各分区所包含的记录数
SELECT $PARTITION.Part_func_orders(orderdate) as partition_num,
MIN(orderdate) AS start_time,Max(orderdate) AS end_time,count(*) as count_num
FROM dbo.Orders
GROUP BY $PARTITION.Part_func_orders(orderdate)
ORDER BY $PARTITION.Part_func_orders(orderdate);
GO
  
--四、以下实现对分区的切换操作。
-------------------------------------------------------------------------------
--将一个分区中的数据切换成单个表
--------------------------------------------------------------------------------
USE [AdventureWorks]
GO
/****** Object: Table [dbo].[Orders_2004] Script Date: 11/10/2009 13:55:07 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF OBJECT_ID('dbo.orders_2004') IS NOT NULL
DROP TABLE dbo.orders_2004;
GO
CREATE TABLE [dbo].[Orders_2004](
[SalesOrderID] [int] NOT NULL,
[SalesPersonID] [int] NULL,
[CustomerID] [int] NOT NULL,
[SalesOrderNumber] [nvarchar](25) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[Orderdate] [datetime] NOT NULL,
[Shipdate] [datetime] NULL,
CONSTRAINT [PK_Orders_2004] PRIMARY KEY NONCLUSTERED
(
[SalesOrderID] ASC,
[CustomerID] ASC,
[Orderdate] ASC
)WITH (IGNORE_DUP_KEY = OFF)
);
GO
  ALTER TABLE [dbo].[Orders_2004] WITH CHECK ADD CONSTRAINT [FK_Orders_Customer_CustomerID_2004] FOREIGN KEY([CustomerID])
REFERENCES [Sales].[Customer] ([CustomerID]);
GO
ALTER TABLE [dbo].[Orders_2004] WITH CHECK ADD CONSTRAINT [FK_Orders_SalesPerson_SalesPersonID_2004] FOREIGN KEY([SalesPersonID])
REFERENCES [Sales].[SalesPerson] ([SalesPersonID]);
  --------------------------------------------------------------------------------------------------
CREATE CLUSTERED INDEX Idx_Orderdate_2004 ON dbo.Orders_2004(Orderdate ASC);--创建与源表相同的索引键,否则报错
GO
  ALTER TABLE dbo.Orders SWITCH PARTITION 4 TO dbo.Orders_2004; --切换分区到表
GO
  SELECT * FROM dbo.Orders_2004 --查看刚刚切换过来的数据
SELECT * FROM dbo.orders WHERE $PARTITION.Part_func_orders(orderdate) = 4 --4号分区中已经没有数据了
  
--------------------------------------------------------------------------------
--将表作为分区切换到已分区的表中
--------------------------------------------------------------------------------
ALTER TABLE dbo.Orders_2004 --目标表定义了边界条件,需增加Check 约束
ADD CONSTRAINT CK_Orderdate
CHECK (Orderdate >= '20040101' AND Orderdate < '20050101');
GO
  ALTER TABLE dbo.Orders_2004 SWITCH TO dbo.Orders PARTITION 4;
GO
  -------------------------------------------------------------------------------
--将分区从一个已分区表切换到另一个已分区表
-------------------------------------------------------------------------------
USE AdventureWorks
GO
CREATE PARTITION FUNCTION Part_func_orders_Archive(DATETIME) AS
RANGE RIGHT
FOR VALUES('20020101 00:00:00.000',
'20030101 00:00:00.000',
'20040101 00:00:00.000');
GO
  CREATE PARTITION SCHEME Part_func_orders_Scehme_Archive
AS PARTITION Part_func_orders_Archive
TO ([FG1],[FG2],[FG3],[Primary]);
GO
  -----------------------------------------------------------------------------
IF OBJECT_ID('dbo.Orders_Archive') IS NOT NULL
DROP TABLE dbo.Orders_Archive;
GO
CREATE TABLE dbo.Orders_Archive
(
SalesOrderID INT NOT NULL,
SalesPersonID INT ,
CustomerID INT NOT NULL,
SalesOrderNumber NVARCHAR(25) NOT NULL,
Orderdate DATETIME NOT NULL,
Shipdate DATETIME
)ON Part_func_orders_Scehme_Archive(Orderdate);
GO
ALTER TABLE dbo.Orders_Archive
ADD CONSTRAINT PK_Orders_Archive PRIMARY KEY NONCLUSTERED(SalesOrderID,Customerid,Orderdate),
CONSTRAINT FK_Orders_Customer_CustomerID_Archive FOREIGN KEY(CustomerID) REFERENCES Sales.Customer(Customerid),
CONSTRAINT FK_Orders_SalesPerson_SalesPersonID_Archive FOREIGN KEY(SalesPersonID) REFERENCES Sales.SalesPerson(SalesPersonID);
GO
CREATE CLUSTERED INDEX Idx_Orderdate_Archive ON dbo.Orders_Archive(Orderdate);
GO

------------------------------------------------------------------------------
ALTER TABLE dbo.Orders SWITCH PARTITION 1 TO dbo.Orders_Archive PARTITION 1;
GO
ALTER TABLE dbo.Orders SWITCH PARTITION 2 TO dbo.Orders_Archive PARTITION 2;
GO
ALTER TABLE dbo.Orders SWITCH PARTITION 4 TO dbo.Orders_Archive PARTITION 4;
GO
  -----------------------------------------------------------------------------
--查看切换后的结果
SELECT $PARTITION.Part_func_orders_Archive(Orderdate) AS Partition_num,
MIN(Orderdate),MAX(Orderdate),COUNT(*)
FROM dbo.Orders_Archive
GROUP BY $PARTITION.Part_func_orders_Archive(Orderdate)
ORDER BY $PARTITION.Part_func_orders_Archive(Orderdate);
  
--更多,请参阅:http://msdn.microsoft.com/zh-cn/library/ms345146(SQL.90).aspx

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-294007-1-1.html 上篇帖子: 超级好的Sql Server数据库开发与管理软件--Toad for SQL Server 下篇帖子: sql server 表变量和临时表
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表