日期:2014-05-18  浏览次数:20728 次

请教sql2008中的分区表如何删除分区?
一个表,现阶段每天有100万左右的数据,以后还会增加。目前该表性能很差,打算把这个表按天分区,且只保存最近3个月的数据,对于超过3个月的旧数据,就用作业自动删除掉。
了解了下,对sqlserver的分区表,可以用split 来增加分区,用merge来合并分区,但merge合并分区后,原来分区中的数据并不会删除。用什么方法可以把原来分区中的数据删除掉呢,千万别是按分区来delete数据啊,这个语句可耗时了。
像oracle中有alter table xxx drop partition yyy,我要实现的就是这样的功能。
谢谢。

------解决方案--------------------
具体没操作过,可以看看这个文章 

http://blog.csdn.net/smallfools/archive/2009/12/04/4937878.aspx
------解决方案--------------------
其实实现的方式很多,个人觉得分区的概念是希望避免出现del数据的情况;否则定期生成新表(按月的方式),再定期删除(drop)相比更好用,基本上SQL2K下是类似这样的方式实现分区效果。

------解决方案--------------------
给你个2008的。http://blog.csdn.net/bhtfg538/archive/2010/05/12/5583583.aspx
------解决方案--------------------
不用delete,可以使用truncate来删除,建立一个临时表结构和原表一样的,具体代码如下:
select object_name([object_id]),* from [sys].[partitions]
where [object_id]=object_id('table_name') 
order by [partition_number],[index_id]

select object_name([object_id]),* from [sys].[partitions]
where [object_id]=object_id('table_name_temp') 
order by [partition_number],[index_id]

alter table table_name switch partition 1 to table_name_temp partition 1

truncate table table_name_temp
------解决方案--------------------
switch
------解决方案--------------------
先switch到临时表中,然后merge。
如果不需要保存数据,可以drop临时表
------解决方案--------------------
分区表中有数据时是不能够删除的,只能将数据先移到其它表中,再删除。
所括分区函数和分区方案在分表中未删除之前都是不可以删除的。
------解决方案--------------------
sql server删除分区只能用merge
你如果同事需要删除数据的话得分两步走:
1.先建一张临时表,然后把要删除的书switch到这张临时表里;
2.与相邻的分区merge。
------解决方案--------------------
例如要将A表某天数据删除,首先该表应该是以天为单位的分区表,
需要如下操作:
1.建一个和A表一样的B表,
2.然后用switch语句将A表中某天数据移动到B表,
3.再将B表整个drop,
4.最后用Merge命令将A表中的空白分区合并

我前些天做过一个动态删除多个表数据的工具,这样做效率很高