當表中的數據量很大時億量時,如果在繼續存放數據的話查詢的效率會很慢,這時可以對這個表做一個備份,然後創建一個一模一樣的表來繼續存放數據。
首先我們要做的是修改表的名字、主鍵的名字、索引的名字,如果有外鍵的話也對外鍵名修改。然後在創建一個新的表,表名、主鍵名、索引名、外鍵名。都和原來表中保持一致,然後在把一部分需要的數據導入到新的表中即可。
第一步修改表名
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窗口