截断分区后删除空分区对象

Drop empty partition objects after truncate partition

我有一个按日期列分区的 table,每个分区存储一个月的数据。

此外,每个分区关联一个文件组,每个文件组只有一个db文件(NDF)。

我的设置非常简单:

CREATE PARTITION FUNCTION MyPF (DATE)
AS RANGE RIGHT FOR VALUES (
'2019-09-01',
'2019-10-01',
'2019-11-01',
'2019-12-01');

CREATE PARTITION SCHEME MyPS PARTITION MyPF
TO (
FG_2019_08, 
FG_2019_09, 
FG_2019_10, 
FG_2019_11);

我需要定期截断一个随机月份(有时甚至从中间开始,不影响其他月份)。

我没有做复杂的切换,而是从 BOL 中发现,TRUNCATE TABLE 在我的 SQL Server 2017 中有 WITH 选项,所以我可以说:

TRUNCATE TABLE MyTable WITH (PARTITIONS(3));
TRUNCATE TABLE MyTable WITH (PARTITIONS(1));

这将从与 FG_2019_08 和 FG_2019_10 关联的文件中删除分区中的所有行。

效果很好,现在我有一个空文件,但是 SQL 服务器不允许删除:它说它仍在使用中。 我的理解是,我仍然需要调整 partition functionpartition schema ,以删除空的 NDF 文件。

我查看了 BOL,但我无法思考如何更改(合并?)边界值以反映上述更改。他们应该变成这样吧?:

ALTER PARTITION FUNCTION MyPF (DATE)
AS RANGE RIGHT FOR VALUES (
'2019-10-01',
'2019-12-01');

ALTER PARTITION SCHEME MyPS PARTITION MyPF
TO (
FG_2019_09, 
FG_2019_11);

任何人都可以告诉我如何改变这两个对象,如果我需要改变的话?

很容易搞不清东西在哪个文件组上。退后一步,我不会删除文件或文件组。通常,我根本不会有文件组。只需创建将所有分区映射到单个文件组的分区方案,除非您有充分的理由不这样做。

无论如何,这是一个截断分区并删除其文件和文件组的演示。

use master 
go
drop database parttest 
go
create database partTest
go
use partTest
go

alter database current add filegroup FG_2019_08
alter database current add filegroup FG_2019_09
alter database current add filegroup FG_2019_10
alter database current add filegroup FG_2019_11

ALTER DATABASE current 
ADD FILE 
(
    NAME = FG_2019_08,
    FILENAME = 'C:\temp\partTest_FG_2019_08.ndf',
    SIZE = 5MB,
    MAXSIZE = 100MB,
    FILEGROWTH = 5MB
)
TO FILEGROUP FG_2019_08;

ALTER DATABASE current 
ADD FILE 
(
    NAME = FG_2019_09,
    FILENAME = 'C:\temp\partTest_FG_2019_09.ndf',
    SIZE = 5MB,
    MAXSIZE = 100MB,
    FILEGROWTH = 5MB
)
TO FILEGROUP FG_2019_09;

ALTER DATABASE current 
ADD FILE 
(
    NAME = FG_2019_10,
    FILENAME = 'C:\temp\partTest_FG_2019_10.ndf',
    SIZE = 5MB,
    MAXSIZE = 100MB,
    FILEGROWTH = 5MB
)
TO FILEGROUP FG_2019_10;

ALTER DATABASE current 
ADD FILE 
(
    NAME = FG_2019_11,
    FILENAME = 'C:\temp\partTest_FG_2019_11.ndf',
    SIZE = 5MB,
    MAXSIZE = 100MB,
    FILEGROWTH = 5MB
)
TO FILEGROUP FG_2019_11;



CREATE PARTITION FUNCTION MyPF (DATE)
AS RANGE RIGHT FOR VALUES (
'2019-09-01',
'2019-10-01',
'2019-11-01'
);

CREATE PARTITION SCHEME MyPS AS PARTITION MyPF 
TO (
FG_2019_08, 
FG_2019_09, 
FG_2019_10, 
FG_2019_11
);
go

create table p ( d date ) on MyPs(d)

insert into p(d) values ('20190801'),('20190901'),('20191001'),('20191101')

declare @p int = $partition.MyPf('20190801')
TRUNCATE TABLE p WITH (PARTITIONS(@p));
set @p = $partition.MyPf('20191001')
TRUNCATE TABLE p WITH (PARTITIONS(@p));


alter partition function MyPF() merge range ('20190901')
alter database current remove file FG_2019_09
alter database current remove filegroup FG_2019_09