22,209
社区成员
发帖
与我相关
我的任务
分享
SELECT
CASE pf.boundary_value_on_right
WHEN 0 THEN p.partition_number
ELSE p.partition_number - 1
END
FROM sys.objects obj
JOIN sys.indexes ind ON obj.object_id = ind.object_id
JOIN sys.partition_schemes ps ON ind.data_space_id = ps.data_space_id
JOIN sys.partition_functions pf ON ps.function_id = pf.function_id
JOIN sys.partitions p ON ( obj.object_id = p.object_id AND ind.index_id = p.index_id )
LEFT JOIN sys.partition_range_values prv ON p.partition_number = prv.boundary_id
WHERE obj.name = 'Table1'
AND prv.value = DATEADD(MM, -2, CONVERT(DATE, DATEADD(DD, -1 * DATEPART(DD, GETDATE()) + 1, GETDATE())))
SELECT
CASE pf.boundary_value_on_right
WHEN 0 THEN p.partition_number - 1
ELSE p.partition_number - 2
END
FROM sys.objects obj
JOIN sys.indexes ind ON obj.object_id = ind.object_id
JOIN sys.partition_schemes ps ON ind.data_space_id = ps.data_space_id
JOIN sys.partition_functions pf ON ps.function_id = pf.function_id
JOIN sys.partitions p ON ( obj.object_id = p.object_id AND ind.index_id = p.index_id )
LEFT JOIN sys.partition_range_values prv ON p.partition_number = prv.boundary_id
WHERE obj.name = 'Table1'
AND prv.value = DATEADD(MM, -2, CONVERT(DATE, DATEADD(DD, -1 * DATEPART(DD, GETDATE()) + 1, GETDATE())))
假设分区函数和分区方案如下:
CREATE PARTITION FUNCTION PF_PartitionedByMonth_1 (date)
AS RANGE LEFT
FOR VALUES ('2014-12-01', '2015-01-01', '2015-02-01', '2015-03-01')
CREATE PARTITION SCHEME PS_PartitionedByMonth_1
AS PARTITION PF_PartitionedByMonth_1
TO ('PRIMARY', 'PRIMARY', 'PRIMARY', 'PRIMARY', 'PRIMARY')
假设表的定义如下
CREATE TABLE Table1
(
id int IDENTITY(1, 1)
, name varchar(30)
, gender bit
, spyndate date
CONSTRAINT PK_Table1 PRIMARY KEY CLUSTERED (id, spyndate)
) ON PS_PartitionedByMonth_1 (spyndate)
查询保留两个月数据以外的最近的分区号,语句如下:
SELECT
CASE pf.boundary_value_on_right
WHEN 0 THEN p.partition_number - 1
ELSE p.partition_number - 2
END
FROM sys.objects obj
JOIN sys.indexes ind ON obj.object_id = ind.object_id
JOIN sys.partition_schemes ps ON ind.data_space_id = ps.data_space_id
JOIN sys.partition_functions pf ON ps.function_id = pf.function_id
JOIN sys.partitions p ON ( obj.object_id = p.object_id AND ind.index_id = p.index_id )
LEFT JOIN sys.partition_range_values prv ON p.partition_number = prv.boundary_id
WHERE prv.value = DATEADD(MM, -2, CONVERT(DATE, DATEADD(DD, -1 * DATEPART(DD, GETDATE()) + 1, GETDATE())))