ALTER TABLE SWITCH' statement failed. The table x' is partitioned while index 'x' is not partitioned.
1.L_Monitoring有这么些字段,ID,Collecttime,PlateType,PlateNO以及其他一些这段.
建立这个表的时候是个非分区表,其中ID是主键,并在Collecttime,PlateType,PlateNO上面建立了索引.
2.系统运行一阵子后,L_Monitoring数据变得非常大,5,6千万,而且后续还会更大.
所以要求将L_Monitoring表进行分区.分区方案是按照Collecttime进行每天分区.
Collecttime为分区字段,并将Collecttime字段改为聚集索引,原来主键ID改为非聚集索引.
请注意这个步骤:L_Monitoring表我是先建立索引,在建立分区;
3.系统要求清除三个月前的数据,只保留最近3个月的数据.所以,系统运行一阵子(3个月)后就需要清除数据.
加了JOB每天晚上从L_Monitoring删除数据,发现每天晚上数据库会在JOB执行删除的时候卡死.
或者说,每天晚上执行job的时候,对L_Monitoring表的操作会阻塞.
语句如下:delete L_Monitoring where Collecttime< '3个月前'
4.所以清除数据方法必须更改,不可单纯的用delete.所以改为SWITCH PARTITION的方法来删除数据.
这个方法的原理就是:
a.先建立一个和L_Monitoring结构一样的表:L_Monitoring_SwitchOut(L_Monitoring_SwitchOut这表我先用Collecttime分区,然后建立索引,请注意这个先后关系)
b.用ALTER TABLE L_Monitoring SWITCH PARTITION x TO L_Monitoring_SwitchOut PARTITION x语句将某一个分区的数据移动到L_Monitoring_SwitchOut,这个步骤是瞬时完成的
c.truncate table L_Monitoring_SwitchOut
所以,这种方法删除数据,按理说,会很快的.
5.可是ALTER TABLE L_Monitoring SWITCH PARTITION的时候,报错如下:
'ALTER TABLE SWITCH' statement failed. The table 'ITMP2.dbo.L_Monitoring' is partitioned while index 'IX_L_Monitoring_ID' is not partitioned.
其实这个错误提示得很明显了,index is not partitioned(索引没有分区),但是我当时没有搞清楚原理,所以导致各种实验.
原理就是:表的数据可以存不同分区,索引一样可存不同分区.
哎,我搞了好久,查了好多资料.
开始觉得有其他索引的表不能SWITCH,还试了SWITCH之前把索引删除,再SWITCH,然后recreate索引这种方法,这种方法可以swtich成功,但是每次recreate的时候也会阻塞.
最后各种实验终于发现在L_Monitoring表删除索引在recreate后,就可以swtich了.
好吧,可能你没看懂,为什么在索引第一次recreate后,就可以了呢.下面来解答:
1.表在建立索引的时候,如果表是分区表,则索引默认在分区上.
2.如果先建立索引,再分区,索引则在primary上;
所以,上面我步骤中,导致L_Monitoring和L_Monitoring_SwitchOut其实不同的,一个的索引在primary上,一个的索引在分区上.
明白了原理就好了,在上面第5步的时候, SWITCH之前,把PlateType,PlateNO,ID的索引删除在重建(只执行一次)就可以了.(或者利用stutio更改索引的stroage),重新建立的索引会在分区上,而L_Monitoring_SwitchOut的索引也是在分区后建立的,所以索引也存在分区上的.这样,2个表的结构才一模一样了,可以swtich了!
没代码和脚本,全文字,慢慢看吧,希望大家有帮助.
关键字:分区 delete 数据 卡死 分区表
ALTER TABLE SWITCH' statement failed. The table x' is partitioned while index 'x' is not partitioned.的更多相关文章
- 消息 4900,级别 16,状态 2,第 1 行 对表 'XX.XXX' 执行 ALTER TABLE SWITCH 语句失败。对于已启用更改跟踪的表,不可能切换其分区。请先禁用更改跟踪,再使用 ALTER TABLE SWITCH。
问题描述: 今天处理切换分区数据的时候出现了这个错误: 消息 4900,级别 16,状态 2,第 1 行 对表 'XX.XXX' 执行 ALTER TABLE SWITCH 语句失败.对于已启用更改跟 ...
- 'ALTER TABLE SWITCH' 语句失败。表'MGXXX.dbo.user_XXX' 已分区,但 索引'ix_user_XXX_user_id' 未分区。
问题描述: 今天在做分区切换的时候把旧log数据切到clear表,遇到了这个问题,顺便做下笔记记录一下解决方法 'ALTER TABLE SWITCH' 语句失败.表'MGXXX.dbo.user_X ...
- 【Oracle】ORA-55610: Invalid DDL statement on history-tracked table
—删除表emp1时出现问题 SCOTT@GOOD> drop table emp1; drop table emp1 * ERROR at line 1: ORA-55610: Invalid ...
- Nodes “-1” are listed in ADOP_VALID_NODES table but not in FND_NODES table
While trying to apply patches to upgrade to 12.2.4, adop failed due to the below errors. Validating ...
- html table表格导出excel的方法 html5 table导出Excel HTML用JS导出Excel的五种方法 html中table导出Excel 前端开发 将table内容导出到excel HTML table导出到Excel中的解决办法 js实现table导出Excel,保留table样式
先上代码 <script type="text/javascript" language="javascript"> var idTmr; ...
- mysql切换数据库提示警告:Reading table information for completion of table and column names
登录数据库后,选择数据库时发现以下提示, mysql> use testReading table information for completion of table and column ...
- alter system switch logfile与alter system archive log current的区别
以前知道 ALTER SYSTEM SWITCH LOGFILE对单实例数据库或RAC中的当前实例执行日志切换, ALTER SYSTEM ARCHIVE LOG CURRENT会对数据库中的所有实例 ...
- Truncate table、Delete与Drop table的区别
Truncate table.Delete与Drop table的区别 TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行.但 TRUNC ...
- table完美css样式,table的基本样式,table样式
table完美css样式,table的基本样式,table样式 >>>>>>>>>>>>>>>>> ...
随机推荐
- 如何维护一个1000 IP的免费代理池
楔子 好友李博士要买房了, 前几天应邀帮他抓链家的数据分析下房价, 爬到一半遇到了验证码. 李博士的想法是每天把链家在售的二手房数据都抓一遍, 然后按照时间序列分析. 链家线上在交易的二手房数据大概有 ...
- CLR via 随书笔记
CTS(common type system) 通用类型系统规定,一个类型可以包含零个或者多个成员,如下: 字段(Field): 作为对象状态一部分的数据变量.字段根据名称和类型来区分 方法( ...
- 使用beanstalkd实现定制化持续集成过程中pipeline
持续集成是一种项目管理和流程模型,依赖于团队中各个角色的配合.各个角色的意识和配合不是一朝一夕能练就的,我们的工作只是提供一种方案和能力,这就是持续集成能力的服务化.而在做持续集成能力服务化的过程中, ...
- plsql中文乱码问题方案解决
1.查看服务器端编码 a.select userenv('language') from dual; b.我实际查到的结果为:AMERICAN_AMERICA.ZHS16GBK 2.执行语句 ...
- Django Cookie 和 Sessions 应用
在Django里面,使用Cookie和Session看起来好像是一样的,使用的方式都是request.COOKIES[XXX]和request.session[XXX],其中XXX是您想要取得的东西的 ...
- WPF 只允许打开一个实例
我们有时候只希望我们的程序只打开一个实例,也就是我们的软件只有一次被打开. 那么我们可以通过一个办法知道,在这个软件打开前是不是打开过一个,还没关闭.也就是是否存在另一个程序在运行. 下面是一个简单方 ...
- JAVA提高七:类加载器
今天我们学习类加载器,关于类加载器其实和JVM有很大关系,在这里这篇文章只是简单的介绍下类加载器,后面学习到JVM的时候还会详细讲到类加载器,本文分为下面几个小节讲解: 一.认识类加载器 1.什么是类 ...
- Java8系列之初识
前言:终于有机会在工作中使用高版本的Java8,但是一直没有对java8中添加的新特性进一步了解过,所以趁着这个机会学习一下,能够在编程中熟练的使用. 一.接口的改变 我们知道,在java8版本以前, ...
- JAVA中HashMap和Hashtable区别
Hashtable和HashMap在Java面试中相当容易被问到,甚至成为了集合框架面试题中最常被考的问题,所以在参加任何Java面试之前,都不要忘了准备这一题. 我们先看2个类的定义 public ...
- Java基础总结--Java编程环境变量配置
1.jdk--bin--都是命令行程序(图形化是对命令行的封装)eg javac&java执行javac必须切换到其所在目录--太麻烦---想在任意目录下使用要执行一个命令--先在当前目录下找 ...