Managing Tables

系统 1528 0

1、存储user data
1)普通tables
2)partitioned tables
3)index-organized tables
4)Clustered tables:前面三种就不再叙述了,讲讲这个吧。clustered table提供了一种存储table data的方法。一个cluster由一个或是一组tables组成,共享相同的data blocks,这主要是由于他们共享共同的columns并经常同时使用。其主要特点:
* 有cluster key,用于区分需要存储在一起的rows
* cluster key可以包含一个或更多columns
* clustering机制相对于应用时透明的。
* 修改cluster key中的某个column,将会导致物理的重新分配
* cluster key相对于table的primary key是独立的。
* 创建cluster是为了改善性能的。对于clustered data,随机存取较快,但是对于全表扫描,clustered table将更慢。
* clusters只是重新组织了tables的物理存储,并不影响逻辑结构。
2)数据类型
如上图
①内建数据类型:
* 标量(scalar)数据类型
这里只描述几个不常用的:timestamp data type(存储date和time,包含9个小数位;其中TIMESTAMP和TIMESTAMP WITH LOCAL TIME ZONE可以被用于设置为primary key,但TIMESTAMP WITH TIME ZONE不可);raw data type(可以存储小的二进制data,此类数据在network中传输时,不需要进行字符集的转换);Oracle还提供了6中数据类型用于存储LOBs(CLOB和LONG存放定长的字符data;NCLOB用于存放定长本地字符集数据;BLOB和LONG RAW用于存放非结构化的data;BFILE存放OS文件中的非结构化数据)
note:ROWID是只用于查询的字段,是database中每一行data的唯一标识,是隐式存储在表中的,提供最快的访问方法,此外还会存储在index segments中,用于index的查询。
UROWID是在8.1版本中新增的,用于支持外表的rowid,可以存储在所有类型的rowid中。(这里没太搞懂啊~~~~(>_<)~~~~ )
* 集合(collections)数据类型:
# varying arrays(VARRAY):用于存储有少量数据元素的lists,它是数据元素的有序集合;在其中的所有元素的数据类型应该是一致的;每个元素都有一个与其位置相关联的index;元素的个数决定了varray的大小;其大小是可变的,但是在声明后Maximum size必须确定了。
# Nested Tables:提供了一种方法,将一个子表作为父表中的一个column的值。nested Table是一个records或rows的无序集合;存储在nested table中的数据应该有一致的结构;nested table中的rows与父表的存储是分离的;父表中只记录了nested table的pointer;nested table的存储特征可以由DBA来指定;对nested table没有Maximum size的限制。
* 关系(relationship)数据类型(REFs):此类数据主要在database中做pointer。
* 此外Oracle Server运行user定义自己的数据类型。

2、ROWID的格式


1)extended的rowid:需要占用disk上的10bytes来存储,显示时,将使用18个字符。主要由以下四部分组成:
* data object number:标识了每个data的object。在table或是index等objects被创建时,会分配给其一个database全局唯一的number。
* relative file number:在一个tablespace中的每个file的number是唯一的
* block number:指明了在该file中包含此row的block的位置
* row number:指明了在block header中该row的目录槽(directory slot)的位置
在内部,data object number需要32 bits,relative file number 10 bits,block number 22 bits, row number 16 bits。总共80bits,即10 bytes。
entended rowid的显示是以16进制来显示的,一共18个字符,前6个位data object number,三个relative file number,六个block number,三个row number。
2)restricted rowid:是在Oracle7和更早的版本中使用的。内部只使用6 bytes。具体如图。此外在后期的版本中对于建立在非partition tables上的非partition index使用的仍是restricted rowid。
3)使用rowid定位row的位置
因为每个segment只能存储在一个tablespace中,所以使用data object number就可以确定具体的tablespace。使用file number确定相应tablespace中的data file。最后使用block number和row number进行定位
row data被变长的存储在database blocks中。每条row中的columns会按照表定义的顺序存储,并且任何值为NULL的columns不会被存储,所以每一row种的columns数可能是不同的。如图,one row都会有一个row header(用于存放该row中的columns数量、连接信息、row lock状态)、row data(其中,每个column,都会存储column的长度和其value)。临界的rows之间不需要留空间。在block中每个row都对应一个row directory,用于指向row的开始位置。

3、create table
1)
* 关系型表:存储user data 的基本表
* object table
都可以使用create table语句创建
note:在自己的schema上创建table,需要有create table权限,在其他user的schema上创建需要有create any table权限。
CREATE TABLE t_name(
col1 COL_TYPE,

)STORAGE ( INITIAL n[K|M] NEXT n[K|M] PCTINCREASE n MINEXTENTS n MAXEXTENTS n) [pctfree integer] [pctused integer][initrans integer] [maxtrans integer] TABLESPACE tsp_name;
2)创建临时表
* transaction-specific temporary tables:数据在当前transaction中存在。
* session-specific temporary tables:数据存储在当前session存在的期间。
不同session中的data是隔离的。所以在temporary tables中不需要使用DML locks对data加锁。并且DMLs也不会产生redo log。可以在临时表上创建indexes、views、triggers,也可以使用export和import,但使用export得到的是没有data本身的。临时表的定义是在所有session中可见的。
CREATE GLOBAL TEMPORARY TABLE t_name … [ON COMMIT DELETE ROWS | ON COMMIT PRESERVE ROWS]

4、其他table的维护操作
1)手工分配extents
* 主要用于两种情况:控制table上extents的分布到指定的file上;在loading大量数据时避免动态的进行extended。
* ALTER TABLE [schema]table ALLOCATE EXTENT [([SIZE integer [K|M]][DATAFILE 'filename'])]
如果没有指定SIZE参数,则会使用建表时的NEXT_EXTENT的大小来extended。
2)重组nonpartitioned table
nonpartitioned table可以在不用使用的export和import的情况下被move,同时它允许改变部分存储参数。主要用于下面的情况:
* 将一个table从一个tablespace移动到另一个tablespace
* 通过重组table消除其中的migration rows
但是在重组后需要rebuild indexes,否则使用indexes进程的操作将会报错
ALTER TABLE (schema)table MOVE TABLESPACE tsp_name;
3)truncate table
TRUNCATE TABLE [schema.]table [{DROP | REUSE} STORAGE]
该操作将删除table中的所有rows,并且会释放所使用的space,不会产生undo data,并进行了隐式的commit(因为它是一个DDL)。其table相对应的indexes也被删除了。但是如果一个table正在被其他的table最为foreign key参照,则不能被truncate。并且该table上相应的delete triggers将失效。DROP会移动高水位线,但是REUSE不会。
4)drop table
DROP TABLE [schema.]table [CASCADE CONSTRAINTS]
如果该table在外键关系中是父表,则必须指定CASCADE CONSTRAINTS。
5)drop a column
ALTER TABLE [schema.]table DROP COLUMN col_name [CASCADE CONSTRAINTS CHECKPOINT n]
该操作会清除 columns不再使用的space,重建indexes和constraints,时间开销较大。在8i之前,是没有此类操作的。
因为此操作耗时长,会产生大量的undo data。此时可以指定checkpoints,从而minimize所需的undo space。checkpoint子句指明每进行n行的update操作,会产生一个checkpoint。并且在进行drop columns时,table会标记为invalid,直到操作完成。
如果操作被中途中断,可以使用下面的语句进行:
ALTER TABLE [schema.]table DROP COLUMNS CONTINUE;
6)使用unused option
除了drop columns,还可以将column标识为unused,此操作因为不会收回空闲不用的space,所以相对快些。被标识位unused的columns可随后被drop。被unused的columns,将无法被查询语句访问,describe也无法看到,user可以add一个有相同name的column。
当想要drop两个或以上的columns时,可以将其先设置为unused,在一起删除,更节省时间。
* ALTER TABLE [schema.]table SET UNUSED COLUME col_name CASCADE CONSTRAINTS;
* ALTER TABLE [schema.]table DROP UNUSED COLUMNS CHECKPOINT n;
* ALTER TABLE [schema.]table DROP COLUMNS CONTINUE CHECKPOINT n;
查看被标识为unused的columns时,可以查看视图DBA_UNUSED_COL_TABS。
SELECT * FROM dba_unused_col_tabs;
查看完成了部分drop columns操作而被中断的columns信息,可以查看DBA_PARTIAL_DROP_TABS;
SELECT * FROM dba_partial_drop_tabs;
note:drop column受到下面的限制:
@ 不可从object type table中drop column
@ 不可删除nested tables中的columns
@ 不可drop一个表中的所有columns
@ 不可drop partitioning key columns
@ 不可drop 属于SYS的tables中的columns
@ 不可drop parent key column
@ 不可drop组织索引表中的primary key所在column
@ 在表中,如果LONG或是LONG RAW字段被标识为unused,但没有被drop,则会妨碍新的LONG或是LONG RAW字段被删除。

5、获得tables的information
主要是查看视图DBA_TABLES和DBA_OBJECTS

Posted in: Oracle9i DBA Fundamentals I Volume 1 • Student Guide .

FROM:http://www.gomudemi.org/?p=421

Managing Tables


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论