SQL server 2005 切换分区表

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介: 如转载,请注明出处:http://blog.csdn.net/robinson_0612/archive/2009/11/10/4794371.aspx     SQL server 2005 切换分区表 在日常工作中经常需要用到分区表切换的问题,笔者在此列出几种常见的分区表切换的问题,供参考。

如转载,请注明出处: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

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
7月前
|
SQL IDE Java
Java连接SQL Server数据库的详细操作流程
Java连接SQL Server数据库的详细操作流程
|
4月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
6月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
142 13
|
6月前
|
SQL
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。
|
6月前
|
SQL 存储 网络安全
关系数据库SQLserver 安装 SQL Server
【7月更文挑战第26天】
77 6
|
6月前
|
存储 SQL C++
对比 SQL Server中的VARCHAR(max) 与VARCHAR(n) 数据类型
【7月更文挑战7天】SQL Server 中的 VARCHAR(max) vs VARCHAR(n): - VARCHAR(n) 存储最多 n 个字符(1-8000),适合短文本。 - VARCHAR(max) 可存储约 21 亿个字符,适合大量文本。 - VARCHAR(n) 在处理小数据时性能更好,空间固定。 - VARCHAR(max) 对于大文本更合适,但可能影响性能。 - 选择取决于数据长度预期和业务需求。
487 1
|
6月前
|
SQL Oracle 关系型数据库
MySQL、SQL Server和Oracle数据库安装部署教程
数据库的安装部署教程因不同的数据库管理系统(DBMS)而异,以下将以MySQL、SQL Server和Oracle为例,分别概述其安装部署的基本步骤。请注意,由于软件版本和操作系统的不同,具体步骤可能会有所变化。
427 3
|
5月前
|
SQL 安全 Java
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
556 0
|
6月前
|
SQL 存储 安全
数据库数据恢复—SQL Server数据库出现逻辑错误的数据恢复案例
SQL Server数据库数据恢复环境: 某品牌服务器存储中有两组raid5磁盘阵列。操作系统层面跑着SQL Server数据库,SQL Server数据库存放在D盘分区中。 SQL Server数据库故障: 存放SQL Server数据库的D盘分区容量不足,管理员在E盘中生成了一个.ndf的文件并且将数据库路径指向E盘继续使用。数据库继续运行一段时间后出现故障并报错,连接失效,SqlServer数据库无法附加查询。管理员多次尝试恢复数据库数据但是没有成功。
|
6月前
|
SQL 存储 关系型数据库
关系型数据库SQL Server学习
【7月更文挑战第4天】
91 2