分区教程参阅: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