Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何通过分区归档旧数据_Sql_Sql Server - Fatal编程技术网

Sql 如何通过分区归档旧数据

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

我正在做滑动窗口分区来归档旧数据,但是当我试图归档第二天的数据时,我只能归档第一天的数据,这会引发以下错误

Msg 4905,16级,状态1,第1行ALTER TABLE开关语句 失败。目标表“bank.dbo.tblFactsStaging”必须为空

我用来将分区移动到归档表的查询是

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,目标表是非分区表(普通表)。这可能是您想要的结束状态,但这不是您机械地执行的方式。您需要在归档表中创建一个空分区,将数据切换到其中,然后将两个位置合并为一个,以完成您希望执行的操作。