常用SQL
查看当前系统中的分区情况
-- 查询所有分区占用情况
select $PARTITION.PartitionFunctionDateTime(Col) as 分区编号,
count(Id) as 记录数 from A group by $PARTITION.PartitionFunctionDateTime(Col)
其中 A 为表名,PartitionFunctionDateTime 为分区函数, Id为表中主键名.
复制表数据
insert into A select * from B
分区函数
分区函数是数据库中的一个独立对象,它将表的行映射到一组分区,所以分区函数解决的是HOW的问题,即表如何分区的问题。创建分区函数时,必须指明数据分区的边界点以及分区依据列,这样便知道如何对表或索引进行分区。
每个boundary_value属于属于每个边界值间隔的哪一侧(左侧还是右侧)
-- PartitionFunctionDateTime 分区函数名称
CREATE PARTITION FUNCTION PartitionFunctionDateTime( datetime )
AS RANGE RIGHT
FOR VALUES ('2013-01-01 00:00:00','2014-01-01 00:00:00')
此例中是采用的时间分区方案
分区方案
CREATE PARTITION SCHEME [SchemeDateTime] AS PARTITION [PartitionFunctionDateTime] TO
([SECTION2013], [SECTION2014], [SECTION2015])
自动按年份递增的方式创建文件及文件组
-- 按年来创建分区
DECLARE
@fileGroupName VARCHAR(200),
@fileNamePath VARCHAR(200),
@fileName VARCHAR(200),
@databaseName VARCHAR(200), -- 数据库名
@nextYear VARCHAR(200), -- 时间字段名字
@nextRange VARCHAR(200), -- 时间范围值
@sql NVARCHAR(1000)
-- 数据库文件名字等
-- SET @nextYear=LEFT(REPLACE(REPLACE(REPLACE(CONVERT(varchar, GETDATE(), 120 ),'-',''),' ',''),':',''), 8)
-- SET @nextYear=REPLACE(REPLACE(REPLACE(CONVERT(varchar, GETDATE(), 120 ),'-',''),' ',''),':','')
-- SET @nextYear=CONVERT(varchar, GETDATE(), 120 )
-- 获取分区表
SELECT @nextYear =DATENAME(yyyy, CONVERT(datetime,MAX(value)))
FROM SYS.PARTITION_RANGE_VALUES PRV
SET @nextYear=CONVERT(int, @nextYear) + 1
-- PRINT @nextYear
-- 设置数据库名
SET @databaseName='A'
-- 创建文件组,例如: SECTION2013
SET @fileGroupName='SECTION'+@nextYear
-- PRINT @fileGroupName
SET @sql='ALTER DATABASE ['+@databaseName+'] ADD FILEGROUP '+@fileGroupName
PRINT @sql
EXEC(@sql)
SET @fileName=N'DB' + @nextYear
SET @fileNamePath='C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\' + @fileName +'.NDF'
SET @sql='ALTER DATABASE ['+@databaseName+'] ADD FILE (
NAME='''+@fileName+''',
FILENAME=N'''+@fileNamePath+'''
size=10MB,
filegrowth=10%
) TO FILEGROUP'+' '+@fileGroupName
PRINT @sql
PRINT 1
EXEC(@sql)
PRINT 2
--修改分区方案,用一个新的文件组用于存放下一新增的数据
SET @sql='ALTER PARTITION SCHEME [SchemeDateTime] NEXT USED'+' '+@fileGroupName
EXEC(@sql)
--分区架构
PRINT 3
SET @nextRange=CONVERT(datetime,'1/1/'+@nextYear,101)
ALTER PARTITION FUNCTION [PartitionFunctionDateTime]() --分区函数
SPLIT RANGE (@nextRange)
其他
-- 获取分区函数中分隔参数
SELECT * FROM SYS.PARTITION_RANGE_VALUES ORDER BY VALUE DESC
-- 查询出分区界限中的最大值
SELECT MAX(value) FROM SYS.PARTITION_RANGE_VALUES PRV
-- Style=101时,表示日期字符串为:mm/dd/yyyy格式
SELECT CONVERT(datetime,'11/1/2003',101)
分区表简介
分区表在逻辑上是一个表,而物理上是多个表。从用户角度来看,分区表和普通表是一样的。使用分区表的主要目的是为改善大型表以及具有多个访问模式的表的可伸缩性和可管理性。
分区表是把数据按设定的标准划分成区域存储在不同的文件组中,使用分区可以快速而有效管理和访问数据子集。
适合做分区表的情况
◊ 数据库中某个表的数据很多,在查询数据时会明显感觉到速度很慢,这个时候需要考虑分区表;
◊ 数据是分段的,如以年份为分隔的数据,对于当年的数据经常进行增删改查操作,而对于往年的数据几乎不做操作或只做查询操作,这种情况可以使用分区表。对数据的操作如果只涉及一部分数据而不是全部数据的情况可以考虑分区表,如果一张表的数据经常使用且不管年份之类的因素经常对其增删改查操作则最好不要分区。
分区表的优点
◊ 分区表可以从物理上将一个大表分成几个小表,但是从逻辑上来看还是一个大表。
◊ 对于具有多个CPU的系统,分区可以对表的操作通过并行的方式进行,可以提升访问性能。
创建分区表步骤
创建分区表的步骤分为5步:
(1)创建数据库文件组
(2)创建数据库文件
(3)创建分区函数
(4)创建分区方案
(5)创建分区表