转载 :sql server分区 http://blog.itpub.net/27099995/viewspace-1081158/
转载:http://blog.itpub.net/27099995/viewspace-1081158/
在 sql server 2005 之前不提供分区表,但可以用其他方式建立“分区表”,sql server 2005之后提供了分区表,这使得我们在处理超大容量数据库性能方面有了新的选择,通过建立分区表,可以把数据存储在不同的物理硬盘上,在多cpu及多硬盘的服务器上,有效的利用了i/o并行处理,使得不至于存取数据时卡死在某一个物理硬盘上。
建立分区表,主要有三个步骤:
1、创建分区函数以指定如何分区使用该函数的表或索引。
2、创建分区方案以指定分区函数的分区在文件组上的位置。
3、创建使用分区方案的表或索引。
现在以实际的操作
--【添加文件组】
ALTER DATABASE cargobookingdb ADD FILEGROUP [caogo2009]
ALTER DATABASE cargobookingdb ADD FILEGROUP [caogo2010];
ALTER DATABASE cargobookingdb ADD FILEGROUP [caogo2011];
ALTER DATABASE cargobookingdb ADD FILEGROUP [caogo2012];
ALTER DATABASE cargobookingdb ADD FILEGROUP [caogo2013];
ALTER DATABASE cargobookingdb ADD FILEGROUP [caogo2014];
--【添加文件并把其指向指定文件组】
ALTER DATABASE cargobookingdb
ADD FILE
(
NAME = caogo2008,
FILENAME ='E:\sqlserver_data\DW_Data2008.ndf',
SIZE = 1MB,
MAXSIZE = 10MB,
FILEGROWTH = 1MB
)
TO FILEGROUP caogo2008
--【删除文件】
alter database cargobookingdb remove file [caogo2014]
--如果文件不为空时会报错
消息 5042,级别 16,状态 1,第 1 行
无法删除 文件'caogo2014',因为它不为空。
--【修改文件】
ALTER DATABASE cargobookingdb
MODIFY FILE
(
NAME = caogo2014,
SIZE = 2MB
);
--【移动文件】
ALTER DATABASE cargobookingdb
MODIFY FILE
(
NAME = caogo2014,
filename = 'E:\sqlserver_data\DW_Data2014.ndf'
);
---文件 'caogo2014' 在系统目录中已修改。新路径将在数据库下次启动时使用。
二、创建分区函数及分区方案(架构)--此步骤为核心部分
--【创建分区函数】
Create PARTITION FUNCTION PARTCARGODBHISTORY(DATETIME) AS RANGE LEFT FOR VALUES
(
'20090101 23:59:59.997',
'20100101 23:59:59.997',
'20110101 23:59:59.997',
'20120101 23:59:59.997',
'20130101 23:59:59.997',
'20140101 23:59:59.997'
);
--【创建分区方案】
CREATE PARTITION SCHEME [cargodb]
AS
PARTITION PARTCARGODBHISTORY TO
(
[caogo2008],
[caogo2009],
[caogo2010],
[caogo2011],
[caogo2012],
[caogo2013],
[caogo2014]
);
3.--创建分区表,通过分区键值testTime和分区方案[cargodb]结合。
CREATE TABLE test(
[Id] [int] IDENTITY(1,1) NOT NULL, --自动增长
[Name] [varchar](16) NOT NULL,
[testTime] [datetime] NOT NULL,
)
on cargodb (testTime)
三、为表插入数据,查看结果 --这里我们插入100W数据
insert test ([Name],[testTime]) values ('张三','2007-1-1')
insert test ([Name],[testTime]) values ('张三','2008-1-1')
insert test ([Name],[testTime]) values ('李四','2009-12-30')
insert test ([Name],[testTime]) values ('王五','2009-1-1')
insert test ([Name],[testTime]) values ('钱六','2009-4-1')
insert test ([Name],[testTime]) values ('赵七','2010-1-1')
insert test ([Name],[testTime]) values ('张三','2010-6-1')
insert test ([Name],[testTime]) values ('李四','2010-12-30')
insert test ([Name],[testTime]) values ('王五','2011-8-1')
insert test ([Name],[testTime]) values ('钱六','2012-9-1')
insert test ([Name],[testTime]) values ('赵七','2013-1-1')
insert test ([Name],[testTime]) values ('张三','2012-11-1')
insert test ([Name],[testTime]) values ('张三','2012-12-1')
insert test ([Name],[testTime]) values ('李四','2013-12-30')
insert test ([Name],[testTime]) values ('王五','2014-1-1')
insert test ([Name],[testTime]) values ('王五','2014-12-1')
insert test ([Name],[testTime]) values ('王五','2015-12-1')
insert test ([Name],[testTime]) values ('王五','2016-12-1')
--【查看分区信息】
select $PARTITION.PARTCARGODBHISTORY(testTime) as 分区编号,
count(id) as 记录数 ,
MIN(testTime) as 最早,
MAX(testTime) as 最近
from test
group by $PARTITION.PARTCARGODBHISTORY(testTime)
可以看到,有test被分到7个分区,也即被存储在7个物理文件上。
到此,分区表建立完成。
给一个记录大一些的表,两张表都有两百多万条记录。
tab_awb1 --没有分区
tab_awb --按照上面
Set Statistics IO ON
CHECKPOINT
GO
DBCC DROPCLEANBUFFERS
----清楚缓存,效果更明显,但是不建议在生产库中持续,不然有意外产生
select * from tab_awb1 where FlightDate1='2010-10-1'
(1298 行受影响)表 'TBL_AWB1'。扫描计数 5,逻辑读取 158820 次,物理读取 1544 次,预读 157493 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
----用时27秒
再看:
select * from tab_awb where FlightDate1='2010-10-1'
表 'tab_awb'。扫描计数 1,逻辑读取 84 次,物理读取 3 次,预读 81 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
----用时不到1秒
转载 :sql server分区 http://blog.itpub.net/27099995/viewspace-1081158/的更多相关文章
- (一)SQL Server分区详解Partition(目录)
一.SQL Server分区介绍 在SQL Server中,数据库的所有表和索引都视为已分区表和索引,默认这些表和索引值包含一个分区:也就是说表或索引至少包含一个分区.SQL Server中数据是按水 ...
- Sql Server 分区演练 【转】
Sql Server 分区演练 [转] 代码加注释,希望对初学者有用. USE [master]GOif exists (select * from sys.databases where name ...
- (二)SQL Server分区创建过程
虽然分区有很多好处(一)SQL Server分区详解Partition,却不能随意使用:且不说分区管理的繁琐,只是跨分区带来的负面影响就需要我们好好分析是否有必要使用分区.一般分区创建的业务特点:用于 ...
- SQL SERVER分区视图
借助SQL SERVER分区视图,可以对SQL中的表进行集中管理,下文将以实例的方式为您详解SQL SERVER分区视图,希望对您学习SQL数据库能有所帮助. SQL SERVER分区视图给我们提供了 ...
- sql server 分区(上)
分区发展历程 基于表的分区功能为简化分区表的创建和维护过程提供了灵活性和更好的性能.追溯到逻辑分区表和手动分区表的功能. 二.为什么要进行分区 为了改善大型表以及具有各种访问模式的表的可伸缩 ...
- SQL SERVER分区详解(1-5)
转自: (五)SQL Server分区自动化案例 (四)SQL Server分区管理 (三)索引分区知识详解 (二)SQL Server分区创建过程 (一)SQL Se ...
- SQL Server分区键列必须是主键一部分
SQL Server分区键列必须是主键一部分. 必须把分区列包含在主键/唯一约束/唯一索引的键列中. USE tempdb GO -- 测试表 CREATE TABLE dbo.tb( id int, ...
- 转载 SQL Server 2008 R2 事务与隔离级别实例讲解
原文:http://blog.itpub.net/13651903/viewspace-1082730/ 一.事务简介 SQL Server的6个隔离级别中有5个是用于隔离事务的,它们因而被称作事务隔 ...
- SQL SERVER 分区
“索引要与其基表对齐,并不需要与基表参与相同的命名分区函数.但是,索引和基表的分区函数在实质上必须相同,即: 1) 分区函数的参数具有相同的数据类型: 2) 分区函数定义了相同数目的分区: 3) 分区 ...
随机推荐
- andriod 启动日历
Intent intent=new Intent();intent.setComponent(new ComponentName("com.android.calendar", & ...
- PHP版本切换
前言 php是为了快速构建一个web页面而迅速被大家广为接受的开源语言,通过不断发展已经有了很多的php开源系统,满足了目前大部分用户的站点需求.1995年初php诞生到现在已经存在多个版本,并且每个 ...
- Unity3d通用工具类之解压缩文件
今天,我们来写写c#是如何通过代码解压缩文件的. 在游戏的项目中呢,常常我们需要运用到解压缩的技术.比如,当游戏需要更新的时候,我们会从服务器中下载更新的压缩文件包. 这时候我们就需要解压文件,然后覆 ...
- linux面试题目--1
Linux面试题目 填空题1. 在Linux系统中,以 (文件)方式访问设备 .2. Linux内核引导时,从文件/etc/fstab 中读取要加载的文件系统.3. Linux文件系统中每个文件用i节 ...
- static_cast ,reinterpret_cast
用法:static_cast < type-id > ( expression ) 该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性.它主要有 ...
- mysql5.7.x 编译安装
一.卸载mariadb [root@mysql5 ~]# rpm -qa mariadb* mariadb-libs--.el7.centos.x86_64 [root@template tools] ...
- linux中断流程详解
异常体系比较复杂,但是linux已经准备了很多的函数和框架,但是因为中断是和具体的开发板相关,所以中断需要我们自己来处理一些方面,但是这也是很少的一部分,很多公用的处理函数内核已经实现,linux内核 ...
- 解析PHP中如何将数组变量写入文件
在用PHP记录日志,或者是 Ajax 请求出错想要 debug 的时候.我们一般都会将信息写入到一个指定的文件当中.然后根据相应的信息来处理问题.比如笔者最喜欢在用 Ajax 取不到数据的时候,在PH ...
- Mac 快捷键整理(不定期更新)
刚用Mac, 感到有点困难,记录几个快捷键: 1) 在全屏间切换: ctrl + command + F 2)向后删: Fn + delete
- SqlBulkCopy-从 bcp 客户端收到一个对 colid 1 无效的列长度
经过研究,问题是因为tatatable中的colid列1的数据字段长度超过了数据表中定义的字段长度. 解决方法就是将数据库该字段的长度增大问题就解决了.