sqlserver创建分区表

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_38357227/article/details/88262620

–创建文件组

   ALTER DATABASE InsideTSQL2008 ADD FILEGROUP [InsideTSQL2008_FileGroup_1]
ALTER DATABASE InsideTSQL2008 ADD FILEGROUP [InsideTSQL2008_FileGroup_2]
ALTER DATABASE InsideTSQL2008 ADD FILEGROUP [InsideTSQL2008_FileGroup_3]
ALTER DATABASE InsideTSQL2008 ADD FILEGROUP [InsideTSQL2008_FileGroup_4]
GO

–给文件组添加文件
一个文件组一个文件,便于管理。
根据表实际情况预估文件属性,这里设置初始大小为5M,增量为10%,也可以指定为具体数字。最大值不设限制。

 alter database InsideTSQL2008 add file
 (name=InsideTSQL2008_File_1,filename='C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\InsideTSQL2008_File_1.ndf',SIZE=5MB,
 maxsize=UNLIMITED,filegrowth=10%) to filegroup [InsideTSQL2008_FileGroup_1];
 alter database InsideTSQL2008 add file
 (name=InsideTSQL2008_File_2,filename='C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\InsideTSQL2008_File_2.ndf',SIZE=5MB,
 maxsize=UNLIMITED,filegrowth=10%) to filegroup [InsideTSQL2008_FileGroup_2];
  alter database InsideTSQL2008 add file
 (name=InsideTSQL2008_File_3,filename='C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\InsideTSQL2008_File_3.ndf',SIZE=5MB,
 maxsize=UNLIMITED,filegrowth=10%) to filegroup [InsideTSQL2008_FileGroup_3];
  alter database InsideTSQL2008 add file
 (name=InsideTSQL2008_File_4,filename='C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\InsideTSQL2008_File_4.ndf',SIZE=5MB,
 maxsize=UNLIMITED,filegrowth=10%) to filegroup [InsideTSQL2008_FileGroup_4];

–查看数据库中文件情况

select name,type_desc,physical_name,state_desc,size,growth
from sys.database_files

–创建分区函数,这里已date类型字段作为分区列
–left 和right表示临界值放在左边还是右边

  Create Partition Function test_steel_0330(datetime)
 as range left for values(
'20060701','20070701','20080701')

–创建分区方案
–多创建一个文件组,指定为要使用的下一个文件组

  Create Partition SCHEME test_steel_0330_2
 as partition test_steel_0330
   To(
 InsideTSQL2008_FileGroup_1,
 InsideTSQL2008_FileGroup_2,--如果要在同一分区也要指定多次 (InsideTSQL2008_FileGroup_1,)
 InsideTSQL2008_FileGroup_3,
 InsideTSQL2008_FileGroup_4)

–分区列创建聚集索引,分区表的分区列必须为聚集索引,且需要注意聚集索引创建位置

–创建分区表

create table Orders (
 [orderid] [int] IDENTITY(1,1) NOT NULL,
    [custid] [int] NULL,
    [empid] [int] NOT NULL,
    [orderdate] [datetime] NOT NULL,
    [requireddate] [datetime] NOT NULL,
    [shippeddate] [datetime] NULL,
    [shipperid] [int] NOT NULL,
    [freight] [money] NOT NULL CONSTRAINT [DFT_Orders_freight]  DEFAULT ((0)),
    [shipname] [nvarchar](40) NOT NULL,
    [shipaddress] [nvarchar](60) NOT NULL,
    [shipcity] [nvarchar](15) NOT NULL,
    [shipregion] [nvarchar](15) NULL,
    [shippostalcode] [nvarchar](10) NULL,
    [shipcountry] [nvarchar](15) NOT NULL
)on test_steel_0330_2(orderdate)

–删除索引

ALTER TABLE [Sales].[OrderDetails] DROP CONSTRAINT [FK_OrderDetails_Orders]


ALTER TABLE [Sales].[Orders] DROP CONSTRAINT [PK_Orders]

–添加索引

ALTER TABLE [Sales].[Orders] ADD  CONSTRAINT [PK_Orders] PRIMARY KEY NONCLUSTERED 
(
    [orderid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)

–创建分区索引

CREATE CLUSTERED INDEX [ClusteredIndex_on_test_steel_0330_2_636460039345041341] ON [Sales].[Orders]
(
    [orderdate]
)WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [test_steel_0330_2]([orderdate])

–删除分区索引

扫描二维码关注公众号,回复: 5532978 查看本文章
DROP INDEX [ClusteredIndex_on_test_steel_0330_2_636460039345041341] ON [Sales].[Orders]

ALTER TABLE [Sales].[OrderDetails]  WITH CHECK ADD  CONSTRAINT [FK_OrderDetails_Orders] FOREIGN KEY([orderid])
REFERENCES [Sales].[Orders] ([orderid])
ALTER TABLE [Sales].[OrderDetails] CHECK CONSTRAINT [FK_OrderDetails_Orders]

commit

–查询分区和文件组信息

select convert(varchar(50),ps.name) as partition_schema,
p.partition_number,
convert(varchar(20),ds2.name) as filegroup ,
convert(varchar(19),isnull(v.value,''),120) as rage_boundary,
str(p.rows,9) as rows
from sys.indexes i 
join sys.partition_schemes ps on i.data_space_id=ps.data_space_id
join sys.destination_data_spaces dds on ps.data_space_id=dds.partition_scheme_id
join sys.data_spaces ds2 on dds.data_space_id=ds2.data_space_id
join sys.partitions p on dds.destination_id=p.partition_number and p.object_id=i.object_id and p.index_id=i.index_id
join sys.partition_functions pf on ps.function_id=pf.function_id
left join sys.partition_range_values v on pf.function_id=v.function_id and v.boundary_id=p.partition_number-pf.boundary_value_on_right
where i.object_id=object_id('test_parti') 
and i.index_id in(0,1)
order by p.partition_number

–查询表与分区信息

select partition = $partition.[test_parti_func]([PERIOD_DATE])
      ,rows      = count(*)
      ,minval    = min([PERIOD_DATE])
      ,maxval    = max([PERIOD_DATE])
  from test_parti
 group by $partition.test_parti_func([PERIOD_DATE])
 order by partition

–查询分区依据列为2007-01-20的数据在哪个分区上

select $partition.test_steel_0330('2007-01-20')  --返回值是2,表示此值存在第2个分区 

–查询每个分区中的记录
–$PARTITION函数可以得到物理分区表的编号

select * from sales.Orders where $PARTITION.test_steel_0330(orderdate)=2 

–查看分区表中,每个非空分区存在的行数

select $partition.test_steel_0330(orderdate) as partitionNum,count(*) as recordCount
from sales.Orders
group by  $partition.test_steel_0330(orderdate)

–分区拆分,即增加一个边界值

alter partition function bgPartitionFun()
split range(N'20070101')  --将第二个分区拆为2个分区

–合并分区,即删除一个边界值

alter partition function bgPartitionFun()
merge range(N'20070101')  --将第二第三分区合并

–切换分区,即将已填充的表或分区与空的表或分区进行交换

alter table sales.orders switch partion 1 to test

----新增下一个月分区的存储过程
可根据分区字段的实际情况建立定时执行作业,在日期到来前及时创建下一个分区文件组及文件

 create procedure partition_add
					@dbname varchar(50),
					@pname varchar(8),
					@foldername nvarchar(20),
					@parti_scheme  varchar(100),
					@parti_function  varchar(100)
as
declare @fgname varchar(7)
declare @splitpoint varchar(23)
declare @sql varchar(1000)
declare @point varchar(8)
set @fgname='P'+@pname
set @splitpoint=convert(varchar(10),dateadd(m,1,cast(@pname as datetime)),121)
set @sql='ALTER DATABASE ['+@dbname+'] ADD FILEGROUP '+@fgname
exec('ALTER DATABASE ['+@dbname+'] ADD FILEGROUP ['+@fgname+']')
set @sql='ALTER DATABASE ['+@dbname+'] ADD FILE (NAME = N'''+@fgname+'_ndf'', FILENAME = '''+@foldername+@fgname+'.ndf'' ,SIZE = 5120KB , FILEGROWTH = 1024KB ) TO FILEGROUP '+@fgname
exec(@sql)
set @sql='ALTER PARTITION SCHEME ['+@parti_scheme +'] NEXT USED '+@fgname
exec(@sql)
set @sql='ALTER PARTITION FUNCTION ['+@parti_function +']() SPLIT RANGE(N'''+@splitpoint+''')'
exec(@sql)

补充知识点
索引对齐:索引对齐,按存储位置对齐的表
索引对齐:假如你想让数据与索引分开到不同的文件,可以使用两个不同的分区方案,但是使用同一个分区函数,这样就把索引分开了
存储位置对齐:创建非聚集索引的时候设置【数据空间规范】,两个索引对象可以使用相同的分区架构,并且具有相同分区键的所有数据行最后将位于同一个文件组中。这就叫存储位置对齐。(数据和索引在同一文件中)。

*当多个表使用同一个函数(但不一定使用同一个架构)时,将按类似的方式对具有相同分区键的行进行分组。此概念称为对齐。通过将来自多个表但具有相同分区键的行对齐到相同或不同的物理磁盘上,SQL SERVER 可以只处理每个表中比要的数据组。
要实现对齐,两个分区表或索引坐在的相应分区之间必须具有某种对应性。他们必须为分区列使用等效的分区函数。如果满足以下条件,两个分区函数则可以用来对齐数据。

两个分区函数使用相同数量的参数和分区
每个函数中使用的分区键具有相同的类型(包括长度和精度,如果使用,还包括缩放和排序)
边界值相等(包括LEFT/RIGHT 边界标准)

猜你喜欢

转载自blog.csdn.net/weixin_38357227/article/details/88262620