日期:2014-05-17  浏览次数:20492 次

关于索引和分区表的操作(高手进)
我有一个表大量数据,在该表上有三个索引
1。聚合索引(包含三个字段)
2。唯一非聚合索引(包含两个字段)
3。非聚合索引(一个字段)
该表已经被分区,而且聚合索引中包含分区列,但是其他索引都不包含

现在我希望对该表进行switch out的操作,该如何进行。

PS:不能改表结构,如果需要更改必须还原
索引 分区

------解决方案--------------------
switch out是啥。。。ALTER TABLE里的switch to吗?
------解决方案--------------------
还是bcp里的switch选项
------解决方案--------------------
把索引全部禁用或者删除,创建脚本备份,做完后重建,应该就没啥问题了,分区函数要注意一下
------解决方案--------------------
 合并分区 再SWITCH OUT 再分区吧
------解决方案--------------------
你的意思是在分区的上面再划分分区/
------解决方案--------------------
引用:
怎么引用啊,哪个高手教我一下







------解决方案--------------------
引用:
怎么引用啊,哪个高手教我一下


别人回复框的右下角
------解决方案--------------------
是合并分区吗?改改分区函数就行了,然后分区索引重建一下
------解决方案--------------------
转移分区数据,alter table t_lock switch partition 1 to t_lockHistory partition 1,结构保留
 
 

------解决方案--------------------
切换分区,你要先准备一个结构完全一样的表,然后把分区切过去。
------解决方案--------------------
建立一个历史表,跟你这个表的结构一模一样,然后直接把表的分区切换到历史表,然后删除历史表,然后合并分区。
这个过程中,只有在切换分区的时候需要1秒左右的时间,而且删除历史表的时候不会对数据库有任何阻塞,因为历史表只有你在用。这个过程没有索引的删除和重建,同时,日志的增大只会出现在删除历史表的操作上
------解决方案--------------------
引用:
回19楼

我想你可能没有这样做过吧
如果不删除唯一索引就直接作分区切换的话,在唯一索引的那个地方就会报错的。
因为这个唯一索引是没有分区的,它会阻止你的分区切换的操作。

(注意:我在开始就说了,唯一索引是不包含分区字段的)


在建立唯一索引时,如果唯一索引不包含 分区字段,不会报错吗? 你是怎么建成这个唯一索引的呀。

我怎么在建不包含分区字段的唯一索引时,会报错呀,这里的wcDate是分区列,wcT表已经有一个聚集索引:

create unique index uni_wcT_v on wcT(uni_v1,uni_v2)

消息 1908,级别 16,状态 1,第 1 行
列 'wcDate' 是索引 'uni_wcT_v' 的分区依据列。唯一索引的分区依据列必须是索引键的子集。

------解决方案--------------------
我知道了,你肯定是在建表后,先建的唯一索引,然后再把表进行分区,这样就没有报错的问题了。

建一个分区表,再建立索引的时候,唯一索引、聚集索引都必须包含分区列,否则就会报错,
当然如果是上面说到的先建唯一索引,再把表改造为分区表,就不会报错。
另外,非聚集索引(不唯一)是可以不包含分区列的。

但不得不说到一个很重要的区别,就是包含了分区列和不包含分区列的索引的区别,
包含分区列的索引,可以称为分区索引,而不包含的就是全局索引。

一旦进行了分区操作,比如合并分区,删除分区,你所建立的全局索引:不包含分区列的唯一索引,自然就无效了,因为这个索引不包含分区列,导致当一个分区的数据放到另一个分区时,它还以为那个数据在原来的地方,实际上已经在新的分区了,所以必须要重建。

建议你还是在唯一索引中增加分区列把,而且这样性能应该会更好才对,不过有可能不符合你的需求,
比如原来两字段的值是1和1,现在增加了分区列,可能导致表中有多个1和1的组合,就是因为增加了分区列,
这样会导致原来的两个字段的数据只是在一个分区中不重复,但在整个表中会有重复。
------解决方案--------------------
又试了一下,我在上面说的有点问题,我上面之所以在建立唯一索引报错是因为,我的分区表有个primary key,是聚集索引,包含了分区列,

而你的分区表,有一个聚集索引,包含了分区列,这时建不包含分区列的唯一索引不会报错,
但每次进行分区操作时,你说必须要删除这个唯一索引,上面说到分区操作会导致不包含分区列的唯一索引,失效,所以必须要重建,当数据量大时,重建索引时间很长,无法通过这个索引来访问数据的时间也会很长,大大降低数据的可访问性。

简单来说,就是没办法,不管是在sql server,还是oracle,都是没办法