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”是在哪个分区下。

 

  

 

时间: 2024-12-04 00:59:35

sql server 小记——分区表(上)的相关文章

本地sql server连接不上azure上的sql server

问题描述 本地sql server连接不上azure上的sql server 如题,以及我的截图,有人遇到过这样的问题吗?能帮忙解决下吗?谢谢了 解决方案 当前客户端ip不允许访问,提示的很清楚,根据提示,在azure管理门户中添加你的ip为允许.(5分钟后生效) 解决方案二: Hi, 我建议你阅读这篇文章:http://www.windowsazure.cn/zh-cn/manage/services/sql-databases/how-to-manage-a-sqldb/,你现在所遇到的问题

sql server连接不上怎么办 SQL Server2008R无法登录的解决方案(1814\18456)_mssql2008

早上一开电脑,黑屏幕跑一些修复系统的代码....进入系统后,sql server连接不上 正文 原因:sql server的服务自动关闭了,并且启动失败 windows日志信息:传递给数据库 'master' 中的日志扫描操作的日志扫描号 (286:456:1) 无效.此错误可能指示数据损坏,或者日志文件(.ldf)与数据文件(.mdf)不匹配.如果此错误是在复制期间出现的,请重新创建发布.否则,如果该问题导致启动期间出错,请从备份还原. 很明显是sqlserver的系统文件出了问题,先百度,网

SQL Server根据分区表名查找所在的文件及文件组实现脚本_MsSql

SELECT ps.name AS PSName, dds.destination_idAS PartitionNumber, fg.name AS FileGroupName,fg.name, t.name, f.name as filename FROM (((sys.tables AS t INNER JOIN sys.indexes AS i ON (t.object_id = i.object_id)) INNER JOIN sys.partition_schemes AS ps ON

用VB和SQL Server实现文件上传(方案例)

server|上传 需要一个ADODB.Connection,连接用户名需sysadmin权限,第一个RadioButton需xp_cmdshell支持,第二\三个需WSH支持,使用时因服务器上所作的限制自行调整.控件示例见贴子附图 Dim objConn As New ADODB.Connection Private Sub cmdUpload_Click()On Error GoTo errhandle: txtStatus.Text = "Uploading File, Please wa

在C#.net的server explorer 上建立的数据库,在sql server management studio 上却找不到建立的数据库,怎么回事情?

问题描述 小弟最近自学C#.net,按照网上视频一步一步做下来,其中有一个不理解的地方:为什么在C#.net的serverexplorer上建立的数据库在,在本地实际的sqlserver上却没有看到这个数据库呢?我在C#.net上建立的数据库,是通过右键点击solutionexplorer中的项目名称,通过addnewitem的方式建立了sqlserverdatabase,并出现在C#.net的serverexplorer中.其余的,在实际代码中,是这样连接数据库并操作的:SqlConnecti

SQL Server根据分区表名查找所在的文件及文件组实现脚本

SELECT ps.name AS PSName, dds.destination_idAS PartitionNumber, fg.name AS FileGroupName,fg.name, t.name, f.name as filename FROM (((sys.tables AS t INNER JOIN sys.indexes AS i ON (t.object_id = i.object_id)) INNER JOIN sys.partition_schemes AS ps ON

Proxy Server和SQL Server在上数据库的安全复制

server|安全|数据|数据库 为SQL Server在WinSock上定义协议的步骤如下:1. 在"启动"菜单上,指向"程序/Microsoft Proxy Server",然后点击"Microsoft Management Console".2. 展开"Internet Information Service",再展开运行Proxy Server的服务器.3. 右击WinSock Proxy service, 再点击属性

SQL Server 2005 中的商务智能和数据仓库(1)

本文概述了 SQL Server 2005 Beta 2 中"商务智能"平台的增强功能.本文并非实施指南,而是为读者提供了关于"商务智能"平台增强功能的信息. 一.简介 Microsoft SQL Server 2005 是一个完整的商务智能 (BI) 平台,其中为用户提供了可用于构建典型和创新的分析应用程序所需的各种特性.工具和功能.本文简要介绍了您在构建分析应用程序时将要用到的一些工具,并着重介绍了一些新增功能,这些新增功能使复杂 BI 系统的构建和管理比以往更

SQL Server大型服务器:伸缩性、可用性与易管理性

简介 随着电子商务.在线商务应用.商务智能等领域的迅猛发展,许多成功的企业都在对其在线应用进行扩展.目前,每一个Internet或企业内部网络用户都是一个潜在的客户,因此,应用面临着巨大的用户和事务负载.绝大多数企业都在建立大型服务器,以便管理数以吉计的信息并为数以百万的客户和用户提供支持.在此过程中,数据库系统已成为这些大型服务器的核心. 可伸缩式系统为您提供了一种通过添加更多硬件设备的简单方式来扩展网络.服务器.数据库及应用程序的途径.可伸缩式计算机系统可在无需修改应用程序代码的情况下扩大应