给已有数据的字段添加索引
针对已有数据的字段,有些数据库是不支持直接添加索引的,就算支持数据量比较大时候直接添加索引还是很容易引起各种各样的问题,安全系数不高。。。因此遇到这种场景,比较保守的方式就是创建一模一样的临时表,先给临时表需要添加索引的字段添加索引,再把数据插入临时表,最后把临时表重命名为原来那张表。临时表可删除或不删除,数据还能做备份。
示例(需要给TB_EXCHANGE_LOG
表的DATATYPE、STATE、PRIMARYID
字段添加索引):
1、导出建表语句,修改表名后执行建表语句,例如
# 我习惯在原表的后面加上 temp
CREATE TABLE LN.TB_EXCHANGE_LOG_TEMP (
ID NUMBER(38,0),
XZQHDM VARCHAR2(512),
PRIMARYID VARCHAR2(512),
DATATYPE NUMBER(38,0),
DATANAME VARCHAR2(200),
REMARK VARCHAR2(100),
STATE NUMBER(38,0),
CREATETIME TIMESTAMP,
PID VARCHAR(100),
DESTINATION VARCHAR(100)
);
2、给临时表的字段添加索引,例如
# 索引命名规范推荐 IDX1_字段名 IDX2_字段名 加上表名可避免索引名重复
CREATE INDEX IDX1_DATATYPE ON LN.TB_EXCHANGE_LOG_TEMP(DATATYPE) TABLESPACE LN;
CREATE INDEX IDX2_STATE ON LN.TB_EXCHANGE_LOG_TEMP(STATE) TABLESPACE LN;
CREATE INDEX IDX3_PRIMARYID ON LN.TB_EXCHANGE_LOG_TEMP(PRIMARYID) TABLESPACE LN;
3、将正式表的数据插入临时表,例如
INSERT INTO LN.TB_EXCHANGE_LOG_TEMP(ID, XZQHDM, PRIMARYID, DATATYPE, DATANAME, REMARK,
STATE, CREATETIME, PID, DESTINATION) SELECT ID, XZQHDM, PRIMARYID, DATATYPE, DATANAME, REMARK,
STATE, CREATETIME, PID, DESTINATION FROM LN.TB_EXCHANGE_LOG;
4、临时表与正式表记录数量对比,例如
SELECT COUNT(*) FROM LN.TB_EXCHANGE_LOG_TEMP;
SELECT COUNT(*) FROM LN.TB_EXCHANGE_LOG;
5、将临时表表名改为正式表表名
ALTER TABLE TB_EXCHANGE_LOG RENAME TO TB_EXCHANGE_LOG1;
ALTER TABLE TB_EXCHANGE_LOG_TEMP RENAME TO TB_EXCHANGE_LOG;
ALTER TABLE TB_EXCHANGE_LOG1 RENAME TO TB_EXCHANGE_LOG_TEMP;
OK,完美。