首页 数据库 mysql教程 SQL Server 表分区整理

SQL Server 表分区整理

Jun 07, 2016 pm 03:10 PM
server sql 分区 前言 整理

1. 前言 SQL Server 2005开始支持表 分区 ,这种技术允许所有的表 分区 都保存在同一台服务器上。每一个表 分区 都和在某个文件组(filegroup)中的单个文件关联。同样的一个文件/文件组可以容纳多个 分区 表。在这种设计架构下,数据库引擎能够判定查询过程中

1.      前言

SQL Server 2005开始支持表分区,这种技术允许所有的表分区都保存在同一台服务器上。每一个表分区都和在某个文件组(filegroup)中的单个文件关联。同样的一个文件/文件组可以容纳多个分区表。在这种设计架构下,数据库引擎能够判定查询过程中应该访问哪个分区,而不用扫描整个表。如果查询需要的数据行分散在多个分区中,SQL Server使用多个处理器对多个分区进行并行查询。你可以为在创建表的时候就定义分区的索引。对小索引的搜索或者扫描要比扫描整个表或者一张大表上的索引要快很多。因此,当对大表进行查询,表分区可以产生相当大的性能提升通过分别检查同一条返回所有行的、简单SELECT语句在分区表和非分区表上的执行计划,返回的数据范围通过WHERE语句来指定。同一条语句在这两个不同的表上有不同的执行计划。对于分区表的查询显示出一个嵌套的循环和索引的扫描。从本质上来说,SQL Server将两个分区视为独立的表,因此使用一个嵌套循环将它们连接起来。对非分区的表的同一个查询则使用索引扫描来返回同样的列。当你使用同样的分区策略创建多个表,同时在查询中连接这些表,那么性能上的提升会更加明显。

2.      分区三步曲

SQL Server数据库表分区操作过程由三个步骤组成

2.1.       创建分区函数

2.1.1.  创建文件组,一般文件组个数=分区值个数+1

alter database [mydatabase] --创建文件组1
 
add filegroup [fg_tb_partition_id_1]
 
go
 
alter database [mydatabase] --创建文件组2
 
add filegroup [fg_tb_partition_id_2]
 
go
 
alter database [mydatabase] --创建文件组3
 
add filegroup [fg_tb_partition_id_3]
 
go


 

2.1.2.  为数据库创建文件

一个文件不能属于两个文件组,一个文件组可以包含多个文件,可以同时指定初始化大小及

增长大小。

alter database [mydatabase]
 
add file
  (name=N
'fg_tb_partition_id_1_data',
   filename=N
'D:\dbbackup\fg_tb_partition_id_1_data.ndf',
   
size=30mb,filegrowth=10%)
   
to filegroup [fg_tb_partition_id_1]
   
go
 
alter database [mydatabase]
 
add file
  (name=N
'fg_tb_partition_id_2_data',
   filename=N
'D:\dbbackup\fg_tb_partition_id_2_data.ndf',
   
size=30mb,filegrowth=10%)
   
to filegroup [fg_tb_partition_id_2]
   
go
 
alter database [mydatabase]
 
add file
  (name=N
'fg_tb_partition_id_3_data',
   filename=N
'D:\dbbackup\fg_tb_partition_id_3_data.ndf',
   
size=30mb,filegrowth=10%)
   
to filegroup [fg_tb_partition_id_3]
   
go
 
 

2.1.3.  创建分区函数

分区函数用于定义你希望SQL Server如何对数据进行分区的参数值(how)。这个操作并不涉及任何表格,只是单纯的定义了一项技术来分割数据.

create partition function
  fun_tb_partition_id(
intas
 
range right
 
for values(10000,20000)

注意:

这里使用了右分区则表示分区取值范围为

属于第一分区

=10000 And 属于第二分区

=20000属于第三分区

2.2.       创建分区架构

一旦给出描述如何分割数据的分区函数,接着就要创建一个分区架构,用来定义分区位置(where)。

create partition scheme
  sch_tb_partition_id 
as
 
partition fun_tb_partition_id
 
to([fg_tb_partition_id_1],[fg_tb_partition_id_2],[fg_tb_partition_id_3])

2.3.       对表进行分区

定义好一个分区架构后,就可以着手创建一个分区表了。只需要在表创建指令中添加一个

"ON"语句,用来指定分区架构以及应用该架构的表列。因为分区架构已经识别了分区函数,

所以不需要再指定分区函数了。

create table [dbo].[tb_partition1](
      [id] [
intidentity(1,1not null,
      [username] 
as 'name'+ltrim([id]),
      [age] [
intnull constraint [df_ tb_partition1_age] default ((0)),
   
constraint [pk_tb_partition1] primary key clustered
  (
      [id] 
asc
  )
with( pad_index = on, fillfactor = 100on [sch_tb_partition_id](id)
  ) 
on [sch_tb_partition_id]([id])
 
go
 
create table [dbo].[tb_partition2](
      [id] [
intidentity(1,1not null,
      [username] 
as 'name'+ltrim([id]),
      [age] [
intnull constraint [df_tb_partition2_age] default ((0)),
   
constraint [pk_tb_partition2] primary key clustered
  (
      [id] 
asc
  )
with( pad_index = on, fillfactor = 100on [sch_tb_partition_id](id)
  ) 
on [sch_tb_partition_id]([id])

 

2.4.       填充测试数据,并进行合并与删除操作

2.4.1.  填充数据

insert tb_partition1 default values
 
go 30005

2.4.2.  查看数据分区状况

select 
      $partition.fun_tb_partition_id(id) 
as partition_num,
      
min(id) as min_value,
      
max(id) as max_value,
      
count(1as record_num
 
from [dbo].[tb_partition1]
 
group by $partition.fun_tb_partition_id(id)
 
order by $partition.fun_tb_partition_id(id)

2.4.3.  切换分区

alter table [dbo].[tb_partition1]
  switch 
partition 1 to [dbo].[tb_partition2] partition 1
 
--查看结果
 
select * from [dbo].[tb_partition1]
 
select * from [dbo].[tb_partition2]

2.4.4.  修改分区架构和分区函数

alter partition scheme [sch_tb_partition_id]
 
next used [fg_tb_partition_id_1]
 
go
 
alter partition function [fun_tb_partition_id]()
  split range(
15000)

3.      分区注意事项

3.1.       分区边界值问题

使用left和right时候需要注意,特别是时间分割上,通常使用以00:00:00.000最可靠,这种分割需要使用right如果使用left需要设置为23:59:59.997。

3.2.       分区值第一个值

符合这个值之前的值会被分配到第一个分区中,使用left和right的区别就是这个分区值是被分配到第一个分区还是第二个分区

3.3.       通常情况会以ID(自增)或时间字段作为分区字段

这样的好处就是容易区分历史数据库,而且对分区操作隔离也是最明显的。

3.4.       索引分区

聚集索引进行分区时,聚集键必需包含分区依据列。

对于非唯一的聚集索引进行分区时,如果未在聚集索引键中指定分区依据列,默认情况下SQLServer将在聚集索引键列表中添加分区依据列。如果聚集索引是唯一的,则必需明确指定聚集索引键包含分区依据列。

唯一的非聚集索引进行分区时,索引键必需包含分区依据列,对非唯一的非聚集索引进行分区,默认情况下SQLServer将分区依据列添加为索引的非键列(包含性列),以确保索引与基表对齐。

3.5.       删除分区

删除的这个边界值属于哪个分区就会删除这个分区,再向临近(以这个边界值为临界点的两个分区)的分区合并。

3.6.       索引对齐

索引对齐:如果你想让数据分开到不同的文件可以使用两个不同的分区方案,使用同一分区函数。

存储位置对齐:数据和索引位于同一文件中

4.      动态生成分区脚本

--分区脚本

--定义变量
 
declare @databasename nvarchar(50)--数据库名称
 
declare @tablename nvarchar(50)--表名称
 
declare @columnname nvarchar(50)--字段名称
 
declare @partnumber int--需要分多少个区
 
declare @location nvarchar(50)--保存分区文件的路径
 
declare @size nvarchar(50)--分区初始化大小
 
declare @filegrowth nvarchar(50)--分区文件增量
 
declare @funvalue datetime--分区分段值
 
declare @i int
 
declare @partnumberstr nvarchar(50)
 
declare @sql nvarchar(max)
 
--变量赋值
 
set @databasename = 'mydatabase'
 
set @tablename = 'table_name'
 
set @columnname = 'id'
 
set @partnumber = 4
 
set @location = 'e:\database\'
 
set @size = '30mb'
 
set @filegrowth = '10%'
 
set @funvalue = '20120101'
 
--1.创建文件组
 
set @i = 1
 
while @i   begin
      
set @partnumberstr =  right('0' + convert(nvarchar,@i),2)
      
set @sql = 'alter database ['+@databasename +']
 
add filegroup [fg_'+@tablename+'_'+@columnname+'_'+@partnumberstr+']'
 
    print @sql + char(13)
      
set @i=@i+1
 
end
 
--2.创建文件
 
set @i = 1
 
while @i   begin
      
set @partnumberstr =  right('0' + convert(nvarchar,@i),2)
      
set @sql = 'alter database ['+@databasename +']
 
add file
  (name = n
''fg_'+@tablename+'_'+@columnname+'_'+@partnumberstr+'_data'',filename = n'''+@location+'fg_'+@tablename+'_'+@columnname+'_'+@partnumberstr+'_data.ndf'',size = '+@size+', filegrowth = '+@filegrowth+' )
 
to filegroup [fg_'+@tablename+'_'+@columnname+'_'+@partnumberstr+'];'
 
    print @sql + char(13)
      
set @i=@i+1
 
end
 
--3.创建分区函数
 
declare @funvaluestr nvarchar(max
 
set @i = 1
 
set @funvaluestr = ''
 
while @i   begin
      
set @funvaluestr = @funvaluestr +''''convert(varchar(10),dateadd(year,@i,@funvalue),120)+' 00:00:00.000' + ''','
      
set @i=@i+1
 
end
 
set @funvaluestr = substring(@funvaluestr,1,len(@funvaluestr)-1)
 
set @sql = 'create partition function
 
fun_'+@tablename+'_'+@columnname+'(intas
 
range right
 
for values('+@funvaluestr+')'
 
print @sql + char(13)
 
--4.创建分区方案
 
declare @filegroupstr nvarchar(max
 
set @i = 1
 
set @filegroupstr = ''
 
while @i   begin
      
set @partnumberstr =  right('0' + convert(nvarchar,@i),2)
      
set @filegroupstr = @filegroupstr + '[fg_'+@tablename+'_'+@columnname+'_'+@partnumberstr+'],'
      
set @i=@i+1
 
end
 
set @filegroupstr = substring(@filegroupstr,1,len(@filegroupstr)-1)
 
set @sql = 'create partition scheme
 
sch_'+@tablename+'_'+@columnname+' as
 
partition fun_'+@tablename+'_'+@columnname+'
 
to('+@filegroupstr+')'
 
print @sql + char(13)
 
--5.分区函数的记录数
 
set @sql = 'select $partition.fun_'+@tablename+'_'+@columnname+'('+@columnname+') as partition_num,
 
  min('+@columnname+'as min_value,max('+@columnname+'as max_value,count(1as record_num
 
from dbo.'+@tablename+'
 
group by $partition.fun_'+@tablename+'_'+@columnname+'('+@columnname+')
 
order by $partition.fun_'+@tablename+'_'+@columnname+'('+@columnname+');'
 
print @sql + char(13)

 

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Hibernate 框架中 HQL 和 SQL 的区别是什么? Hibernate 框架中 HQL 和 SQL 的区别是什么? Apr 17, 2024 pm 02:57 PM

HQL和SQL在Hibernate框架中进行比较:HQL(1.面向对象语法,2.数据库无关的查询,3.类型安全),而SQL直接操作数据库(1.与数据库无关的标准,2.可执行复杂查询和数据操作)。

Oracle SQL中除法运算的用法 Oracle SQL中除法运算的用法 Mar 10, 2024 pm 03:06 PM

《OracleSQL中除法运算的用法》在OracleSQL中,除法运算是常见的数学运算之一。在数据查询和处理过程中,除法运算可以帮助我们计算字段之间的比例或者得出特定数值的逻辑关系。本文将介绍OracleSQL中除法运算的用法,并提供具体的代码示例。一、OracleSQL中除法运算的两种方式在OracleSQL中,除法运算可以使用两种不同的方式进行

Oracle和DB2的SQL语法比较与区别 Oracle和DB2的SQL语法比较与区别 Mar 11, 2024 pm 12:09 PM

Oracle和DB2是两个常用的关系型数据库管理系统,它们都有自己独特的SQL语法和特点。本文将针对Oracle和DB2的SQL语法进行比较与区别,并提供具体的代码示例。数据库连接在Oracle中,使用以下语句连接数据库:CONNECTusername/password@database而在DB2中,连接数据库的语句如下:CONNECTTOdataba

SQL中的identity属性是什么意思? SQL中的identity属性是什么意思? Feb 19, 2024 am 11:24 AM

SQL中的Identity是什么,需要具体代码示例在SQL中,Identity是一种用于生成自增数字的特殊数据类型,它常用于唯一标识表中的每一行数据。Identity列通常与主键列配合使用,可以确保每条记录都有一个独一无二的标识符。本文将详细介绍Identity的使用方式以及一些实际的代码示例。Identity的基本使用方式在创建表时,可以使用Identit

详解MyBatis动态SQL标签中的Set标签功能 详解MyBatis动态SQL标签中的Set标签功能 Feb 26, 2024 pm 07:48 PM

MyBatis动态SQL标签解读:Set标签用法详解MyBatis是一个优秀的持久层框架,它提供了丰富的动态SQL标签,可以灵活地构建数据库操作语句。其中,Set标签是用于生成UPDATE语句中SET子句的标签,在更新操作中非常常用。本文将详细解读MyBatis中Set标签的用法,以及通过具体的代码示例来演示其功能。什么是Set标签Set标签用于MyBati

如何安装、卸载、重置Windows服务器备份 如何安装、卸载、重置Windows服务器备份 Mar 06, 2024 am 10:37 AM

WindowsServerBackup是WindowsServer操作系统自带的一个功能,旨在帮助用户保护重要数据和系统配置,并为中小型和企业级企业提供完整的备份和恢复解决方案。只有运行Server2022及更高版本的用户才能使用这一功能。在本文中,我们将介绍如何安装、卸载或重置WindowsServerBackup。如何重置Windows服务器备份如果您的服务器备份遇到问题,备份所需时间过长,或无法访问已存储的文件,那么您可以考虑重新设置WindowsServer备份设置。要重置Windows

SQL出现5120错误怎么解决 SQL出现5120错误怎么解决 Mar 06, 2024 pm 04:33 PM

解决办法:1、检查登录用户是否具有足够的权限来访问或操作该数据库,确保该用户具有正确的权限;2、检查SQL Server服务的帐户是否具有访问指定文件或文件夹的权限,确保该帐户具有足够的权限来读取和写入该文件或文件夹;3、检查指定的数据库文件是否已被其他进程打开或锁定,尝试关闭或释放该文件,并重新运行查询;4、尝试以管理员身份运行Management Studio等等。

【Linux系统】fdisk相关分区命令。 【Linux系统】fdisk相关分区命令。 Feb 19, 2024 pm 06:00 PM

fdisk是一个常用的Linux命令行工具,用于创建、管理和修改磁盘分区。以下是一些常用的fdisk命令:显示磁盘分区信息:fdisk-l该命令将显示系统中所有磁盘的分区信息。选择要操作的磁盘:fdisk/dev/sdX将/dev/sdX替换为要操作的实际磁盘设备名称,如/dev/sda。创建新分区:n这将引导您创建一个新的分区。按照提示输入分区类型、起始扇区、大小等信息。删除分区:d这将引导您选择要删除的分区。按照提示选择要删除的分区编号。修改分区类型:t这将引导您选择要修改类型的分区。按照提

See all articles