CREATE proc[dbo].[Demo_FileGroup_Add]
as
declare
@file_name varchar(20),--要添加的文件名称
@add_sql nvarchar(max)--在文件组下添加新文件的SQL语句
begin
set @file_name='DemoFile'+left((convert(varchar,(DATEADD(yy, DATEDIFF(yy,0,(DATEADD(YY,1,GETDATE()))), 0)),120)),4)--动态拼接文件名
set @add_sql='
ALTER DATABASE Demo ADD FILE (
NAME='+@file_name+',
FILENAME=''D:\ProgramFiles\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\'+@file_name+'.mdf'',
SIZE=5MB,
FILEGROWTH=5MB)
TO FILEGROUP DemoFileGroup'
--select @add_sql
Exec sp_executesql@add_sql--执行向文件组中添加文件的SQL语句
alter partitionscheme DemoPartitionSchemenext used 'DemoFileGroup' --告知数据库新建立的分区放在哪个文件组(修改分区架构)
alter partitionfunction DemoPartitionFunction() split range (CONVERT(VARCHAR,DATEADD(yy, DATEDIFF(yy,0,(DATEADD(YY,1,GETDATE()))), 0),120))--在分区函数中添加分割点
end
declare
@num bigint, --id
@test_date datetime2(0),--时间
@test_desc varchar(300),--描述
@count int--计数器
begin
set @num= 0 --设置初始id
set @test_date= '2015-01-01 00:00:00'--设置初始日期
set @test_desc='屈贾谊于长沙,无非明主;窜梁鸿于海曲,岂乏明时?'
while (@test_date<'2019-01-01 00:00:00') --设置日期上限
begin
set@count = 0
while(@count<10)--每个时间点添加10条数据
begin
insertinto dbo.DemoTable values(@num,@test_date,@test_desc+CAST(@count as varchar)) --添加数据
set@count=@count+1 --计数自增
set@num = @num +1 --id自增
end
set@test_date = DATEADD(MI,1,@test_date) --每一个时间点添加完10条数据后,时间自增1分
end
end
图16 普通表存储信息
从图13与图15中可以看出,同样插入21038400行数据,分区表耗时3740秒,普通表耗时3920秒,分区表快4.6%。考虑到运行环境对测试数据的影响,在此我们先对此数据不做评价,毕竟4.6%不是很明显。
而从图14与图16的对比中可以看出,分区表的索引空间为0.125MB,而普通表的索引空间为0.008MB。那么为什么分区表的索引空间要比普通表的索引空间大呢?其实这个问题个人理解大致是:创建分区表就是将数据存储在不同的文件中,然后数据库会根据分区函数和分区架构,以分区列为索引列,创建分区索引来管理数据存放的位置,所以分区表的索引空间理所当然会比普通标表的索引空间大。
默认情况下,分区表中创建的索引使用与分区表相同分区架构和分区列,这样,索引将于表对齐。将表与其索引对齐,可以使管理工作更容易进行,对于滑动窗口方案尤其如此。若要启动分区切换,表的所有索引都必须对齐。
在创建索引时,也可以指定不同的分区方案(Schema)或单独的文件组(FileGroup)来存储索引,这样SQL Server 不会将索引与表对齐。 在已分区的表上创建索引(分区索引)时,应该注意以下事项:
l 唯一索引
建立唯一索引(聚集或者非聚集)时,分区列必须出现在索引列中。此限制将使SQL Server只调查单个分区,并确保表中宠物的新键值。如果分区依据列不可能包含在唯一键中,则必须使用DML触发器,而不是强制实现唯一性。
l 非唯一索引
对非唯一的聚集索引进行分区时,如果未在聚集键中明确指定分区依据列,默认情况下SQL Server 将在聚集索引列中添加分区依据列。
对非唯一的非聚集索引进行分区时,默认情况下SQL Server 将分区依据列添加为索引的包含性列,以确保索引与基表对齐,若果索引中已经存在分区依据列,SQL Server 将不会像索引中添加分区依据列。