SqlServer2005基于已有表创建分区
随着当今数据库的容量越来越快的朝着在大型数据库或超大型数据库的发展,对于数据库中的大
型表以及具有各种访问模式的表的可伸缩性和可管理性运行环境变得尤为重要,
SQL server
从
SQL
server 7.0
的分区视图到
SQL server 2000
中的分区视图中到
SQL server 2005
所使用的分区表,
不断改
善大型表所面临的性能、阻塞、备份空间、时间、运营成本等。当表和索引非常大的时候,通过分区
表的实现,可以将数据分为更小,更易于管理,获得更好的可操作性能。本实验介绍基于已存在的表
来如何创建分区,管理分区。
一、实验目的:对于已经存在的表且不断增大的情况下构建分区表,管理分区表,提高其性能。
二、主要步骤:对于已经存在的表,我们可以采取以下步骤来对其创建分区表
1.
创建分区函数
2.
创建分区架构并关联到分区函数
3.
删除已经存在的聚集索引
4.
基于分区架构重建聚集索引
三、实验环境:
1. windows xp pro (
英文版
) + sp2
2. SQL server 2005 Developer + sp3
3.
实验数据库
Performance,
此数据库参照实验二:
SQL server 2005
高可用性之
----
数据库镜像中的生
成脚本生成数据库,本实验对其数据库的存放做了调整,将数据和日志文件存放在
D:\SQL_Data\Performance
目录下。
4.
对已存在要创建的分区表为:
Performance
数据库下的
Orders
表
.
5.
对
Orders
表中的
orderdate
列按年进行水平分区
四、具体试验步骤:
1.
创建分区函数
确定分区的数目及分区的列,
列的数据类型。
本例将
Orders
表的
orderdate
按年份水平分五个区,
则需要定义四个边界点值。如下,
use Performance;
go
Create partition function
Part_func_orders(datetime) as
range left
for values('20021231 23:59:59.997',
'20031231 23:59:59.997',
'20041231 23:59:59.997',
'20051231 23:59:59.997');
go
--
或者使用
range right
来创建分区函数
Create partition function
Part_func_orders(datetime) as
range right
for values('20030101 00:00:00.000',
'20040101 00:00:00.000',
'20050101 00:00:00.000',
'20060101 00:00:00.000');
go
/*
分区值的表示范围
(
使用
range left)
–
infinity < x1 <= 20021231
20030101 < x2 <= 20031231
20040101 < x3 <= 20041231
20050101 < x4 <= 20051231
20060101 < x5 <= +infinity
infinity
本应当为
20020101
或
20061231
,此处仅用于说明表示范围
----------------------------------------------------------
分区值的表示范围
(
使用
range right)
–
infinity < x1 < 20030101
20030101 <= x2 < 20040101
20040101 <= x3 < 20050101
20050101 <= x4 < 20060101
20060101 <= x5 < +infinity
通过以上分析表明当
range
中使用
left
时,分区的范围右边为小于等于
values
所指定的值,
当
range
中使用
right
时,分区范围左边为大于等于
values
所指定的值。
规律:在使用
LEFT
分区函数时,第一个值将作为第一个分区中的上边界。在使用
RIGHT
分区函
数时,第一个值将作为第二个分区的下边界
*/
2.
添加文件组和文件
针对所创建的分区来创建文件组和文件,
我们可以创建五个文件组,
五个不同的
ndf
文件来存放
不同年份的
orders
,可以放置于不同的磁盘来减少
I/O
的开销,也可以在一个文件组中创建多个文件
来存放不同年份的
orders,
本例创建了四个文件组,其中有一年的
orders
放置到了
Primary
组中。
alter database Performance
add filegroup [FG1];
go
alter database Performance
add filegroup [FG2];
go
alter database Performance
add filegroup [FG3];
go
alter database Performance
add filegroup [FG4];
go
alter database Performance
add file
(name = FG1_data,filename = 'D:\SQL_Data\Performance\FG1_data.ndf',size = 3MB)
to filegroup [FG1];
alter database Performance
add file
(name = FG2_data,filename = 'D:\SQL_Data\Performance\FG2_data.ndf',size = 3MB)
to filegroup [FG2];
alter database Performance
add file
(name = FG3_data,filename = 'D:\SQL_Data\Performance\FG3_data.ndf',size = 3MB)
to filegroup [FG3];
alter database Performance
add file
(name = FG4_data,filename = 'D:\SQL_Data\Performance\FG4_data.ndf',size = 3MB)
to filegroup [FG4];
go
3.
创建分区架构并关联到分区函数
Create partition scheme Part_func_orders_scheme
as partition Part_func_orders
to ([FG1],[FG2],[FG3],[FG4],[Primary]);
go
4.
重建索引
(删除聚集索引以及需要分区字段的索引后重建该类索引,
表被按分区值将分配到各文
件组)
EXEC sp_helpindex N'orders' --
查看
orders
中使用的索引
drop index idx_cl_od
on orders;
go
create clustered index idx_cl_od
on orders(orderdate)
on Part_func_orders_scheme(orderdate);
go
5.
查看分区的相关情况
--
查看分区及分区范围的情况
select * from sys.partitions where object_id = object_id('orders');
select * from sys.partition_range_values;
--
查看分区架构情况
select * from sys.partition_schemes;
--
查看某一特定分区列值属于哪个分区
select Performance.$partition.Part_func_orders('20050325') as partition_num;
--
查看某一特定分区的记录
select * from orders where Performance.$partition.Part_func_orders(orderdate) = 2
--
查看各分区所包含的记录数
select $partition.Part_func_orders(orderdate) as partition_num,
count(*) as record_num
from orders
group by $partition.Part_func_orders(orderdate)
order by $partition.Part_func_orders(orderdate);
6.
分区的管理
--
增加分区值
,
增加分区之前应先增加或设置新分区使用的文件组
alter database Performance
add filegroup [FG5];
go
alter database Performance
add file
(name = FG5_data,filename = 'D:\SQL_Data\Performance\FG5_data.ndf',size = 3MB )
to filegroup [FG5];
go
alter partition scheme Part_func_orders_scheme
next used [FG5];
go
alter partition function Part_func_orders()
split range('20061231 23:59:59.997')
go
insert into orders
select 10000001,'C0000012906',213,'I','20070101','a'
union all select 10000002,'C0000019995',213,'I','20070109','a'
union all select 10000003,'C0000019996',410,'I','20070512','a';
go
select * from orders where Performance.$partition.Part_func_orders(orderdate) = 6
--
合并分区
--
合并分区后,以下将新增的三条记录放到了第
5
个分区中
alter partition function Part_func_orders()
merge range('20061231 23:59:59.997');
go
SqlServer2005基于已有表创建分区的更多相关文章
- NumPy 基于已有数据创建数组
原文:Python Numpy 教程 章节 Numpy 介绍 Numpy 安装 NumPy ndarray NumPy 数据类型 NumPy 数组创建 NumPy 基于已有数据创建数组 NumPy 基 ...
- oracle数据表创建分区与查询
场景: 遇到1亿数据量的数据需要根据用户名做些数据统计分析,想直接做些聚合计算基本没可能,于是打算先根据日期按照年月创建分区,然后对各个分区分别进行统计,最后汇总结果. 有两种方法,分别是手工设置分区 ...
- linux下如何基于已有容器创建image并运行?
1. 通过docker ps命令先找到容器id,示例如下,123456789012就是我们要找的 jello@~$ docker ps CONTAINER ID IMAGE COMMAND CREAT ...
- 分析Hive表和分区的统计信息(Statistics)
类似于Oracle的分析表,Hive中也提供了分析表和分区的功能,通过自动和手动分析Hive表,将Hive表的一些统计信息存储到元数据中. 表和分区的统计信息主要包括:行数.文件数.原始数据大小.所占 ...
- 为已有表快速创建自动分区和Long类型like 的方法-Oracle 11G
对上一篇文章进行实际的运用.在工作中遇到有一张大表(五千万条数据),在开始的时候忘记了创建自动分区,导致现在使用非常不方便,查询的速度非常的满,所以就准备重新的分区表,最原始方法是先创建新的分区表,然 ...
- MySQL 已有大数据量表进行分区踩坑
一.背景mysql 表中已有 4 亿数据,为提高查询效率,需创建分区,一开始计划是创建 HASH 分区,结果报错:ERROR 1659 (HY000): Field 'partno' is of a ...
- SQL 已有数据的表创建标识列
针对已有数据的表创建标识列: ,) constraint FID_1 primary key(FID)
- oracle创建表之前判断表是否存在,如果存在则删除已有表
Mysql 创建表之前判断表是否存在,如果存在则删除已有表 DROP TABLE IF EXISTS sys_area; CREATE TABLE sys_area ( id int NOT NULL ...
- Docker 基于已有镜像的容器创建镜像
Docker 基于已有镜像的容器创建镜像: docker:/root# docker run -it januswel/centos /bin/bash docker exec -it januswe ...
随机推荐
- 论文阅读之 A Convex Optimization Framework for Active Learning
A Convex Optimization Framework for Active Learning Active learning is the problem of progressively ...
- -bash: crontab: command not found(转)
操作步骤 1. 确认crontab是否安装: 执行 crontab 命令如果报 command not found,就表明没有安装 2. 安装 crontab 执行 yum install -y vi ...
- 动态链接库中函数的地址确定---PLT和GOT [转]
前面写过动态链接库 延迟绑定的一篇博文,那篇文章我非常喜欢,但是当时刚搞清楚,自己写的比较凌乱,我最近学习了Ulrich Drepper的How to write share library,学习了几 ...
- 关于CPU Cache -- 程序猿需要知道的那些事
本文将介绍一些作为程序猿或者IT从业者应该知道的CPU Cache相关的知识 文章欢迎转载,但转载时请保留本段文字,并置于文章的顶部 作者:卢钧轶(cenalulu) 本文原文地址:http://ce ...
- linux重启和关闭系统命令
重启命令: 1.reboot 2.shutdown -r now 立刻重启(root用户使用) 3.shutdown -r 10 过10分钟自动重启(root用户使用) 4.shutdown -r 2 ...
- 使用seajs来引入js代码
注意的是:引入jquery的代码最好放在html文件中,本文是为了说明seajs中require如何使用的,才将jquery放入seajs中的. html中对应的代码: <script type ...
- Measuring the amount of writes in InnoDB redo logs
Choosing a good InnoDB log file size is key to InnoDB write performance. This can be done by measuri ...
- jQuery插件 -- 表单验证插件jquery.validate.js, jquery.metadata.js
原文地址:http://blog.csdn.net/zzq58157383/article/details/7718352 最常使用JavaScript的场合就是表单的验证,而jQuery作为一个 ...
- 【转载】写runat="server"有什么用
aspx运行时会被编译,其中没有runat="server"属性的html标签会被直接写入response,有runat="server"属性的html标签会转 ...
- xml学习笔记一(概述)
XML 被设计用来传输和存储数据. HTML 被设计用来显示数据. 什么是 XML? XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 ...