Maison base de données tutoriel mysql SQL Server 表分区整理

SQL Server 表分区整理

Jun 07, 2016 pm 03:10 PM
server sql 分区 Préface 整理

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)

 

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Où trouver la courte de la grue à atomide atomique
1 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Quelle est la différence entre HQL et SQL dans le framework Hibernate ? Quelle est la différence entre HQL et SQL dans le framework Hibernate ? Apr 17, 2024 pm 02:57 PM

HQL et SQL sont comparés dans le framework Hibernate : HQL (1. Syntaxe orientée objet, 2. Requêtes indépendantes de la base de données, 3. Sécurité des types), tandis que SQL exploite directement la base de données (1. Normes indépendantes de la base de données, 2. Exécutable complexe requêtes et manipulation de données).

Utilisation de l'opération de division dans Oracle SQL Utilisation de l'opération de division dans Oracle SQL Mar 10, 2024 pm 03:06 PM

"Utilisation de l'opération de division dans OracleSQL" Dans OracleSQL, l'opération de division est l'une des opérations mathématiques courantes. Lors de l'interrogation et du traitement des données, les opérations de division peuvent nous aider à calculer le rapport entre les champs ou à dériver la relation logique entre des valeurs spécifiques. Cet article présentera l'utilisation de l'opération de division dans OracleSQL et fournira des exemples de code spécifiques. 1. Deux méthodes d'opérations de division dans OracleSQL Dans OracleSQL, les opérations de division peuvent être effectuées de deux manières différentes.

Comparaison et différences de syntaxe SQL entre Oracle et DB2 Comparaison et différences de syntaxe SQL entre Oracle et DB2 Mar 11, 2024 pm 12:09 PM

Oracle et DB2 sont deux systèmes de gestion de bases de données relationnelles couramment utilisés, chacun possédant sa propre syntaxe et ses propres caractéristiques SQL. Cet article comparera et différera la syntaxe SQL d'Oracle et de DB2, et fournira des exemples de code spécifiques. Connexion à la base de données Dans Oracle, utilisez l'instruction suivante pour vous connecter à la base de données : CONNECTusername/password@database Dans DB2, l'instruction pour vous connecter à la base de données est la suivante : CONNECTTOdataba.

Que signifie l'attribut d'identité dans SQL ? Que signifie l'attribut d'identité dans SQL ? Feb 19, 2024 am 11:24 AM

Qu'est-ce que l'identité en SQL ? Des exemples de code spécifiques sont nécessaires. En SQL, l'identité est un type de données spécial utilisé pour générer des nombres à incrémentation automatique. Il est souvent utilisé pour identifier de manière unique chaque ligne de données dans une table. La colonne Identité est souvent utilisée conjointement avec la colonne clé primaire pour garantir que chaque enregistrement possède un identifiant unique. Cet article détaillera comment utiliser Identity et quelques exemples de code pratiques. La manière de base d'utiliser Identity consiste à utiliser Identit lors de la création d'une table.

Explication détaillée de la fonction Définir la balise dans les balises SQL dynamiques MyBatis Explication détaillée de la fonction Définir la balise dans les balises SQL dynamiques MyBatis Feb 26, 2024 pm 07:48 PM

Interprétation des balises SQL dynamiques MyBatis : explication détaillée de l'utilisation des balises Set MyBatis est un excellent cadre de couche de persistance. Il fournit une multitude de balises SQL dynamiques et peut construire de manière flexible des instructions d'opération de base de données. Parmi elles, la balise Set est utilisée pour générer la clause SET dans l'instruction UPDATE, qui est très couramment utilisée dans les opérations de mise à jour. Cet article expliquera en détail l'utilisation de la balise Set dans MyBatis et démontrera ses fonctionnalités à travers des exemples de code spécifiques. Qu'est-ce que Set tag Set tag est utilisé dans MyBati

Comment installer, désinstaller et réinitialiser la sauvegarde du serveur Windows Comment installer, désinstaller et réinitialiser la sauvegarde du serveur Windows Mar 06, 2024 am 10:37 AM

WindowsServerBackup est une fonction fournie avec le système d'exploitation WindowsServer, conçue pour aider les utilisateurs à protéger les données importantes et les configurations système, et à fournir des solutions complètes de sauvegarde et de récupération pour les petites, moyennes et grandes entreprises. Seuls les utilisateurs exécutant Server2022 et versions ultérieures peuvent utiliser cette fonctionnalité. Dans cet article, nous expliquerons comment installer, désinstaller ou réinitialiser WindowsServerBackup. Comment réinitialiser la sauvegarde de Windows Server Si vous rencontrez des problèmes avec la sauvegarde de votre serveur, si la sauvegarde prend trop de temps ou si vous ne parvenez pas à accéder aux fichiers stockés, vous pouvez envisager de réinitialiser vos paramètres de sauvegarde de Windows Server. Pour réinitialiser Windows

Comment résoudre l'erreur 5120 dans SQL Comment résoudre l'erreur 5120 dans SQL Mar 06, 2024 pm 04:33 PM

Solution : 1. Vérifiez si l'utilisateur connecté dispose des autorisations suffisantes pour accéder ou utiliser la base de données, et assurez-vous que l'utilisateur dispose des autorisations appropriées ; 2. Vérifiez si le compte du service SQL Server est autorisé à accéder au fichier spécifié ou ; dossier et assurez-vous que le compte dispose des autorisations suffisantes pour lire et écrire le fichier ou le dossier ; 3. Vérifiez si le fichier de base de données spécifié a été ouvert ou verrouillé par d'autres processus, essayez de fermer ou de libérer le fichier et réexécutez la requête ; . Essayez en tant qu'administrateur, exécutez Management Studio en tant que etc.

[Système Linux] Commandes de partition liées au fdisk. [Système Linux] Commandes de partition liées au fdisk. Feb 19, 2024 pm 06:00 PM

fdisk est un outil de ligne de commande Linux couramment utilisé pour créer, gérer et modifier des partitions de disque. Voici quelques commandes fdisk couramment utilisées : Afficher les informations de partition de disque : fdisk-l Cette commande affichera les informations de partition de tous les disques du système. Sélectionnez le disque que vous souhaitez utiliser : fdisk/dev/sdX Remplacez /dev/sdX par le nom réel du périphérique de disque que vous souhaitez utiliser, tel que /dev/sda. Créer une nouvelle partition : ceci vous guidera pour créer une nouvelle partition. Suivez les invites pour saisir le type de partition, le secteur de départ, la taille et d'autres informations. Supprimer la partition :d Cela vous guidera pour sélectionner la partition que vous souhaitez supprimer. Suivez les invites pour sélectionner le numéro de partition à supprimer. Modifier le type de partition : cela vous guidera pour sélectionner la partition dont vous souhaitez modifier le type. D'après la mention

See all articles