Удалить пустые объекты раздела после усеченного раздела - PullRequest
0 голосов
/ 20 января 2020

У меня есть таблица, разделенная столбцом даты, и каждый раздел хранит данные за один месяц.

Кроме того, каждый раздел связан с одной файловой группой, и у каждой файловой группы ровно один файл базы данных (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 имеет опцию WITH на моем SQL Server 2017, поэтому я могу просто сказать:

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

, который удалит все строки из раздела из файлов, связанных с FG_2019_08 и FG_2019_10.

Это прекрасно работает, и теперь у меня есть пустой файл, но SQL Сервер не позволяет удалить: он говорит, что он все еще используется. Насколько я понимаю, мне по-прежнему нужно настроить функцию разделов и схему разделов , чтобы удалить пустые файлы NDF.

Я извлек BOL, но я не могу обернуть голову, как изменить (объединить?) граничные значения, чтобы отразить указанные выше изменения. Они должны стать чем-то вроде этого, верно?

1 Ответ

1 голос
/ 21 января 2020

Легко запутаться в том, какие группы файлов существуют. Отступив назад, я бы не стал сбрасывать файлы или файловые группы. У меня вообще не было бы файловых групп, как обычно. Просто создайте схему разделов, отображающую все разделы в одну файловую группу, если только у вас нет веских причин не делать этого.

В любом случае, вот демонстрация усечения раздела и удаления его файла и файловой группы.

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
...