当表中的数据量很大时亿量时,如果在继续存放数据的话查询的效率会很慢,这时可以对这个表做一个备份,然后创建一个一模一样的表来继续存放数据。
首先我们要做的是修改表的名字、主键的名字、索引的名字,如果有外键的话也对外键名修改。然后在创建一个新的表,表名、主键名、索引名、外键名。都和原来表中保持一致,然后在把一部分需要的数据导入到新的表中即可。
第一步修改表名
ALTER TABLE 表名 RENAME TO 修改后的表名;
第二步修改主键
由于主键名不能修改所以只能先删除原来的主键,然后重新添加一个新的主键名称,如下分情况操作。
1.当表有主键没有主键约束名,先删除主键,在添加主键。
删除主键:ALTER TABLE 表名 DROP PRIMARY KEY;
添加主键:ALTER TABLE 表名 ADD PRIMARY KEY (字段名);
2.当有主键也有主键约束名,先删除已有的主键约束名,在添加主键和主键约束名。
若不知道主键约束名可查询:
SELECT C.CONSTRAINT_NAME FROM USER_CONS_COLUMNS C WHERE C.TABLE_NAME='表名';
查询出来之后在删除主键约束名:ALTER TABLE 表名 DROP CONSTRAINT 约束名;
最后在添加主键和主键约束名:ALTER TABLE 表名 CONSTRAINT 约束名 PRIMARY KEY (字段名1,字段名2);
第三步修改索引名
ALTER INDEX 索引名 RENAME TO 修改后的索引名;
第四步统计分析(作用是提高导入数据的效率)
ANALYZE TABLE 表名 COMPUTE STATISTICS FOR TABLE FOR ALL INDEXES FOR ALL COLUMNS;
注意:第二步和第四步所有操作的表名,都是修改之后的表名。
第五步创建新表(新表的表名要和第一步修改前的表名一致),同时从修改后的表中导入一部分所需数据
CREATE TABLE 表名 AS SELECT * FROM 修改后的表名 WHERE 自己需要导入的条件;
第六步添加主键
ALTER TABLE 表名 ADD CONSTRAINT 主键约束名 PRIMARY KEY(字段名);
第七步添加索引
CREATE INDEX 索引名 ON 表名 (字段名);
第八步为了提高新表的查询效率可以对新建的表做一个统计分析
ANALYZE TABLE 表名 COMPUTE STATISTICS FOR TABLE FOR ALL INDEXES FOR ALL COLUMNS;
例子如下:
表名:tb_student
主键是:student_id
主键约束名:pk_student_1
索引名:index_student_1
修改表名:alter table tb_student rename to tb_student_backup2019;
删除主键:alter table tb_student_backup2019drop primary key;
或者删除主键约束名:alter table tb_student_backup2019 drop constraint pk_student_1;
添加主键和主键约束名:
alter table tb_student_backup2019 add constraint pk_student_1_backup2019 primary key (student_id);
修改索引:alter index index_student_1 rename to index_student_1_backup2019;
统计分析:
analyze table tb_student_backup2019 compute statistics for table for all indexes for all columns;
创建新表:
create table tb_student as select * from tb_student_backup2019 where datetime>='20180101';
增加主键和主键约束名:alter table tb_student add constraint pk_student_1 primary key (student_id);
增加索引:create index index_student_1_backup2019 rename to index_student_1;
统计分析:analyze table tb_student compute statistics for table for all indexes for all columns;
还有一些常用命令也写下方
查看oracle版本号:select * from v$version;
删除索引:drop index 索引名;
统计分析另一种写法:exec dbms_stats.gather_table_stats('用户名','表名'); --该命令适用于dos窗口