4.删除已经废弃的分区边界
通过刚才所执行的查询我们可以看到,只有分区3,4,5当中有数据,如何才能将所有分区向左移动一位?
此时我们只需要删除最左侧的分区边界
(1)执行如下语句,从OrdersRange 分区表中删除2003年第3季度的分区边界:
ALTER PARTITION FUNCTION OrderDateRangePFN()
MERGE RANGE ('20030701')
GO
MERGE RANGE ('20030701')
GO
(2)此时我们的分区表中将只包含3个有数据的分区和1个空分区。执行如下语句进行核实,注意现在分区2,3,4当中有数据
SELECT $partition.OrderDateRangePFN(OrderDate)
AS 'Parition Number'
, min(OrderDate) AS 'Min Order Date'
, max(OrderDate) AS 'Max Order Date'
, count(*) AS 'Rows In Partition'
FROM OrdersRange
GROUP BY $partition.OrderDateRangePFN(OrderDate)
ORDER BY 1
GO
AS 'Parition Number'
, min(OrderDate) AS 'Min Order Date'
, max(OrderDate) AS 'Max Order Date'
, count(*) AS 'Rows In Partition'
FROM OrdersRange
GROUP BY $partition.OrderDateRangePFN(OrderDate)
ORDER BY 1
GO
(3)Merge操作删除了分区1,因此SQL Server对现有分区进行了重新编号,但并没有移动任何数据,只是改变了分区号。正因如此,数据库所使用的文件组并没有发生改变。执行如下语句进行查询:
SELECT * FROM sys.filegroups
(4)之前分区2存放在2003Q3 文件组,但现在该文件组已经不再与该分区表相关联了。执行如下语句,可以查看各个分区及其相关联的文件组:
SELECT ps.name AS PSName,
dds.destination_id AS PartitionNumber,
dds.data_space_id AS FileGroup,
fg.name AS FileGroupName
FROM (((sys.tables AS t
INNER JOIN sys.indexes AS i
ON (t.object_id = i.object_id))
INNER JOIN sys.partition_schemes AS ps
ON (i.data_space_id = ps.data_space_id))
INNER JOIN sys.destination_data_spaces AS dds
ON (ps.data_space_id =
dds.partition_scheme_id))
INNER JOIN sys.filegroups AS fg
ON dds.data_space_id = fg.data_space_id
WHERE (t.name = 'OrdersRange')
AND (i.index_id IN (0,1))
dds.destination_id AS PartitionNumber,
dds.data_space_id AS FileGroup,
fg.name AS FileGroupName
FROM (((sys.tables AS t
INNER JOIN sys.indexes AS i
ON (t.object_id = i.object_id))
INNER JOIN sys.partition_schemes AS ps
ON (i.data_space_id = ps.data_space_id))
INNER JOIN sys.destination_data_spaces AS dds
ON (ps.data_space_id =
dds.partition_scheme_id))
INNER JOIN sys.filegroups AS fg
ON dds.data_space_id = fg.data_space_id
WHERE (t.name = 'OrdersRange')
AND (i.index_id IN (0,1))