SQL Server 分区表补充说明
分区教程参阅:http://database.9sssd.com/mssql/art/951
切换分区(归档):http://technet.microsoft.com/zh-cn/library/ms191160(v=sql.105).aspx
补充:
- 数据更新时,会根据分区依据,数据在文件组间移动
- 归档时,外键约束将阻止归档(同文件组的不同表间归档)
理想方案:正常分区,定期结转
USE [master]
GO
CREATE DATABASE Sales ON PRIMARY
(
NAME=N'Sales',
FILENAME=N'd:\temp\data\Primary\Sales.mdf',
SIZE=3MB,
MAXSIZE=100MB,
FILEGROWTH=10%
), FILEGROUP FG1
(
NAME = N'File1',
FILENAME = N'd:\temp\data\FG1\File1.ndf',
SIZE = 1MB,
MAXSIZE = 100MB,
FILEGROWTH = 10%
), FILEGROUP FG2
(
NAME = N'File2',
FILENAME = N'd:\temp\data\FG2\File2.ndf',
SIZE = 1MB,
MAXSIZE = 100MB,
FILEGROWTH = 10%
), FILEGROUP FG3
(
NAME = N'File3',
FILENAME = N'd:\temp\data\FG3\File3.ndf',
SIZE = 1MB,
MAXSIZE = 100MB,
FILEGROWTH = 10%
) LOG ON
(
NAME = N'Sales_Log',
FILENAME = N'd:\temp\data\Primary\Sales_Log.ldf',
SIZE = 1MB,
MAXSIZE = 100MB,
FILEGROWTH = 10%
)
GO
USE sales
GO
CREATE PARTITION FUNCTION pf_OrderDate (DATETIME)
AS RANGE RIGHT
FOR VALUES ('2003/01/01', '2004/01/01')
GO
CREATE PARTITION SCHEME ps_OrderDate
AS PARTITION pf_OrderDate
TO(FG1,FG2,FG3)
GO
CREATE TABLE Orders
(
OrderID INT IDENTITY(10000, 1) ,
OrderDate DATETIME NOT NULL ,
CustomerID INT NOT NULL ,
CONSTRAINT PK_Orders PRIMARY KEY ( OrderID, OrderDate )
)
ON ps_OrderDate(OrderDate)
GO
CREATE TABLE OrdersHistory
(
OrderID INT IDENTITY(10000, 1) ,
OrderDate DATETIME NOT NULL ,
CustomerID INT NOT NULL ,
CONSTRAINT PK_OrdersHistory PRIMARY KEY ( OrderID, OrderDate )
)
ON ps_OrderDate(OrderDate)
GO
INSERT INTO dbo.Orders
( OrderDate, CustomerID )
VALUES ( '2002/6/25', 1000 )
INSERT INTO dbo.Orders
( OrderDate, CustomerID )
VALUES ( '2002/8/13', 1000 )
INSERT INTO dbo.Orders
( OrderDate, CustomerID )
VALUES ( '2002/8/25', 1000 )
INSERT INTO dbo.Orders
( OrderDate, CustomerID )
VALUES ( '2002/9/23', 1000 )
GO
INSERT INTO dbo.Orders
( OrderDate, CustomerID )
VALUES ( '2003/6/25', 1000 )
INSERT INTO dbo.Orders
( OrderDate, CustomerID )
VALUES ( '2003/8/13', 1000 )
INSERT INTO dbo.Orders
( OrderDate, CustomerID )
VALUES ( '2003/8/25', 1000 )
INSERT INTO dbo.Orders
( OrderDate, CustomerID )
VALUES ( '2003/9/23', 1000 )
GO
SELECT *
FROM dbo.Orders
WHERE $partition.pf_orderdate(orderdate) = 1
SELECT *
FROM dbo.Orders
PRINT N'数据更新后,分区变化'
UPDATE dbo.Orders
SET OrderDate = '2004-9-8'
WHERE OrderID = 10000
SELECT *
FROM dbo.Orders
WHERE $partition.pf_orderdate(orderdate) = 1
SELECT *
FROM dbo.Orders
PRINT N'数据归档,外键阻止归档'
CREATE TABLE Customer ( id INT PRIMARY KEY )
INSERT INTO customer
VALUES ( 1000 )
ALTER TABLE orders ADD CONSTRAINT fk_orders_customer FOREIGN KEY (customerid) REFERENCES Customer (id)
CREATE TABLE order_detail
(
id INT ,
ORDERid INT ,
order_date DATETIME ,
CONSTRAINT PK_Orders_detail PRIMARY KEY ( ORDERid, Order_Date ) ,
CONSTRAINT fk_order FOREIGN KEY ( ORDERid, order_date ) REFERENCES dbo.Orders ( OrderID, OrderDate )
)
INSERT INTO order_detail
VALUES ( 1, 10000, '2004/9/8' )
ALTER TABLE orders SWITCH PARTITION 2 TO ordersHistory PARTITION 2
GO
/*
消息4967,级别16,状态1,第1 行
ALTER TABLE SWITCH 语句失败。由于源表'Sales.dbo.orders' 包含约束'fk_order' 的主键,因此不允许使用SWITCH。
*/
SELECT *
FROM dbo.Orders
WHERE $partition.pf_orderdate(orderdate) = 1
SELECT *
FROM dbo.Orders
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗