截断分区后删除空分区对象
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 function 和 partition 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
我有一个按日期列分区的 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 function 和 partition 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