关于索引和分区表的操作(高手进)我有一个表大量数据,在该表上有三个索引1。聚合索引(包含三个字段)2。唯一非
关于索引和分区表的操作(高手进)
我有一个表大量数据,在该表上有三个索引
1。聚合索引(包含三个字段)
2。唯一非聚合索引(包含两个字段)
3。非聚合索引(一个字段)
该表已经被分区,而且聚合索引中包含分区列,但是其他索引都不包含
现在我希望对该表进行switch out的操作,该如何进行。
PS:不能改表结构,如果需要更改必须还原
[解决办法]
别人回复框的右下角
[解决办法]是合并分区吗?改改分区函数就行了,然后分区索引重建一下
[解决办法]转移分区数据,alter table t_lock switch partition 1 to t_lockHistory partition 1,结构保留
[解决办法]切换分区,你要先准备一个结构完全一样的表,然后把分区切过去。
[解决办法]建立一个历史表,跟你这个表的结构一模一样,然后直接把表的分区切换到历史表,然后删除历史表,然后合并分区。
这个过程中,只有在切换分区的时候需要1秒左右的时间,而且删除历史表的时候不会对数据库有任何阻塞,因为历史表只有你在用。这个过程没有索引的删除和重建,同时,日志的增大只会出现在删除历史表的操作上
[解决办法]在建立唯一索引时,如果唯一索引不包含 分区字段,不会报错吗? 你是怎么建成这个唯一索引的呀。
我怎么在建不包含分区字段的唯一索引时,会报错呀,这里的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,都是没办法,要想不这样,只能是加上分区列。