【问题标题】:Drop empty partition objects after truncate partition截断分区后删除空分区对象
【发布时间】:2020-05-06 21:40:02
【问题描述】:

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

此外,每个分区与一个文件组相关联,每个文件组只有一个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 Server 不允许删除:它说它仍在使用中。 我的理解是,我仍然需要调整 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);

如果我需要更改的话,谁能告诉我如何更改这两个对象?

【问题讨论】:

    标签: sql-server partitioning sql-server-2017 filegroup table-partitioning


    【解决方案1】:

    很容易对文件所在的文件组感到困惑。退后一步,我不会删除文件或文件组。通常,我根本不会真正拥有文件组。只需创建将所有分区映射到单个文件组的分区方案,除非您有充分的理由不这样做。

    这里有一个截断分区并删除其文件和文件组的演示。

    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
    

    【讨论】:

    • 感谢您的脚本和整个答案。我进行此设置的唯一原因是能够备份-恢复每月数据,这只能在文件组级别完成。
    猜你喜欢
    • 1970-01-01
    • 2020-10-05
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    • 2020-01-07
    • 2022-08-03
    • 1970-01-01
    相关资源
    最近更新 更多