x3.6 将表移动到新的数据段或新的表空间
最新的Oracle8i版本可以用Alter table … MOVE语句将表移动到一个新的段或新表空间上,这样可以实现对不合理存储参数进行修改,包括用一般的ALTER TABLE不能修改的参数。如:
例1:通过移动来实现存储参数的修改:
Alter table emp MOVE
STORAGE(INITIAL 1m next 512k minextents 1 maxextents 999 pctincrease 0 );
例2:将那些使用system表空间的对象移动到合适的表空间中:
1)移动前表所使用的表空间情况:
SQL> select tablespace_name,table_name,initial_extent from user_tables;
TABLESPACE_N TABLE_NAME INITIAL_EXTENT
---------------------- ----------------------- ----------------------------
SYSTEM ABC 65536
SYSTEM BONUS 65536
SYSTEM DEPT 65536
SYSTEM EMP 65536
SYSTEM EMP2 65536
SYSTEM EMP3 65536
SYSTEM EMP4 65536
USERS PAY_LST_DET 1048576
SYSTEM PLAN_TABLE 65536
SYSTEM SALGRADE 65536
USERS UNIT_INF 1048576
11 rows selected.
2)用Alter table . . . MOVE语句对表进行移动,下面例子对表进行移动并重新指定存储参数。
SQL> alter table emp move tablespace user_data
2 storage(initial 128k next 128k minextents 1 pctincrease 0);
Table altered.
SQL> alter table dept move tablespace user_data
2 storage(initial 128k next 128k minextents 1 pctincrease 0);
Table altered.
SQL> alter table BONUS move tablespace user_data
2 storage(initial 128k next 128k minextents 1 pctincrease 0);
Table altered.
3)移动后的表及表空间的情况:
SQL> select tablespace_name,table_name,initial_extent from user_tables;
TABLESPACE_N TABLE_NAME INITIAL_EXTENT
----------------------- ------------------------- ---------------------------
SYSTEM ABC 65536
USER_DATA BONUS 131072
USER_DATA DEPT 131072
USER_DATA EMP 131072
SYSTEM EMP2 65536
SYSTEM EMP3 65536
SYSTEM EMP4 65536
USERS PAY_LST_DET 1048576
SYSTEM PLAN_TABLE 65536
SYSTEM SALGRADE 65536
USERS UNIT_INF 1048576
11 rows selected.
3.7 手工分配表的存储空间
使用ALTER TABLE加ALLOCATE EXTENT选项来实现分配一个指定的空间。如:
ALTER TABLE emp
ALLOCATE EXTENT (SIZE 5K INSTANCE 4);
3.8 标记不使用的列和删除不使用的列
前面介绍过,新版的Oracle8I可以删除某个列。如:
例:从LONG_TAB表中将LONG_PICS列删除掉:
ALTER TABLE LONG_TAB DROP COLUMN LONG_PICS;
可以使用 ALTER TABLE . . . SET UNUSED语句实现将表中的列设置为不用的状态以达到快速处理的目的。其结果是:
1)在显示结果时看不到该列;
2)不删除该列的数据(但可以将该列删掉);
例:
SQL> select * from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ------------ ------------------- ---------- ---------------- ------------ ----------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
10 rows selected.
SQL> alter table emp2 set unused(comm);
Table altered.
SQL> select * from emp;
EMPNO ENAME JOB MGR HIREDATE SAL DEPTNO
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 30
10 rows selected.
SQL> desc emp
Name Null? Type
----------------------------------------------------------------- -------- ------------
EMPNO NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
DEPTNO NUMBER(2)
可以用ALTER TABLE . . . DROP UNUSED COLUMNS来删除不使用的列。它可以在物理上删除表的未使用的列,并重新声明磁盘空间。在使用该语句时可以在后面加上checkpoint检查点关键字。它可以产生一个检查点。使用检查点可以在删除数据列的操作过程中减少恢复日志的容量积累,从而避免回滚段的空间消耗。
如:
SQL> alter table emp drop unused columns checkpoint;
Table altered.
注意:删除表中未使用列时不需要指定列名,它是根据alter table emp set unused(comm);语句来删除未使用的列。
3主键
ORACLE系统提供一个关键字 primary key来建立一个主键。所谓主键,就是在一个表内该列具有唯一的值。一旦你为一个表的一列或几个列建立了主键,则ORACLE就自动为该表建立一个唯一索引。