SQL Server 分区表补充说明

分区教程参阅:http://database.9sssd.com/mssql/art/951

切换分区(归档):http://technet.microsoft.com/zh-cn/library/ms191160(v=sql.105).aspx

?

补充:

  1. 数据更新时,会根据分区依据,数据在文件组间移动
  2. 归档时,外键约束将阻止归档(同文件组的不同表间归档)

?

理想方案:正常分区,定期结转

?

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

时间: 2024-10-31 13:37:45

SQL Server 分区表补充说明的相关文章

SQL Server ->> 分区表上创建唯一分区索引

今天在读<Oracle高级SQL编程>这本书的时候,在关于Oracle的全局索引的章节里面有一段讲到如果对一张分区表创建一条唯一索引,而索引本身也是分区的,那就必须把分区列也加入到索引列表中去,当然不一定要再第一列.后来自己就去SQL Server上也试了一下.果真和Oracle一样的道理.再看到后面章节算是理解了.因为如果表被分区了,其实就是每个分区等于一个索引树了.这也就是为什么在SQL Server下这张sys.partitions系统视图中每个partition对应了一个hobt_id

SQL SERVER 分区表

由于中途浏览器挂掉,不想重写,贴代码算了 1 USE master 2 GO 3 4 -------------------创建数据库与分区文件组-------------------------------------- 5 /****************************************************************************** 6 Create Database test1 ON Primary 7 ( 8 name = N'test1'

SQL Server 分区表的创建方法与管理

背景知识: 分区表.可以把表中的数据按范围保存到不同的文件组中. 举个例子吧: 2014年以前的数据保存到文件组A 2014~2015的数据保存到文件组B 2015年以后的数据保存到文件组C 好处: 1.提高IO性能 --- 文件组中的文件可以位于不同的磁盘,多磁盘协同工作,提升性能. 2.方便管理 --- 备份方面为管理提供了更多的选择,数据归档方便. 前期准备:添加文件组与文件 alter database Studio             add filegroup FG1;     

SQL Server数据库进阶之表分区实战演练

一.课程介绍 1.1.需求背景 假设,你有一个销售记录表,记录着每个销售情况,那么你就可以把这个销售记录表按时间分成几个小表,例如说5个小表吧.2009年以前的记录使用一个表,2010年的记录使用一个表,2011年的记录使用一个表,2012年的记录使用一个表,2012年以后的记录使用一个表.那么,你想查询哪个年份的记录,就可以去相对应的表里查询,由于每个表中的记录数少了,查询起来时间自然也会减少.但将一个大表分成几个小表的处理方式,会给程序员增加编程上的难度.以添加记录为例,以上5个表是独立的5

SQL Server 2005中的分区表(六):将已分区表转换成普通表

在前面,我们介绍过怎么样直接创建一个分区表,也介绍过怎么将一个普通表转换成一个分区表.那么,这两种方式创建的表有什么区别呢?现在,我又最新地创建了两个表: 第一个表名为Sale,这个表使用的是<SQL Server 2005中的分区表(一):什么是分区表?为什么要用分区表?如何创建分区表?>中的方法创建的,在创建完之后,还为该表添加了一个主键. 第二个表名Sale1,这个表使用的是<SQL Server 2005中的分区表(三):将普通表转换成分区表>中的方法创建的,也就是先创建了

关于SQL Server中分区表的文件与文件组的删除(转)

在SQL Server中对表进行分区管理时,必定涉及到文件与文件组,关于文件与文件组如何创建在网上资料很多,我博客里也有两篇相关转载文件,可以看看,我这就不再细述,这里主要讲几个一般网上很少讲到的东西,但有时候却很重要. 前面内容主要摘自SQL的联机帮助: 1.一个文件或文件组不能由多个数据库使用.例如,任何其他数据库都不能使用包含 sales 数据库中的数据和对象的文件 sales.mdf 和 sales.ndf. 2.一个文件只能是一个文件组的成员. 3.一个文件组可以包含多个文件,一个数据

SQL Server 2005中的分区表(四):删除(合并)一个分区

在前面我们介绍过如何创建和使用一个分区表,并举了一个例子,将不 同年份的数据放在不同的物理分区表里.具体的分区方式为: 第1个小表:2010-1-1以前的数据(不包含2010-1-1). 第2个小表:2010-1-1(包含2010-1-1)到2010-12-31之间的数据. 第3个小表:2011-1-1(包含2011-1-1)到2011-12-31之间的数据. 第4个小表:2012-1-1(包含2012-1-1)到2012-12-31之间的数据. 第5个小表:2013-1-1(包含2013-1-

SQL Server 2005中的分区表(一):什么是分区表?为什么要用分区表?如何创建分区表?(转)

如果你的数据库中某一个表中的数据满足以下几个条件,那么你就要考虑创建分区表了. 1.数据库中某个表中的数据很多.很多是什么概念?一万条?两万条?还是十万条.一百万条?这个,我觉得是仁者见仁.智者见智的问题.当然数据表中的数据多到查询时明显感觉到数据很慢了,那么,你就可以考虑使用分区表了.如果非要我说一个数值的话,我认为是100万条. 2.但是,数据多了并不是创建分区表的惟一条件,哪怕你有一千万条记录,但是这一千万条记录都是常用的记录,那么最好也不要使用分区表,说不定会得不偿失.只有你的数据是分段

SQL Server 2005中的分区表(五):添加一个分区(转)

所谓天下大事,分久必合,合久必分,对于分区表而言也一样.前面我们介绍过如何删除(合并)分区表中的一个分区,下面我们介绍一下如何为分区表添加一个分区. 为分区表添加一个分区,这种情况是时常会 发生的.比如,最初在数据库设计时,只预计了存放3年的数据,可是到了第4天怎么办?这样的话,我们就可以为分区表添加一个分区,让它把新的数据放在新的分区里.再比如,最初设计时,一个分区用于存放一年的数据,结果在使用的时候才发现,一年的数据太多,想将一个分区中的数据分为两个分区来存放. 遇到这种情况,就必须要为分区