SQL 2005 分区表的创建方法
来源:互联网 发布:淘宝账号如何快速升心 编辑:程序博客网 时间:2024/06/08 03:44
USE [master]
IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'DEMO')
DROP DATABASE [DEMO]
CREATE DATABASE [DEMO]
ALTER DATABASE Demo ADD FILEGROUP fg_CLRQ_1;
ALTER DATABASE Demo ADD FILEGROUP fg_CLRQ_2;
ALTER DATABASE Demo ADD FILEGROUP fg_CLRQ_3;
ALTER DATABASE Demo ADD FILEGROUP fg_CLRQ_4;
ALTER DATABASE Demo ADD FILEGROUP fg_CLRQ_5;
ALTER DATABASE Demo ADD FILEGROUP fg_CLRQ_6;
ALTER DATABASE Demo ADD FILEGROUP fg_CLRQ_7;
-- 下面为这些文件组添加文件来进行物理的数据存储
ALTER DATABASE Demo ADD FILE (NAME = 'f_CLRQ_1', FILENAME = 'C:/file1.NDF') TO FILEGROUP fg_CLRQ_1;
ALTER DATABASE Demo ADD FILE (NAME = 'f_CLRQ_2', FILENAME = 'C:/file2.NDF') TO FILEGROUP fg_CLRQ_2;
ALTER DATABASE Demo ADD FILE (NAME = 'f_CLRQ_3', FILENAME = 'C:/file3.NDF') TO FILEGROUP fg_CLRQ_3;
ALTER DATABASE Demo ADD FILE (NAME = 'f_CLRQ_4', FILENAME = 'C:/file4.NDF') TO FILEGROUP fg_CLRQ_4;
ALTER DATABASE Demo ADD FILE (NAME = 'f_CLRQ_5', FILENAME = 'C:/file5.NDF') TO FILEGROUP fg_CLRQ_5;
ALTER DATABASE Demo ADD FILE (NAME = 'f_CLRQ_6', FILENAME = 'C:/file6.NDF') TO FILEGROUP fg_CLRQ_6;
ALTER DATABASE Demo ADD FILE (NAME = 'f_CLRQ_7', FILENAME = 'C:/file7.NDF') TO FILEGROUP fg_CLRQ_7;
===========================================================
use demo
go
--分区函数(成立日期CLRQ)
CREATE PARTITION FUNCTION fn_CLRQ(datetime)
AS
RANGE LEFT FOR VALUES (
'01/01/2007',
'02/01/2007',
'03/01/2007',
'04/01/2007',
'05/01/2007',
'06/01/2007'
)
-------------------------------------------------------
-- 创建分区架构
-------------------------------------------------------
CREATE PARTITION SCHEME sch_CLRQ
AS PARTITION fn_CLRQ TO (
fg_CLRQ_1,
fg_CLRQ_2,
fg_CLRQ_3,
fg_CLRQ_4,
fg_CLRQ_5,
fg_CLRQ_6,
fg_CLRQ_7
)
-- 创建表,并使用sch_CLRQ架构,按CLRQ字段分区
CREATE TABLE par_History
(
ID INT NOT NULL IDENTITY(1,1),
CLRQ DATETIME NOT NULL
) on sch_CLRQ(CLRQ)
--建立聚集索引,唯一索引必须要与分区健组成符合索引
create unique clustered index IX_ID on par_History(ID,CLRQ)
--插入数据
insert into par_history select clrq from stat.dbo.history
--======================================
-- 现在我们可以看一下我们刚才插入的行都分布在哪个Partition
-- fn_CLRQ 是分区函数
SELECT *, $PARTITION.fn_CLRQ(CLRQ) FROM par_History
--统计一下各分区数据分布情况
SELECT * FROM SYS.PARTITIONS WHERE OBJECT_ID = OBJECT_ID('par_History')
--======================================
--新添加一个文件组
ALTER DATABASE Demo ADD FILEGROUP fg_CLRQ_8
ALTER DATABASE Demo ADD FILE
(NAME = 'f_CLRQ_8', FILENAME = 'C:/File8.NDF') TO FILEGROUP fg_CLRQ_8
--将新组与分区连接上
ALTER PARTITION SCHEME sch_CLRQ NEXT USED fg_CLRQ_8
--新分一个7月份组
--后面的数据会自动的新分开组
ALTER PARTITION FUNCTION fn_CLRQ() SPLIT RANGE ('07/01/2007')
IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'DEMO')
DROP DATABASE [DEMO]
CREATE DATABASE [DEMO]
ALTER DATABASE Demo ADD FILEGROUP fg_CLRQ_1;
ALTER DATABASE Demo ADD FILEGROUP fg_CLRQ_2;
ALTER DATABASE Demo ADD FILEGROUP fg_CLRQ_3;
ALTER DATABASE Demo ADD FILEGROUP fg_CLRQ_4;
ALTER DATABASE Demo ADD FILEGROUP fg_CLRQ_5;
ALTER DATABASE Demo ADD FILEGROUP fg_CLRQ_6;
ALTER DATABASE Demo ADD FILEGROUP fg_CLRQ_7;
-- 下面为这些文件组添加文件来进行物理的数据存储
ALTER DATABASE Demo ADD FILE (NAME = 'f_CLRQ_1', FILENAME = 'C:/file1.NDF') TO FILEGROUP fg_CLRQ_1;
ALTER DATABASE Demo ADD FILE (NAME = 'f_CLRQ_2', FILENAME = 'C:/file2.NDF') TO FILEGROUP fg_CLRQ_2;
ALTER DATABASE Demo ADD FILE (NAME = 'f_CLRQ_3', FILENAME = 'C:/file3.NDF') TO FILEGROUP fg_CLRQ_3;
ALTER DATABASE Demo ADD FILE (NAME = 'f_CLRQ_4', FILENAME = 'C:/file4.NDF') TO FILEGROUP fg_CLRQ_4;
ALTER DATABASE Demo ADD FILE (NAME = 'f_CLRQ_5', FILENAME = 'C:/file5.NDF') TO FILEGROUP fg_CLRQ_5;
ALTER DATABASE Demo ADD FILE (NAME = 'f_CLRQ_6', FILENAME = 'C:/file6.NDF') TO FILEGROUP fg_CLRQ_6;
ALTER DATABASE Demo ADD FILE (NAME = 'f_CLRQ_7', FILENAME = 'C:/file7.NDF') TO FILEGROUP fg_CLRQ_7;
===========================================================
use demo
go
--分区函数(成立日期CLRQ)
CREATE PARTITION FUNCTION fn_CLRQ(datetime)
AS
RANGE LEFT FOR VALUES (
'01/01/2007',
'02/01/2007',
'03/01/2007',
'04/01/2007',
'05/01/2007',
'06/01/2007'
)
-------------------------------------------------------
-- 创建分区架构
-------------------------------------------------------
CREATE PARTITION SCHEME sch_CLRQ
AS PARTITION fn_CLRQ TO (
fg_CLRQ_1,
fg_CLRQ_2,
fg_CLRQ_3,
fg_CLRQ_4,
fg_CLRQ_5,
fg_CLRQ_6,
fg_CLRQ_7
)
-- 创建表,并使用sch_CLRQ架构,按CLRQ字段分区
CREATE TABLE par_History
(
ID INT NOT NULL IDENTITY(1,1),
CLRQ DATETIME NOT NULL
) on sch_CLRQ(CLRQ)
--建立聚集索引,唯一索引必须要与分区健组成符合索引
create unique clustered index IX_ID on par_History(ID,CLRQ)
--插入数据
insert into par_history select clrq from stat.dbo.history
--======================================
-- 现在我们可以看一下我们刚才插入的行都分布在哪个Partition
-- fn_CLRQ 是分区函数
SELECT *, $PARTITION.fn_CLRQ(CLRQ) FROM par_History
--统计一下各分区数据分布情况
SELECT * FROM SYS.PARTITIONS WHERE OBJECT_ID = OBJECT_ID('par_History')
--======================================
--新添加一个文件组
ALTER DATABASE Demo ADD FILEGROUP fg_CLRQ_8
ALTER DATABASE Demo ADD FILE
(NAME = 'f_CLRQ_8', FILENAME = 'C:/File8.NDF') TO FILEGROUP fg_CLRQ_8
--将新组与分区连接上
ALTER PARTITION SCHEME sch_CLRQ NEXT USED fg_CLRQ_8
--新分一个7月份组
--后面的数据会自动的新分开组
ALTER PARTITION FUNCTION fn_CLRQ() SPLIT RANGE ('07/01/2007')
先利用2楼的脚本创建测试环境(注:只用到“建立聚集索引,唯一索引必须要与分区健组成符合索引”那句话以前的脚本),用下面的语句给表插入数据:
insert into par_History select '2006-5-1'
insert into par_History select '2007-1-10'
insert into par_History select '2007-2-10'
insert into par_History select '2007-3-10'
insert into par_History select '2007-4-10'
insert into par_History select '2007-5-10'
insert into par_History select '2007-6-10'
此时执行下面的语句来看看这些数据分别存在什么地方的:
dbcc extentinfo(demo,par_History)
执行结果如下:
/*
file_id page_id pg_alloc ext_size object_id index_id partition_number partition_id iam_chain_type pfs_bytes
----------- ----------- ----------- ----------- ----------- ----------- ---------------- -------------------- -------------------- ------------------
3 8 1 1 2073058421 0 1 72057594038321152 In-row data 0x6100000000000000
4 8 1 1 2073058421 0 2 72057594038386688 In-row data 0x6100000000000000
5 8 1 1 2073058421 0 3 72057594038452224 In-row data 0x6100000000000000
6 8 1 1 2073058421 0 4 72057594038517760 In-row data 0x6100000000000000
7 8 1 1 2073058421 0 5 72057594038583296 In-row data 0x6100000000000000
8 8 1 1 2073058421 0 6 72057594038648832 In-row data 0x6100000000000000
9 8 1 1 2073058421 0 7 72057594038714368 In-row data 0x6100000000000000
(7 行受影响)
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
*/
可以看到数据确实按照分区架构来存储了。
现在,在表的ID列上创建聚集索引,然后在看看数据存在什么地方的:
create clustered index IX_ID on par_History(ID) on [primary]
go
dbcc extentinfo(demo,par_History)
go
执行结果如下:
/*
file_id page_id pg_alloc ext_size object_id index_id partition_number partition_id iam_chain_type pfs_bytes
----------- ----------- ----------- ----------- ----------- ----------- ---------------- -------------------- -------------------- ------------------
1 110 1 1 2073058421 1 1 72057594038779904 In-row data 0x6000000000000000
(1 行受影响)
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
*/
说明数据按照聚集索引来存储了,但分区架构的文件组里还会有数据吗?这个我也暂时不知道,大家来一起讨论。
现在删除刚才的聚集索引,并查看数据的存储情况:
drop index IX_ID on par_History
go
dbcc extentinfo(demo,par_History)
go
结果和刚才一样。
现在,让我们在分区列上创建聚集索引,并查看数据存储情况:
create clustered index Ix_CLRQ
on par_History(CLRQ)
go
dbcc extentinfo(demo,par_History)
go
执行结果如下:
/*
file_id page_id pg_alloc ext_size object_id index_id partition_number partition_id iam_chain_type pfs_bytes
----------- ----------- ----------- ----------- ----------- ----------- ---------------- -------------------- -------------------- ------------------
1 121 1 1 2073058421 1 1 72057594038910976 In-row data 0x6000000000000000
(1 行受影响)
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
*/
可以看到数据并没有象预料的那样进行分区存储,那么要实现分区存储怎么办呢?执行下面的语句即可:
drop index Ix_CLRQ on par_History
go
create clustered index Ix_CLRQ
on par_History(CLRQ)
on sch_CLRQ(CLRQ)--这里把索引创建分区架构上了
go
dbcc extentinfo(demo,par_History)
go
执行结果如下:
/*
file_id page_id pg_alloc ext_size object_id index_id partition_number partition_id iam_chain_type pfs_bytes
----------- ----------- ----------- ----------- ----------- ----------- ---------------- -------------------- -------------------- ------------------
3 17 1 1 2073058421 1 1 72057594039042048 In-row data 0x6000000000000000
4 17 1 1 2073058421 1 2 72057594039107584 In-row data 0x6000000000000000
5 17 1 1 2073058421 1 3 72057594039173120 In-row data 0x6000000000000000
6 17 1 1 2073058421 1 4 72057594039238656 In-row data 0x6000000000000000
7 17 1 1 2073058421 1 5 72057594039304192 In-row data 0x6000000000000000
8 17 1 1 2073058421 1 6 72057594039369728 In-row data 0x6000000000000000
9 17 1 1 2073058421 1 7 72057594039435264 In-row data 0x6000000000000000
(7 行受影响)
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
*/
可以看到数据又按照分区架构存储了。
现在让我们把这个聚集索引给删除,看看数据怎么存储的:
drop index Ix_CLRQ on par_History
go
dbcc extentinfo(demo,par_History)
go
可以发现存储没有变化。
现在创建另一个分区函数和分区架构,如下:
CREATE PARTITION FUNCTION fn_CLRQ1(int)
AS
RANGE LEFT FOR VALUES (
3,
5,
8
)
go
create PARTITION SCHEME sch_CLRQ1
AS PARTITION fn_CLRQ1 TO (
fg_CLRQ_4,
fg_CLRQ_5,
fg_CLRQ_6,
fg_CLRQ_7
)
接下来在这个新的分区架构上创建聚集索引,如下:
create unique clustered index Ix_ID
on par_History(id)
on sch_CLRQ1(ID);
go
dbcc extentinfo(demo,par_History)
go
执行结果如下:
/*
file_id page_id pg_alloc ext_size object_id index_id partition_number partition_id iam_chain_type pfs_bytes
----------- ----------- ----------- ----------- ----------- ----------- ---------------- -------------------- -------------------- ------------------
6 19 1 1 2073058421 1 1 72057594039959552 In-row data 0x6000000000000000
7 19 1 1 2073058421 1 2 72057594040025088 In-row data 0x6000000000000000
8 19 1 1 2073058421 1 3 72057594040090624 In-row data 0x6000000000000000
(3 行受影响)
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
*/
可以看到数据按照新的分区架构存储了,那么以前分区架构里有没有数据,如果有,怎么来查看?大家一起讨论一下。
但此时我们用下面的语句来查看,分别能看到数据分布在哪个文件组上:
SELECT *, $PARTITION.fn_CLRQ1(id) 'ID上的分区',$PARTITION.fn_CLRQ(CLRQ) 'CLRQ上的分区' FROM par_History
go
执行结果如下:
/*
ID CLRQ ID上的分区 CLRQ上的分区
----------- ----------------------- ----------- -----------
1 2006-05-01 00:00:00.000 1 1
2 2007-01-10 00:00:00.000 1 2
3 2007-02-10 00:00:00.000 1 3
4 2007-03-10 00:00:00.000 2 4
5 2007-04-10 00:00:00.000 2 5
6 2007-05-10 00:00:00.000 3 6
7 2007-06-10 00:00:00.000 3 7
(7 行受影响)
*/
insert into par_History select '2006-5-1'
insert into par_History select '2007-1-10'
insert into par_History select '2007-2-10'
insert into par_History select '2007-3-10'
insert into par_History select '2007-4-10'
insert into par_History select '2007-5-10'
insert into par_History select '2007-6-10'
此时执行下面的语句来看看这些数据分别存在什么地方的:
dbcc extentinfo(demo,par_History)
执行结果如下:
/*
file_id page_id pg_alloc ext_size object_id index_id partition_number partition_id iam_chain_type pfs_bytes
----------- ----------- ----------- ----------- ----------- ----------- ---------------- -------------------- -------------------- ------------------
3 8 1 1 2073058421 0 1 72057594038321152 In-row data 0x6100000000000000
4 8 1 1 2073058421 0 2 72057594038386688 In-row data 0x6100000000000000
5 8 1 1 2073058421 0 3 72057594038452224 In-row data 0x6100000000000000
6 8 1 1 2073058421 0 4 72057594038517760 In-row data 0x6100000000000000
7 8 1 1 2073058421 0 5 72057594038583296 In-row data 0x6100000000000000
8 8 1 1 2073058421 0 6 72057594038648832 In-row data 0x6100000000000000
9 8 1 1 2073058421 0 7 72057594038714368 In-row data 0x6100000000000000
(7 行受影响)
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
*/
可以看到数据确实按照分区架构来存储了。
现在,在表的ID列上创建聚集索引,然后在看看数据存在什么地方的:
create clustered index IX_ID on par_History(ID) on [primary]
go
dbcc extentinfo(demo,par_History)
go
执行结果如下:
/*
file_id page_id pg_alloc ext_size object_id index_id partition_number partition_id iam_chain_type pfs_bytes
----------- ----------- ----------- ----------- ----------- ----------- ---------------- -------------------- -------------------- ------------------
1 110 1 1 2073058421 1 1 72057594038779904 In-row data 0x6000000000000000
(1 行受影响)
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
*/
说明数据按照聚集索引来存储了,但分区架构的文件组里还会有数据吗?这个我也暂时不知道,大家来一起讨论。
现在删除刚才的聚集索引,并查看数据的存储情况:
drop index IX_ID on par_History
go
dbcc extentinfo(demo,par_History)
go
结果和刚才一样。
现在,让我们在分区列上创建聚集索引,并查看数据存储情况:
create clustered index Ix_CLRQ
on par_History(CLRQ)
go
dbcc extentinfo(demo,par_History)
go
执行结果如下:
/*
file_id page_id pg_alloc ext_size object_id index_id partition_number partition_id iam_chain_type pfs_bytes
----------- ----------- ----------- ----------- ----------- ----------- ---------------- -------------------- -------------------- ------------------
1 121 1 1 2073058421 1 1 72057594038910976 In-row data 0x6000000000000000
(1 行受影响)
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
*/
可以看到数据并没有象预料的那样进行分区存储,那么要实现分区存储怎么办呢?执行下面的语句即可:
drop index Ix_CLRQ on par_History
go
create clustered index Ix_CLRQ
on par_History(CLRQ)
on sch_CLRQ(CLRQ)--这里把索引创建分区架构上了
go
dbcc extentinfo(demo,par_History)
go
执行结果如下:
/*
file_id page_id pg_alloc ext_size object_id index_id partition_number partition_id iam_chain_type pfs_bytes
----------- ----------- ----------- ----------- ----------- ----------- ---------------- -------------------- -------------------- ------------------
3 17 1 1 2073058421 1 1 72057594039042048 In-row data 0x6000000000000000
4 17 1 1 2073058421 1 2 72057594039107584 In-row data 0x6000000000000000
5 17 1 1 2073058421 1 3 72057594039173120 In-row data 0x6000000000000000
6 17 1 1 2073058421 1 4 72057594039238656 In-row data 0x6000000000000000
7 17 1 1 2073058421 1 5 72057594039304192 In-row data 0x6000000000000000
8 17 1 1 2073058421 1 6 72057594039369728 In-row data 0x6000000000000000
9 17 1 1 2073058421 1 7 72057594039435264 In-row data 0x6000000000000000
(7 行受影响)
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
*/
可以看到数据又按照分区架构存储了。
现在让我们把这个聚集索引给删除,看看数据怎么存储的:
drop index Ix_CLRQ on par_History
go
dbcc extentinfo(demo,par_History)
go
可以发现存储没有变化。
现在创建另一个分区函数和分区架构,如下:
CREATE PARTITION FUNCTION fn_CLRQ1(int)
AS
RANGE LEFT FOR VALUES (
3,
5,
8
)
go
create PARTITION SCHEME sch_CLRQ1
AS PARTITION fn_CLRQ1 TO (
fg_CLRQ_4,
fg_CLRQ_5,
fg_CLRQ_6,
fg_CLRQ_7
)
接下来在这个新的分区架构上创建聚集索引,如下:
create unique clustered index Ix_ID
on par_History(id)
on sch_CLRQ1(ID);
go
dbcc extentinfo(demo,par_History)
go
执行结果如下:
/*
file_id page_id pg_alloc ext_size object_id index_id partition_number partition_id iam_chain_type pfs_bytes
----------- ----------- ----------- ----------- ----------- ----------- ---------------- -------------------- -------------------- ------------------
6 19 1 1 2073058421 1 1 72057594039959552 In-row data 0x6000000000000000
7 19 1 1 2073058421 1 2 72057594040025088 In-row data 0x6000000000000000
8 19 1 1 2073058421 1 3 72057594040090624 In-row data 0x6000000000000000
(3 行受影响)
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
*/
可以看到数据按照新的分区架构存储了,那么以前分区架构里有没有数据,如果有,怎么来查看?大家一起讨论一下。
但此时我们用下面的语句来查看,分别能看到数据分布在哪个文件组上:
SELECT *, $PARTITION.fn_CLRQ1(id) 'ID上的分区',$PARTITION.fn_CLRQ(CLRQ) 'CLRQ上的分区' FROM par_History
go
执行结果如下:
/*
ID CLRQ ID上的分区 CLRQ上的分区
----------- ----------------------- ----------- -----------
1 2006-05-01 00:00:00.000 1 1
2 2007-01-10 00:00:00.000 1 2
3 2007-02-10 00:00:00.000 1 3
4 2007-03-10 00:00:00.000 2 4
5 2007-04-10 00:00:00.000 2 5
6 2007-05-10 00:00:00.000 3 6
7 2007-06-10 00:00:00.000 3 7
(7 行受影响)
*/
- SQL 2005 分区表的创建方法
- SQL Server 2005 创建分区表
- SQL Server 2005中的分区表(一):什么是分区表?为什么要用分区表?如何创建分区表?
- SQL Server 2005中的分区表(一):什么是分区表?为什么要用分区表?如何创建分区表?
- SQL Server 2005中的分区表(一):什么是分区表?为什么要用分区表?如何创建分区表?
- SQL Server 2005中的分区表(一):什么是分区表?为什么要用分区表?如何创建分区表?
- SQL Server 2005中的分区表(一):什么是分区表?为什么要用分区表?如何创建分区表?
- SQL Server 2005中的分区表(一):什么是分区表?为什么要用分区表?如何创建分区表?
- SQL Server 2005中的分区表(一):什么是分区表?为什么要用分区表?如何创建分区表?
- SQL Server 2005中的分区表(一):什么是分区表?为什么要用分区表?如何创建分区表?
- SQL Server 2005中的分区表(一):什么是分区表?为什么要用分区表?如何创建分区表?
- SQL Server 2005中的分区表(一):什么是分区表?为什么要用分区表?如何创建分区表?
- SQL Server 2005中的分区表(一):什么是分区表?为什么要用分区表?如何创建分区表?
- SQL SERVER 分区表的总结--创建
- SQL Server 2005 如何创建分区表
- SQL Server 2005 如何创建分区表?
- sql创建分区表
- sql创建分区表
- WIN32用户界面设计基础之Menus 篇
- 数据库集群技术(转载)
- wince6.0下调整任务栏和工作区
- C# .net写的程序调用C++.net写的动态库装载失败,原因一句说清
- mysql优化(续)
- SQL 2005 分区表的创建方法
- 正则基础之——贪婪与非贪婪模式(转)
- ATL使用MFC类(转)
- JAVA读取资源文件的N种方法
- 单独编译8139网卡驱动 - 流程详解
- 慈善餐会 giveaway buffet
- 简述微积分的现实意义是什么
- [英语阅读]泰国变性手术新规“三思而后行”
- Oracle 的drop table if exists功能