SQL Server文件组
在一个最简化的SQL Server数据库中,包含两种操作系统文件:数据文件和日志文件。
数据文件包含数据和一些对象,如表,索引,存储过程,视图等;
日志文件包含恢复数据库事务的信息。
数据库文件
SQL Server数据库有三种文件。
Primary文件,每个数据库都有一个主要文件,使用.mdf扩展名。
Secondary文件,次要文件是可选的,用户定义的。次要文件可以分布在不同的磁盘,不同的硬盘,可用用来突破系统对文件大小的限制,也可以用来提升I/O,使用.ndf扩展名。
Transaction Log文件,每个数据库至少有一个日志文件,保存的日志信息用来恢复数据库,使用.ldf扩展名。
举例来说,一个简单的数据库可以创建为包含一个主要文件和一个日志文件,所有的数据和对象都放在主要文件;一个稍微复杂的数据库可以创建一个主要文件,五个次要文件,所有的数据和对象分布在这六个文件之中,并由多个日志文件记录事务信息。
默认情况下,数据和日志是存放在同一硬盘的同一路径,这是用来对应单硬盘系统。然而,在生产环境中,这并不是最优的选择,建议将数据和日志放在不同的硬盘。
文件组
每个数据库都含有一个primary文件组,这个主文件组包含主要数据文件和一些没有放入其他文件组的次要文件。
举例来说,有三个数据文件data1.ndf,data2.ndf,data3.ndf,被放置在三个独立的硬盘上,都属于文件组group1,这个文件组里有数据表table1,对table1中数据的查询会在这三个硬盘上执行,这种方式会提升性能。
所有的数据文件需要被存储在下列文件组中:
Primary文件组,这个组里含有primary文件,另外,所有的系统表也都分配在这个文件组。这是默认文件组,对象在创建时,如果没有指定其他文件组,将被分配在这里。
User-defined文件组,用户创建的文件组。
使用文件组对SQL Server的优化
1、如果有多个独立硬盘,将文件组的每个文件分开放在每一个硬盘,提高I/O
2、将日志文件放在一个独立的硬盘上,与数据文件分开,日志文件属于写密集型操作,提高I/O
3、频繁访问的表和索引放到一个单独的文件组
4、包含text和image数据列的表放到一个单独的文件组,其中的text列和image列还可以放到独立的硬盘上(表分区)
5、只读表和只写表分别放入一个文件组,提高查询和更新速度
SQL Server分区
SQL Server支持表分区和索引分区,分区表和分区索引可以被放置在数据库的多个文件组中。数据是水平划分的,因此每组数据可以被映射到独立的分区。
企业版才支持分区,不同版本的SQL Server对分区的限制不同,具体参照msdn
分区的优势
1、快速高效地访问数据子集
2、更高效地对一个或多个分区进行维护操作
当SQL Server对数据进行sort操作的时候,首先是在分区里进行sort。当SQL Server同一时间只对一个硬盘进行访问的话,是有可能会降低性能的。为了提升性能,将数据分区并放在不同的硬盘,这种情况下,虽然SQL Server还是首先在分区里sort,但可以同时对多个硬盘进行操作,提高性能。
组件和概念
分区函数
数据库在定义怎样对表和索引分区的时候,是依据某个特定列的值,这个列称为分区列。也就是说,根据分区列,分区函数定义数据有多少个分区,以及这些分区的边界是什么。
分区方案
数据库要将一个分区函数产生的分区映射到一系列的文件组,将分区放置在独立文件组的主要原因是可以给每个分区独立的进行备份操作,每个文件组可以进行单独备份。
分区列
可以用来做索引列的数据类型就可以用来做分区列,除了timestamp,text,ntext,image,xml,varchar(max),nvarchar(max),varbinary(max)。CLR中用户定义的类型和别名数据类型也不可以被用作分区列。
对齐索引
对齐索引是索引与它所对应的表使用相同的分区方案。如果表与索引对齐,SQL Server则可以快速高效地切换分区,同时又能维护表及其索引的分区结构。索引要与其基表对齐,并不需要使用相同命名的分区函数。但是,索引和基表的分区函数必须在本质上相同,即
1)分区函数的参数必须具有相同的数据类型
2)分区函数定义了相同的分区数量
3)分区函数定义了相同的边界值
非对齐索引
下列情况中,设计非聚集索引是有用的:
1)基表未分区
2)索引键是唯一的,不包含表的分区列
3)需要基表与使用不同联接列的多个表一起参与组合联接
应用分区
创建分区函数
1 CREATE PARTITION FUNCTION pfYear (datetime) 2 AS RANGE Left FOR VALUES ('20130101','20140101','20150101')
创建分区方案
1 CREATE PARTITION SCHEME psArea 2 AS PARTITION pfYear 3 TO ( 4 Area01, 5 Area02, 6 Area03, 7 Area04)
使用分区方案
两种做法都需要重建分区聚集索引,也就是都需要最数据进行迁移,效率上差不多。
1)创建新表,指定分区方案
1 CREATE TABLE Users( 2 [Id] [int] IDENTITY(1,1) NOT NULL, 3 [Name] nvarchar(50), 4 [CreateTime] [datetime] 5 ) ON psArea([CreateTime])
2)对现有表分区
在分区方案上重建聚集索引。(现有表移到另一个filegroup需要删除聚集索引,在新filegroup上重建。)
1 CREATE UNIQUE CLUSTERED INDEX PK_Users ON Users(UserId) ON 2 PartitionSchemeName (UserId)