Sql 如何通过分区归档旧数据
我正在做滑动窗口分区来归档旧数据,但是当我试图归档第二天的数据时,我只能归档第一天的数据,这会引发以下错误 Msg 4905,16级,状态1,第1行ALTER TABLE开关语句 失败。目标表“bank.dbo.tblFactsStaging”必须为空 我用来将分区移动到归档表的查询是Sql 如何通过分区归档旧数据,sql,sql-server,Sql,Sql Server,我正在做滑动窗口分区来归档旧数据,但是当我试图归档第二天的数据时,我只能归档第一天的数据,这会引发以下错误 Msg 4905,16级,状态1,第1行ALTER TABLE开关语句 失败。目标表“bank.dbo.tblFactsStaging”必须为空 我用来将分区移动到归档表的查询是 ALTER TABLE dbo.tblFacts SWITCH PARTITION 1 TO dbo.tblFactsStaging ; 如果试图将数据切换到已分区的表中,则需要指定目标分区。比如: AL
ALTER TABLE dbo.tblFacts
SWITCH PARTITION 1 TO dbo.tblFactsStaging
;
如果试图将数据切换到已分区的表中,则需要指定目标分区。比如:
ALTER TABLE dbo.tblFacts SWITCH PARTITION 1 TO dbo.tblFactsStaging partition 5;
以上假设源和目标在很多方面匹配(文件组、索引等)。但是,当我在过去做过这种事情时,我将数据切换到一个非分区表中,确保索引正确地适合最终的目标,它位于正确的文件组中,等等。然后我会将其切换到存档中。我发现这样做更加灵活,因为您的实时数据和归档不需要具有相同的索引或数据位置
查看更多信息
编辑:下面是一个在表之间切换分区的简单示例。请注意,这两个表使用相同的分区方案(扩展为分区函数),这使得事情变得简单,因为源分区和目标分区应该始终相同,并且您只需对分区函数进行一次维护(即拆分和合并范围)。另外,要注意,任何分区函数维护都是在实际受影响的时间段之外完成的,以最大限度地减少数据移动。在我的示例中,我希望在向2015-01-01分区添加任何数据很久之后对其进行归档,并希望在向其添加任何数据之前创建2016-01-01分区
use tempdb;
create partition function [PF_PartitionTest] (date)
as range right
for values (
'2015-01-01',
'2015-02-01',
'2015-03-01',
'2015-04-01',
'2015-05-01',
'2015-06-01',
'2015-07-01',
'2015-08-01',
'2015-09-01',
'2015-10-01',
'2015-11-01',
'2015-12-01'
);
create partition scheme [PS_PartitionTest]
as partition [PF_PartitionTest]
all to ([primary]);
create table dbo.PartitionTest (
[ID] int identity not null,
[PeriodDate] date not null,
constraint [PK_PartitionTest] primary key clustered ([ID], [PeriodDate]),
[Fluff] varchar(500) null
) on [PS_PartitionTest] ([PeriodDate]);
insert into dbo.PartitionTest ([PeriodDate])
select dateadd(day, Number, '2014-12-31')
from dbadmin.dbo.Numbers
where Number <= 365;
select *, $Partition.[PF_PartitionTest]([PeriodDate])
from dbo.PartitionTest;
create table dbo.PartitionTest_Archive (
[ID] int identity not null,
[PeriodDate] date not null,
constraint [PK_PartitionTest_Archive] primary key clustered ([ID], [PeriodDate]),
[Fluff] varchar(500) null
) on [PS_PartitionTest] ([PeriodDate]);
ALTER TABLE dbo.PartitionTest
SWITCH PARTITION 2
TO dbo.PartitionTest_Archive partition 2;
alter partition function [PF_PartitionTest]()
merge range ('2015-01-01');
alter partition function [PF_PartitionTest]()
split range ('2016-01-01');
select min([PeriodDate]), max([PeriodDate])
from dbo.PartitionTest;
select min([PeriodDate]), max([PeriodDate])
from dbo.PartitionTest_Archive;
使用tempdb;
创建分区函数[PF_PartitionTest](日期)
如右图所示
价值观(
'2015-01-01',
'2015-02-01',
'2015-03-01',
'2015-04-01',
'2015-05-01',
'2015-06-01',
'2015-07-01',
'2015-08-01',
'2015-09-01',
'2015-10-01',
'2015-11-01',
'2015-12-01'
);
创建分区方案[PS\U PartitionTest]
as分区[PF_分区测试]
全部到([主]);
创建表dbo.PartitionTest(
[ID]整数标识不为空,
[PeriodDate]日期不为空,
约束[PK_PartitionTest]主键群集([ID],[PeriodDate]),
[Fluff]varchar(500)null
)在[PS_分区测试]([PeriodDate]);
插入dbo.PartitionTest([PeriodDate])
选择日期添加(日期、编号,“2014-12-31”)
来自dbadmin.dbo.Numbers
其中数字Hi@Ben Thul,目标表是非分区表(普通表)。这可能是您想要的结束状态,但这不是您机械地执行的方式。您需要在归档表中创建一个空分区,将数据切换到其中,然后将两个位置合并为一个,以完成您希望执行的操作。