ITPub博客

首页 > IT职业 > IT生活 > 学习笔记十一(managing tables)

学习笔记十一(managing tables)

原创 IT生活 作者:playwawa 时间:2005-05-25 23:45:53 0 删除 编辑
对rowid 及字符的长度有了理解 ,creat temporary table都听完了[@more@]

---storing user data
1.regular table
2.partitioned table(为了提高系统的访问效率)
3. index-organized table (regular table and partition table 每个段里面的数据

是随机存放的没有按照特定的顺序存放,为了方便数据的查询,我们希望物理数据的存

放就按照索引顺序进行物理的存放)
4.cluster 多张表占用一个段,这些表是因为其中间相同的栏位而联系起来的
/

---oracle data types
1.user defined (用户定义的)
2. built in(内建的)
A.Scalar 标量数据类型
CHAR(N),NCHAR(N),VARCHAR2(N),NVARCHAR2(N),NUMBER(P,S),DATE,TIMESTAMP,

RAW(N),BLOB, CLOB,NCLOB, BFILE,LONG, LONG RAW,ROWID, UROWID
其中引入NCHAR(n) NVARCHAR2(n)是用来支持现在DATABASE里面的UNICODE (唯一码)
如果我们在字符集为英文的database里面存放汉字的话因中文的编码是两个字节的,n

是national的意思,(国际字符集)
1). char最长2000字节
2) .varchar 最长4000字节
exp:
sql>create table test2 (lname char(2001)) tablespace users;
error ora-00910 指定的长度对于数据类型而言过长
sql>c /1/0/
sql>run
则OK了
SQL>drop table test2

sql>create table  test2 (lname varchar2(4001)) tablespace users;
error ora-00910 指定的长度对于数据类型而言过长
sql>c /1/0/
sql>run
则OK了
sql>drop table test2
3) .number oracle 里面也有很多number衍生的数字类型,例如init等
exp
sql>create table salary (id int, salary number(5,2)) tablespace users;
则OK
SQL>DROP TABELS TEST2
4). DATE 在OACLE里面采用固定的七字节长度对其进行内部格式的保存
格式CYMDHMS即七字节长度,我们在定义DATE数据类型时不能指定其长度
EXP
sql>create table test2
2 (itime date(9))
3 tablespace users;
error ora-00907 缺少右括弧
sql>l2
sql>c (9)/
sql>run
则ok
sql>drop table test2;
5) timestamp 时间邮戳
6)raw(N)跟char数据类型有点相似,区别在于不同的版本,不同的平台之间进行数据

移植的时候他不需要进行数据的转换的因为其本身为二进制储存模式
7)blob,clob主要用来存放文本图像
lob 表示large object  b表示二进制blob一般放置图像,c表示character字符型的大

的数据对象clob一般放置文本
8)Nclob n也是用来支持unicode的
9)bfile 前面的存放大的对象的数据类型存放的数据都在数据库里面,而bfile则是只

在数据库里存放指针,而文本的内容则存放在数据库以外,也就是以文件形式保存在操

作系统里面
10)long ,long raw为以前版本所用,现在版本已经不用了也是用来储存大的数据对象

的,现在建议使用blob,clob,Nclob ,bfile
另外
A. blob,clob,Nclob ,bfile最长可以支持4GB的字节
而long ,long raw支持2GB的字节
B. blob,clob,Nclob ,bfile的数据类型在查询的时候可以随机的查询
而long ,long raw则必须是顺序存取
C.一个表里面long raw的数据类型只能有一个
而blob,clob,Nclob ,bfile则不受限制
11)ROWID, UROWID ORACLE为了跟其他DATABASE兼容而引入UROWID
B.Collection集合数据类型a.table表数据类型 b.varray动态数组这两类数据类型是

oracle为了支持面向对象而引入的两类数据类型,例如牵套表的数据类型为table,

varray数据类型可以认为是record数据类型
C.Relationship参照数据类型 REF在oracle里面唯一的参照数据类型就是游标数据类型
/
---ROWID Format
rowid唯一的定位我们的这一行的位置
sql〉select rowid from scott.emp;
oracle 9i 里面rowid 分两类
1.extended rowid
extended rowid包括四部分000000表示数据对象号FFF相对文件号BBBBBB块号RRR行号
ROWID是一个64进制的18位的一个字符串
而ORACLE组织这个ROWID的时候使用了10bytes,也就是 80bits的内部结构方式
80bits分别为:
object# 为32bits  占 6位
rfile#  为10bits  占 3位
block#  为22bits  占 6位
row#    为16bits  占 3位
80bits 在物理上讲就是10个字节
64进制是用以下字母表示出来的
A到Z ,26 ,a到z,26 0到9,10 然后加上‘/’,‘+’
64各符号代表着64进制的字符串
另外:
我们要知道这一行是这个块里面的第几行,或者是整个文件里面的第几块
则通过DBMS_ROWID来查询我们需要的东西
EXP
sql>desc dbms_rowid;
sql>select rowid,dbms_rowid.rowid_block_number(rowid),dbms_rowid.rowid_row_number(rowid)
2 from scott.emp;
可见相关信息
2.restricted rowid
restricted rowid包括三部分BBBBBBBB块号RRRR行号FFFF文件号
/
---Structure of a row
从左往右
1.row header
2.column length
3.column value

Row data is stored in database blocks as variable-length records. Columns for a row are generally stored in the order in which they are defined and any trailing NULL columns are not stored.
Note: A single byte for column length is required for non trailing NULL columns. Each row in a table has:
Row header: Used to store the number of columns in the row, the chaining information, and the row lock status
Row data: For each column, the Oracle server stores the column length and value (One byte is needed to store the column length if the column will require more than 250 bytes of storage in which case three bytes will be used for column length. The column value is stored immediately following the column length bytes.)
Adjacent rows do not need any space between them. Each row in the block has a slot in the row directory. The directory slot points to the beginning of the row.
挺清楚地
/
---creating a table
exp
sql>create table test2
2 (id int ,
3  lname varchar2(20) not null,
4 fname varchar2(20) constraint ck_1 check(fname like 'k%'),
5 empdate date default sysdate)
6 tablespace users;
/
---create temporary tables
Created using the GLOBAL TEMPORARY clause:

CREATE GLOBAL TEMPORARY TABLE hr.employees_temp
AS SELECT * FROM hr.employees;
我们创建的临时表有两种情况:
1。create global temporary table xxx on commit delete rows
                                     on commit preserve rows
exp
1. sql>create global temporary table test3
    on commit delete rows
   as select * from scott.emp;
sql>select * from test3;
没有值

2.sql>create global temporary table test4
    on commit preserve rows
   as select * from scott.emp;
sql>select * from test4;
发现有值
sql>delete test4 where emp_no like '3%'
已经删除1行
此时再另开一个sqlplus 再connect 一个session
sql>delete test4 where emp_no like '2%'
已经删除0行
A.can create indexes,views,and triggers on temporary tables;
B. DMLs do not generate redo logs不产生重做日志因为这些数据本身为临时数据所以可以随便删除
C.DML locks are not acquired on the data 不存在脏数据的说法,所以允许大家并发的进行数据改变,不需要保持数据的一致性,也不放dml锁
D. Tables tetain data only for the duration of a transaction or session
/
---creating a table:guidelines
1.place tables in separate tablespaces.比如系统里面有些表是经常读写的,有些表是read only的所以就分开放置以利backup等也有就是把临时table 跟永久table分开
2.use locally-managed tablespaces to avoid fragmentation.
本地管理的tablespace的好处
A.在资源分配的时候不会争用到系统表空间的资源,其空间管理为自己的位图来管理
B.不会产生回滚信息
C.不会产生很多碎片
3.use few standard extent sizes for tables to reduce tablespace fragmentation.
也就是说在create table
sql>create table test5 (id int) tablespace users storage(initial 100k, next 100k, pctincrease 0 要避免使用pctincrease的值
/
---chaning storage parameters
sql>create table test5 (id int) tablespace users storage(initial 100k next 100k pctincrease 0 minextents 1 maxextents10) pctfree 10 pctused40;
sql>alter table test5 pctfree 20 pctused50;
/
---manually allocating extents
high water mark
释放hwm下的没有使用的空间
sql>alter table scott.emp deallocate unused;
sql>a keep 0
sql>run
sql>c /0/2m/
sql>run
keep 则表示在hwm以上保留多少空间
/
---nonpartitioned table reorganization
sql〉alter table scott.emp
 2 move tablespace indx;
sql>create index testindex1 on scott.emp(ename)  tablespace users;
sql>alter table scott.emp move tablespace users;
sql>select * from scott.emp where ename like 'a%';
error ora-01502 索引'sys.testindex1'或这类索引的分区处于不可用状态
也就是说在我们完成了table的move之后index虽然保持下来了但是其不可用必须重建
sql>alter index testindex1 rebuild;
然后sql>select * from scott.emp where ename like 'a%';
则有结果了
/
---truncating a table
truncate table 为ddl语句
1.truncating a table deletes all rows in a table and releases used space.
2.corresponding indexes are truncated
sql>truncate table scott.emp
/
---dropping  a table
把table在数据字典上的信息也drop掉了,同时如果该表上有pk参照到了fk则用cascade constraints
sql>drop table scott.emp cascade constraints
/
---dropping a column
alter table scott.emp drop column comments cascade constraints checkpoint 1000;
如果在我们的table 里面已经有了数据而且数据量很大,在我们drop column的时候同时drop column的掉数据,这样会把column and column的数据从每一行里面拿走,在一个大表里面做的话就需要很长的时间
则采用变通的做法:
1.mark a column as unused
2.drop unused column
3.continue to drop column operation (在drop的时候突然掉电重起后继续drop而不是从头再来)
exp
sql>alter table scott.emp drop column ename;
sql>alter tables scott.emp set unused column qty;
sql>select * from scott.emp则看不到qty栏位了就像删除了一样
发现这个过程处理起来很快
sql>alter table scott.emp drop unused column;
发现很容易删除掉了
/
---obtaining table information
1. DBA_TABLES
2.DBA_OBJECTS

待续

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/202861/viewspace-799217/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    105
  • 访问量
    1173115