sql server 小记——分区表(上)
我们知道很多事情都存在一个分治的思想,同样的道理我们也可以用到数据表上,当一个表很大很大的时候,我们就会想到将表拆
分成很多小表,查询的时候就到各个小表去查,最后进行汇总返回给调用方来加速我们的查询速度,当然切分可以使用横向切分,纵向
切分,比如我们最熟悉的订单表,通常会将三个月以外的订单放到历史订单表中,这里的三个月就是将订单表进行切分的依据。
好了,分区表的好处我想大家都很清楚了,下面我们看看如何实现。
一:分区表
这里我们做个例子,创建一个test数据库,表名为shop,以createtime作为分区依据。
1:确定分区依据
怎么分区的话,这个要看具体业务逻辑了,你可以按照时间,地区,求模等等都可以。
2:创建文件组
既然是文件组,肯定是对文件进行分类管理的,默认情况下就一个mdf和ldf文件,当所有的数据都挤压在mdf上,确实不是一个
很好的事情,降低我们的查询速度,当用到文件组的时候就可以创建多个ndf来分摊mdf中的数据,甚至还可以将ndf分摊到几个磁盘
上,充分利用服务器多核处理能力,说了这么多,我们看看sql语句咋搞,这里我创建四个文件组,分别存放2013之前,2013,2014
和2014年之后的数据。
1 alter database Test add filegroup Before2013
2 alter database Test add filegroup T2013
3 alter database Test add filegroup T2014
4 alter database Test add filegroup After2014
3:创建文件
根据上面在文件组上的概述,文件的作用大家都知道了,这里我们要做的是,将次文件.ndf附加到文件组上,因为我创建了4个文件组,
所以我也创建4个文件分别存放在这4个文件组中。
alter database Test add file
(Name=N'Before2013',filename='D:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\Before20131.ndf',size=5mb,maxsize=100Mb,filegrowth=5mb)
to filegroup Before2013
alter database Test add file
(Name=N'T2013',filename='D:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\T20131.ndf',size=5mb,maxsize=100Mb,filegrowth=5mb)
to filegroup T2013
alter database Test add file
(Name=N'T2014',filename='D:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\T20141.ndf',size=5mb,maxsize=100Mb,filegrowth=5mb)
to filegroup T2014
alter database Test add file
(Name=N'After2014',filename='D:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\After20141.ndf',size=5mb,maxsize=100Mb,filegrowth=5mb)
to filegroup After2014
4:编写分区函数
刚才也说了,我们是按照时间进行切分的,将数据表数据分成:
① 2013年之前
② 2013-2014
③ 2014-2015
④ 2015之后
既然都知道依据了,我们分区函数也方便写了。
1 create partition function RangeTime (datetime)
2 as range left for values ('2012-12-31','2013-12-31','2014-12-31')
从上面的sql,我们可以看到三个点将时间轴分成了4段
第一:rangeTime 为分组函数名。
第二:left 其实就是当时间点在边界时到底属于左侧还是右侧,因为这里是left,所以属于左侧,如果是right关键词,那就属于右侧了。
5:编写分区方案
分区方案也就是将分区函数与文件组进行一个关联,刚才也说了,3个时间点将一个时间轴分成了4部分,刚好对应了4个文件组。
那么具体的sql写法如下:
1 create partition scheme RangeSchema_CreateTime
2 as partition RangeTime
3 to (before2013,T2013,T2014,after2014)
6:创建分区表
跟普通表创建有点不一样,分区表的创建还需要指定这个分区需要使用哪个分区方案下的分区字段,那么这里就是RangeSchema_CreateTime
中的CreateTime字段。
1 create table Shop
2 (
3 ID varchar(50),
4 ShopName varchar(50),
5 CreateTime datetime
6 ) on RangeSchema_CreateTime(CreateTime)
这里要注意,如果在创建表的时候指定了ID为主键的话,这个时候需要指定ID为分区字段,否则会报错的。
这时候可以在不要主键的情况下先创建表,然后再指定ID为主键。
7:插入测试数据并统计
这里我先插入10w条数据,然后来看看数据在各个分区的情况。‘
<1>插入数据
<2> 统计每个分区的数据量
这里主要有一个查询分区的关键字“$partition”,非常的有用。
好了,到这个我们通过sql语句来实现分区表就已经完成了。
二:使用管理界面创建分区表
1:首先我们创建test1数据库和shop表
2:创建文件组和文件
3:创建分区
①:右键Shop表,弹出菜单中选择 “存储” => "创建分区"
②:创建“分区函数”名 和 “分区方案”名。
③:创建分区映射,也就是将”分区函数“和“文件组”进行关联。
④: 最后我们可以看一下界面给我生成的分区函数以及分区方案,蛮有意思的。
USE [Test1]
GO
BEGIN TRANSACTION
CREATE PARTITION FUNCTION [MyRangeCreatTime](datetime) AS RANGE LEFT FOR VALUES (N'2012-12-31T00:00:00', N'2013-12-31T00:00:00', N'2014-12-31T00:00:00')CREATE PARTITION SCHEME [MySchemeCreateTime] AS PARTITION [MyRangeCreatTime] TO ([Before2013], [T2013], [T2014], [After2014])ALTER TABLE [dbo].[Shop] DROP CONSTRAINT [PK__Shop__3214EC277F60ED59]ALTER TABLE [dbo].[Shop] ADD PRIMARY KEY NONCLUSTERED
([ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]CREATE CLUSTERED INDEX [ClusteredIndex_on_MySchemeCreateTime_635288828144372217] ON [dbo].[Shop]
([CreateTime]
)WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [MySchemeCreateTime]([CreateTime])DROP INDEX [ClusteredIndex_on_MySchemeCreateTime_635288828144372217] ON [dbo].[Shop] WITH ( ONLINE = OFF )COMMIT TRANSACTION
从图中可以看到生成好的分区函数名”[MyRangeCreatTime]“ 和分区架构名“[MySchemeCreateTime]”,最后我们执行下该sql就ok了。
⑤ 插入测试数据并进行简单的测试
这里测试下“2013-1-1”是在哪个分区下。
sql server 小记——分区表(上)相关推荐
- [转]SQL Server 2005 分区表实践——建立分区表(partition table)
[鹏城万里] 发表于 www.sqlstudy.com SQL Server 2005 分区表实践--建立分区表(partition table) 问题:有一个订单表 Orders,要转换成分区表,以 ...
- MS SQL Server:分区表、分区索引详解
MS SQL Server:分区表.分区索引 详解 1. 分区表简介 使用分区表的主要目的,是为了改善大型表以及具有各种访问模式的表的可伸缩性和可管理性. 大型表:数据量巨大的表. 访问模式: ...
- 干货 | RDS For SQL Server单库上云
数据库作为核心数据的重要存储,很多时候都会面临数据迁移的需求,例如:业务从本地迁移上云.数据中心故障需要切换至灾备中心.混合云或多云部署下的数据同步.流量突增导致数据库性能瓶颈需要拆分-- 本文将会一 ...
- SQL索引管理器——用于SQL Server和Azure上的索引维护的免费GUI工具
目录 介绍 主意 实现 结果和计划 下载源 - 16.3 MB 下载 SQL 索引管理器 v1.0.0.68.zip - 16.2 MB 下载 SQL 索引管理器 v1.0.0.67.zip - 16 ...
- SQL索引管理器——用于SQL Server和Azure上的索引维护的免费GUI工具
目录 介绍 理念 实现 结果和计划 介绍 我作为SQL Server DBA工作了8年多,管理和优化服务器的性能.在我的空闲时间,我想为世界和我的同事做一些有用的事情.这就是我们最终为SQL Serv ...
- LabVIEW自带函数实现SQL Server操作(上)
函数位置:互联接口-->databse 函数一览: 主要介绍上面一行 1. DB Tool Open Connection.vi 简介:使用连接信息打开一个数据库连接,然后返回一个连接引用.若连 ...
- SQL server连接不上服务器时的解决方案
刚开始安装完SQL server的时候,我(Win10)都能用正常的用,可是突然某一天,他就变了- 故事开始于点击连接的时候: 就像这样z: 然后期待的画面没有出现,出现错误提示: 于是我又尝试更改服 ...
- mssql和mysql的存储过程区别_MySQL和SQL Server存储过程写法上有什么区别?
展开全部 一.多数指令是相同的,包括创建和修正存储过32313133353236313431303231363533e59b9ee7ad9431333365646262程的指令. 二.很多细微的指令有 ...
- mysql和sql server连接不上_php-通过不可靠的网络连接在MySQL和SQL Server...
当两个数据库在2个不同的服务器上同步时,此问题与实现冗余有关.首先,我将解释该设置,以便您可以了解问题的背景. 我有两个不同的服务器,分别在2个不同的位置使用不同的数据库类型运行不同的操作系统. Se ...
最新文章
- jQuery获取浏览器URL链接的值
- java代码写jsp读取,Java IO学习基础之读写文本文件-JSP教程,Java技巧及代码
- ap计算机科学换学分,科普:AP成绩出来了 换学分最全指南就在这
- a4纸网页打印 table_打印模板不愁人,你还在打印单调的A4纸吗?
- 在STM32的官方库切换芯片型号
- python网站服务器好麻烦_python写的网站,云服务器经常无法访问
- 如何查找涉密文件_企业如何处理涉密信息文件?这四点必知
- 关于mysql查询_关于mysql的查询
- linux三剑客之awk
- 教妹学Java(十一):操作符简介
- 计算机拓扑结构定义,计算机网络拓扑结构的定义
- Mosaic(马赛克)模组正式支持OSNMA技术
- 保姆级笔记-佳能Canon LBP2900在Win10安装驱动
- lua的演进 lua的历史
- coodblock调试_codeblocks怎么调试?
- 医院排队叫号系统源码
- 22牛客多校1 J.Serval and Essay (启发式合并)
- 【渝粤教育】电大中专电子商务网站建设与维护 (6)作业 题库
- Excel如何通过年份上的时间差操作求得员工工龄
- Java实现哈希加密(HmacSHA1、HmacMD5、HmacSHA256、HmacSHA512)
热门文章
- linux安装识别硬盘比raid小,如何判断linux使用的是HDD还是SSD、HHD;磁盘阵列RAID
- 大连二本的学计算机专业的大学,高考成绩差:这9所“二本大学”的计算机专业不错!值得报考!...
- 御用导航官方网站提醒提示页_导航错误致四川青城山拥堵?交警提醒:别过度依赖导航...
- lingo calcinit
- HDLBits 系列(42)根据仿真波形来设计电路之时序逻辑
- 「镁客·请讲」深睿医疗乔昕:AI医疗才起步,说变革尚早
- let's encrypt部署免费泛域名证书
- 线程本地数据ThreadLocal
- 前端网络知识目录(持续更新)
- css字体更小 css比12px更小的方法