Sql Server 分区演练

代码加注释,希望对初学者有用。

USE [master]
GO
if exists (select * from sys.databases where name = 'Test_1')
drop database Test_1
GO
--创建新库,要演练分区所以我们会多创建两个文件组Test_A,Test_B,以便在后面的分区方案中使用。
CREATE DATABASE [Test_1] ON  PRIMARY 
( NAME 
= N'test_1', FILENAME = N'D:\sqldata\test_1.mdf' , SIZE = 10240KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ),
 FILEGROUP 
[test_A] 
( NAME 
= N'Test_A', FILENAME = N'D:\sqldata\test_A.ndf' , SIZE = 1024KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ),
FILEGROUP 
[test_B] 
( NAME 
= N'Test_B', FILENAME = N'D:\sqldata\test_B.ndf' , SIZE = 1024KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
 
LOG ON 
( NAME 
= N'Test_log', FILENAME = N'D:\sqldata\Test_log.ldf' , SIZE = 7616KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
 COLLATE Chinese_PRC_CI_AS
GO
USE [Test_1]
GO
--若分区函数存在则先drop掉
IF  EXISTS (SELECT * FROM sys.partition_functions WHERE name = N'test_partition')
DROP PARTITION FUNCTION [test_partition]
GO
/*创建分区函数给后面的分区方案使用,分区函数很简单就是指定一个范围确定在某个值为什么的时候放在那个分区上*/
--新建一个简单的分区函数,该函数以1000为界分两个区
create partition function test_partition(int)
AS
RANGE 
LEFT FOR VALUES (1000
go
/*看分区方案是否存在,若存在先drop掉*/
IF  EXISTS (SELECT * FROM sys.partition_schemes WHERE name = N'test_scheme')
DROP PARTITION SCHEME test_scheme
GO
--创建分区方案,分区方案需要指定一个分区函数,并指定在分区函数中分的区需要放在哪一个文件组上
create partition scheme test_scheme 
AS 
PARTITION 
[test_partition] TO (test_A,test_B)
GO
--创建分区表
if object_id('student','U'is not null
drop table student;
go
create table student
(
    id 
int identity(1,1not null,
    name 
varchar(10not null,
    class 
int not null,
    grade 
int
on test_scheme(class) --在此处指定该表要使用的分区方案,并将指定分区依据列
go
--随便插入几条数据
insert into student values ('AQU',10,100); -- 这条数据在A分区上
insert into student values ('AQU_边界',1000,89); -- 这边数据也在A分区上是个边界,因为我们上面在函数中指定的是RANGE LEFT,所以1000在A分区上
insert into student values ('BQU',1001,90); -- 这一条肯定是在B分区上了。

go
--最后看看结果。$partition.分区函数(分区列)可以返回某一行所在的分区序号
select *,分区序号 = $partition.test_partition(class) from student
GO
我的微博地址是:http://weibo.com/yukaizhao 我会把一些技术心得碎片写到微博中,欢迎关注。
posted @ 2008-05-07 11:32 玉开 阅读(3168) 评论(14) 编辑 收藏

 回复 引用 查看   
#1楼2008-05-07 11:54 | wingoo      
有个问题,分区表创建之后,是不是所有原来的curd操作的语句都要变化了?
 回复 引用 查看   
#2楼2008-05-07 11:57 | winzheng      
学习。。。
 回复 引用 查看   
#3楼[楼主]2008-05-07 12:27 | 玉开      
@wingoo
操作语句都不需要变化。

 回复 引用 查看   
#4楼[楼主]2008-05-07 12:29 | 玉开      
分区是为了改善大表大数据量情况下的性能,他对于curd操作来说是透明的。不必考虑
 回复 引用 查看   
#5楼2008-05-07 12:35 | wingoo      
@玉开 知道了,谢谢

 回复 引用   
#6楼2008-05-07 14:23 | sunrisex[未注册用户]
mssql 2000可以吗?
 回复 引用 查看   
#7楼[楼主]2008-05-07 15:12 | 玉开      
@sunrisex
2000不可以分区,只能用户定义一系列的表,例如student_2000,student_2001;然后自己在程序中根据逻辑判断来插入不同表中。

 回复 引用 查看   
#8楼2008-05-07 17:30 | Cheney Shue      
索引能分区吗 ?
 回复 引用 查看   
#9楼[楼主]2008-05-07 17:37 | 玉开      
@Cheney Shue
可以分区,在分区表上最好可以做到索引与分区对齐。

具体请看msdn

 回复 引用 查看   
#10楼2008-11-27 16:03 | ITAres      
不错,跟着你学mssql
 回复 引用 查看   
#11楼[楼主]2008-11-27 16:07 | 玉开      
@ITAres
一起学了

 回复 引用 查看   
#12楼2008-12-02 22:23 | 菩提树下的杨过      
学习了
 回复 引用 查看   
#13楼2010-07-16 11:10 | 軒轅劍      
此文不错,值得推荐!
 回复 引用 查看   
#14楼2011-10-19 10:26 | 海南.胡勇      
很好的文章。
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1186530 5oeDMhijJWA=