背景:

一般情况下,我们建立数据库表时,表数据都存放在一个文件里。

但是如果是分区表的话,表数据就会按照你指定的规则分放到不同的文件里,把一个大的数据文件拆分为多个小文件,还可以把这些小文件放在不同的磁盘下由多个cpu进行处理。这样文件的大小随着拆分而减小,还得到硬件系统的加强,自然对我们操作数据是大大有利的。

1.创建文件组

alter database <数据库名> add filegroup <文件组名>

alter database HARVEY add filegroup ByIdGroup1

alter database HARVEY add filegroup ByIdGroup2

alter database HARVEY add filegroup ByIdGroup3

2.创建数据文件到文件组里面

alter database <数据库名称> add file <数据标识> to filegroup <文件组名称>

alter database HARVEY add file

(name=N'ById1',filename=N'C:\Users\Administrator\Desktop\DATA\file1.ndf',size=5Mb,filegrowth=5mb)to filegroup ByIdGroup1

alter database HARVEY add file

(name=N'ById2',filename=N'C:\Users\Administrator\Desktop\DATA\file2.ndf',size=5Mb,filegrowth=5mb)to filegroup ByIdGroup2

alter database HARVEY add file

(name=N'ById3',filename=N'C:\Users\Administrator\Desktop\DATA\file3.ndf',size=5Mb,filegrowth=5mb)to filegroup ByIdGroup3

若以后想增加文件到文件组,只需

alter database HARVEY add file

(name=N'ById4',filename=N'C:\Users\Administrator\Desktop\DATA\file4.ndf',size=5Mb,filegrowth=5mb)to filegroup ByIdGroup1

还有另外的文件方式如下等,不再扩展

file(

NAME = N'File1',

FILENAME = N'G:\data\FG1\File1.ndf',

SIZE = 1MB,

MAXSIZE = 100MB,

FILEGROWTH = 10%

)

注意:加上 N 代表存入数据库时以 Unicode 格式存储。

N'string' 表示string是个Unicode字符串

3.创建分区函数

--创建分区函数语法

create partition function 分区函数名(<分区列类型>) as range [left/rightfor values (每个分区的边界值,....)

--删除分区语法

drop partition function <分区函数名>

--创建分区函数

CREATE PARTITION FUNCTION[bgPartitionFun](int) AS RANGE LEFT FOR VALUES (

N'2',--sql server自动将字符串转为int类型

N'4',

N'6')  --4个分区

--按照时间分区函数

DECLARE @dt datetime

SET @dt = '20020101'

CREATE PARTITION FUNCTION PF_HistoryArchive(datetime)

AS RANGE LEFT|RIGHT

FOR VALUES(

@dt, --string类型,sql server会自动将字符串转化为datetime

DATEADD(Year, 1, @dt))

注意:LEFT相当于左区间,RIGHT相当于右区间

4.创建分区方案

--创建分区方案语法

create partition scheme <分区方案名称> as partition <分区函数名称> [all]to (文件组名称,....)

--删除分区方案语法

drop partition scheme<分区方案名称>

--删除分区方案 bgPartitionSchema

drop partition scheme bgPartitionSchema1

CREATE PARTITION SCHEME [bgPartitionSchema] AS PARTITION [bgPartitionFun] TO ([ByIdGroup1], [ByIdGroup2], [ByIdGroup3],[ByIdGroup1])

注意:分区函数必须关联分区方案才能有效,然而分区方案指定的文件组数量必须与分区数量一致,哪怕多个分区存放在一个文件组中。

5.分区索引

--创建分区索引语法

create <索引分类> index <索引名称> on <表名>(列名)on <分区方案名>(分区依据列名)

--创建分区索引

CREATE CLUSTERED INDEX [ClusteredIndex_on_bgPartitionSchema] ON [dbo].[BigOrder]

(

[OrderId]

)WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFFONLINE = OFFON [bgPartitionSchema]([OrderId])

注意:使用分区索引查询,可以避免多个cpu操作多个磁盘时产生的冲突。

6.重建索引(对已存在的表进行分区)

(删除聚集索引以及需要分区字段的索引后重建该类索引,表被按分区值将分配到各文件组)

EXEC sp_helpindex N'BigOrder' --查看orders中使用的索引,删除clustered索引

drop index idx_cl_od on BigOrder;

go

CREATE CLUSTERED INDEX [ClusteredIndex_on_bgPartitionSchema] ON [dbo].[BigOrder]

{

   [OrderId]

}

WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFFONLINE = OFFON [bgPartitionSchema]([OrderId])

go

7.建立分区表

--创建分区表语法

create table <表名> (

<列定义>

)on<分区方案名>(分区列名)

--创建分区表create table BigOrder (

OrderId              int                  identity,

orderNum             varchar(30)          not null,

CreateDate           datetime             null default getdate()

)on bgPartitionSchema(OrderId)

8.判断数据在哪个分区上

select $partition.<分区函数>(分区列名)

select $partition.bgPartitionFun(3)

select $partition.bgPartitionFun(b.orderid) as partitionNum,b.* from BigOrder b

其他
查看分区信息sql

SELECT OBJECT_NAME(p.object_id) AS ObjectName,

i.name                   AS IndexName,

p.index_id               AS IndexID,

ds.name                  AS PartitionScheme,

p.partition_number       AS PartitionNumber,

fg.name                  AS FileGroupName,

prv_left.value           AS LowerBoundaryValue,

prv_right.value          AS UpperBoundaryValue,

CASE pf.boundary_value_on_right

WHEN 1 THEN 'RIGHT'

ELSE 'LEFT' END    AS Range,

p.rows AS Rows

FROM sys.partitions     AS  p

JOIN sys.indexes                     AS i

ON i.object_id = p.object_id

AND i.index_id = p.index_id

JOIN sys.data_spaces                 AS ds

ON ds.data_space_id = i.data_space_id

JOIN sys.partition_schemes           AS ps

ON ps.data_space_id = ds.data_space_id

JOIN sys.partition_functions         AS pf

ON pf.function_id = ps.function_id

JOIN sys.destination_data_spaces     AS dds2

ON dds2.partition_scheme_id = ps.data_space_id

AND dds2.destination_id = p.partition_number

JOIN sys.filegroups                  AS fg

ON fg.data_space_id = dds2.data_space_id

LEFT JOIN sys.partition_range_values AS prv_left

ON ps.function_id = prv_left.function_id

AND prv_left.boundary_id = p.partition_number - 1

LEFT JOIN sys.partition_range_values AS prv_right

ON ps.function_id = prv_right.function_id

AND prv_right.boundary_id = p.partition_number

WHERE

OBJECTPROPERTY(p.object_id, 'ISMSShipped') = 0

UNION ALL

SELECT

OBJECT_NAME(p.object_id)    AS ObjectName,

i.name                      AS IndexName,

p.index_id                  AS IndexID,

NULL                        AS PartitionScheme,

p.partition_number          AS PartitionNumber,

fg.name                     AS FileGroupName,

NULL                        AS LowerBoundaryValue,

NULL                        AS UpperBoundaryValue,

NULL                        AS Boundary,

p.rows                      AS Rows

FROM sys.partitions     AS p

JOIN sys.indexes        AS i

ON i.object_id = p.object_id

AND i.index_id = p.index_id

JOIN sys.data_spaces    AS ds

ON ds.data_space_id = i.data_space_id

JOIN sys.filegroups           AS fg

ON fg.data_space_id = i.data_space_id

WHERE

OBJECTPROPERTY(p.object_id, 'ISMSShipped') = 0

ORDER BY

ObjectName,

IndexID,

PartitionNumber

查看分区的相关情况

--查看分区及分区范围的情况

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

p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-size: 10.5000pt }
h3 { margin-top: 5.0000pt; margin-bottom: 5.0000pt; text-align: left; font-family: 宋体; font-weight: bold; font-size: 13.5000pt }
h4 { margin-top: 5.0000pt; margin-bottom: 5.0000pt; text-align: left; font-family: 宋体; font-weight: bold; font-size: 12.0000pt }
h5 { margin-top: 5.0000pt; margin-bottom: 5.0000pt; text-align: left; font-family: 宋体; font-weight: bold; font-size: 10.0000pt }
span.10 { font-family: "Times New Roman" }
span.15 { font-family: "Courier New"; font-size: 10.0000pt }
p.p { margin-top: 5.0000pt; margin-right: 0.0000pt; margin-bottom: 5.0000pt; margin-left: 0.0000pt; text-align: left; font-family: Calibri; font-size: 12.0000pt }
p.pre { margin: 0pt; margin-bottom: .0001pt; text-align: left; font-family: 宋体; font-size: 12.0000pt }
span.msoIns { text-decoration: underline; color: blue }
span.msoDel { text-decoration: line-through; color: red }
table.MsoNormalTable { font-family: "Times New Roman"; font-size: 10.0000pt }
div.Section0 { }

sql server 表分区的更多相关文章

  1. SQL Server表分区的NULL值问题

    SQL Server表分区的NULL值问题 SQL Server表分区只支持range分区这一种类型,但是本人觉得已经够用了 虽然MySQL支持四种分区类型:RANGE分区.LIST分区.HASH分区 ...

  2. SQL Server表分区【转】

    转自:http://www.cnblogs.com/knowledgesea/p/3696912.html SQL Server表分区   什么是表分区 一般情况下,我们建立数据库表时,表数据都存放在 ...

  3. SQL Server表分区详解

    原文:SQL Server表分区详解 什么是表分区 一般情况下,我们建立数据库表时,表数据都存放在一个文件里. 但是如果是分区表的话,表数据就会按照你指定的规则分放到不同的文件里,把一个大的数据文件拆 ...

  4. SQL Server表分区-水平分区

    SQL Server表分区,sql server水平分区 转自:http://www.cnblogs.com/knowledgesea/p/3696912.html  根据时间的,直接上T-SQL代码 ...

  5. SQL Server 表分区备忘

    1.创建的代码如下: )) AS RANGE LEFT FOR VALUES ( N', N', N',... ) CREATE PARTITION SCHEME [01_SubjectiveScor ...

  6. 8、SQL Server 表分区

    什么是表分区?表分区其实就是将一个大表分成若干个小表.表分区可以从物理上将一个大表分成几个小表,但是逻辑上还是一个表.所以当执行插入.更新等操作的时候,不需要我们去判断应该插入或更新到哪个表中.只需要 ...

  7. SQL Server表分区案例

    --学习创建表分区脚本/*SQL SERVER 2005中以上版本,终于引入了表分区,就是说,当一个表里的数据很多时,可以将其分拆到多个的表里,大大提高了性能.下面举例子说明之*/ --------- ...

  8. SQL Server表分区(水平分区及垂直分区)

    什么是表分区? 表分区分为水平表分区和垂直表分区,水平表分区就是将一个具有大量数据的表,进行拆分为具有相同表结构的若干个表:而垂直表分区就是把一个拥有多个字段的表,根据需要进行拆分列,然后根据某一个字 ...

  9. SQL Server 表分区之水平表分区

    什么是表分区? 表分区分为水平表分区和垂直表分区,水平表分区就是将一个具有大量数据的表,进行拆分为具有相同表结构的若干个表:而垂直表分区就是把一个拥有多个字段的表,根据需要进行拆分列,然后根据某一个字 ...

随机推荐

  1. Django rest framework源码分析(4)----版本

    版本 新建一个工程Myproject和一个app名为api (1)api/models.py from django.db import models class UserInfo(models.Mo ...

  2. Python之旅.第三章.函数4.01/4.02

    一.三元表达式 #普通的判断大小函数def max2(x,y): if x > y: return x else: return yres=max2(10,11)print(res)x=12y= ...

  3. php的api及登录的权限验证

    类,库,接口(APi),函数,这些概念都是根据问题规模的大小来界定的.一个很小的问题肯定没有必要写成一个库,只需要写几句话就行了. 但是比如一个登录验证,这个功能很强大,很通用,可能前台后台都需要用到 ...

  4. java异常常见面试问题

    java异常常见面试问题 一.java异常的理解 异常主要是处理编译期不能捕获的错误.出现问题时能继续顺利执行下去,而不导致程序终止,确保程序的健壮性. 处理过程:产生异常状态时,如果当前的conte ...

  5. LeetCode & Q121-Best Time to Buy and Sell Stock-Easy

    Array DP Description: Say you have an array for which the ith element is the price of a given stock ...

  6. 关于团购VPS的事情报告

    作者 玄魂   2017-08-11 玄魂工作室-玄魂 玄魂工作室首先要抱歉,之前的说的继续组织大家购买vps的事情,不会再组织了.原因有以下几个:1)因为人多,需求各不相同,不好协调.2)服务都是购 ...

  7. matlab等高线绘制

    参考代码: figure;// Figure建立新的图形 z=double(z); x=1:length(z); y=x; [X2,Y2]=meshgrid(x,y); subplot(121); [ ...

  8. 2017年Unity游戏开发视频教程(入门到精通)

    本文是我发布的一个Unity游戏开发的学习目录,以后我会持续发布一系列的游戏开发教程,都会更新在这个页面上,适合人群有下面的几种: 想要做独立游戏的人 想要找游戏开发相关工作的人 对游戏开发感兴趣的人 ...

  9. DOM常用外部插入方法与区别

    1.DOM外部插入after()与before() 节点与节点之前有各种关系,除了父子,祖辈关系,还可以是兄弟关系.之前我们在处理节点插入的时候,接触到了内部插入的几个方法,这节我们开始讲外部插入的处 ...

  10. JavaScript的基础学习

    由js和python想到的: 弱类型语言 js 中的数据在进行算数运算时,会自动转换类型强类型语言 变量的值的数据类型一旦确定,使用时不能改变 动态语言:编译时不知道数据类型,只有在执行时才知道数据类 ...