gdufo

 

oracle表管理

第三章:表
1.create a table

sql> create table table_name (column datatype,column datatype]....)

sql> tablespace tablespace_name [pctfree integer] [pctused integer]

sql> [initrans integer] [maxtrans integer]

sql> storage(initial 200k next 200k pctincrease 0 maxextents 50)

sql> [logging|nologging] [cache|nocache]

2.copy an existing table

sql> create table table_name [logging|nologging] as subquery

3.create temporary table

sql> create global temporary table xay_temp as select * from xay;

    on commit preserve rows/on commit delete rows #具体可见oracle临时表的应用

4.pctfree = (average row size - initial row size) *100 /average row size

  pctused = 100-pctfree- (average row size*100/available data space)

5.change storage and block utilization parameter

sql> alter table table_name pctfree=30 pctused=50 storage(next 500k

sql> minextents 2 maxextents 100);

6.manually allocating extents

sql> alter table table_name allocate extent(size 500k datafile 'c:/oracle/data.dbf');

7.move tablespace

sql> alter table employee move tablespace users;
#此操作会造成索引不可用,需要重建索引,但权限之类的不受影响
sql> alter index index_name rebuild;

8.deallocate of unused space

sql> alter table table_name deallocate unused [keep integer]

9.truncate a table

sql> truncate table table_name;

10.drop a table

sql> drop table table_name [cascade constraints];

11.drop a column

sql> alter table table_name drop column comments cascade constraints checkpoint 1000;

    alter table table_name drop columns continue;

12.mark a column as unused

sql> alter table table_name set unused column comments cascade constraints;

    alter table table_name drop unused columns checkpoint 1000;

    alter table orders drop columns continue checkpoint 1000

13.obtaining table information

    data_dictionary : dba_unused_col_tabs
                      dba_tables
                      dba_objects
sql> select * from dba_tables where owner = 'ET';
sql> select * from dba_objectswhere owner = 'ET';


14.truncate,delete,drop的异同点

之前看到的:“在删除一个表中的全部数据时,须使用TRUNCATE TABLE 表名;因为用DROP TABLE,DELETE * FROM 表名时,TABLESPACE表空间该表的占用空间并未释放,反复几次

DROP,DELETE操作后,该TABLESPACE上百兆的空间就被耗光了”
之前看到的:“在删除一个表中的全部数据时,须使用TRUNCATE TABLE 表名;因为用DROP TABLE,DELETE * FROM 表名时,TABLESPACE表空间该表的占用空间并未释放,反复几次

DROP,DELETE操作后,该TABLESPACE上百兆的空间就被耗光了”后来查了点资料,感觉有一定道理,因为Oracle 10g开始,当我执行Drop Table是,Oracle也会把被删除的表放到

数据库回收站(Database Recyclebin)里。这样我们就可以用flashback table命令恢复被删除的表,语法:
Flashback table 表名 to before drop;
但没有资料说,可以恢复truncate的内容。当然,他说的也不完全,因为我们删除表时想要的效果不同。其实这三个指令之前我从来没有怎么注意,只是知道我想保住表结构,但

不想要里头内容时,我会用truncate,如果删除的内容不太确定,就是用delete,因为它可以回退,有点像垃圾筒的概念,如果这整张表我都不想要了,我就drop掉它。今天在网

上查了点资料,有一篇写得挺好,感觉比较全面:
truncate,delete,drop的异同点
注意:这里说的delete是指不带where子句的delete语句

相同点:truncate和不带where子句的delete, 以及drop都会删除表内的数据
不同点:
1. truncate和 delete只删除数据不删除表的结构(定义)
drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger),索引(index); 依赖于该表的存储过程/函数将保留,但是变为invalid状态.
2.delete语句是dml,这个操作会放到rollback segement中,事务提交之后才生效;如果有相应的trigger,执行的时候将被触发.
truncate,drop是ddl, 操作立即生效,原数据不放到rollback segment中,不能回滚. 操作不触发trigger.
3.delete语句不影响表所占用的extent, 高水线(high watermark)保持原位置不动
显然drop语句将表所占用的空间全部释放
truncate 语句缺省情况下将空间释放到 minextents个 extent,除非使用reuse storage; truncate会将高水线复位(回到最开始).
4.速度,一般来说: drop> truncate > delete
5.安全性:小心使用drop 和truncate,尤其没有备份的时候.否则哭都来不及
使用上,想删除部分数据行用delete,注意带上where子句. 回滚段要足够大.
想删除表,当然用drop
想保留表而将所有数据删除. 如果和事务无关,用truncate即可. 如果和事务有关,或者想触发trigger,还是用delete.
如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据

 

posted on 2009-11-22 08:50 gdufo 阅读(303) 评论(0)  编辑  收藏 所属分类: Database (oracle, sqlser,MYSQL)

导航

统计

常用链接

留言簿(6)

随笔分类

随笔档案

文章分类

文章档案

收藏夹

Hibernate

友情链接

搜索

最新评论

阅读排行榜

评论排行榜