Oracle11g温习-第十二章:tables
2013年4月27日 星期六
10:44
1、表的功能 存储、管理数据的基本单元(二维表:由行和列组成) |
||||||
2、表的类型 |
||||||
1)普通表:【heap table(堆表) :数据存储时,无序的,对它的访问采用全表扫描】。 2)分区表:【 (>2G) 对大表进行优化 (Range Partitioning,List PartitioningHash Partitioning,Composite Partitioning)】
——按range 建立分区表
3)索引组织表(IOT)(如果表经常以主键为索引查询,可建立索引组织表,加快表的访问速度)
4)簇:cluster (多表链接查询)【 先建立簇,然后建立簇表,最后建立索引 】
cluster访问和普通表连接查询访问对比
|
||||||
3、 rowid :行号(伪列)精确的定义记录的物理位置 |
||||||
extended rowid:
object id 对象号(6), relative file id 文件号(3), block id 块号(6), row id 行号(3)
将rowid转换成十进制形式
|
||||||
4、临时表(global temporary table):用于电子商务的网上购物 |
||||||
临时表用于存放会话或事务的私有数据。建立临时表后,其结构会一直存在,但其数据只在当前事务内或当前会话内有效。
1.临时表的基础知识
临时表只在Oracle 8i 以及以上产品中支持。ORACLE数据库除了可以保存永久表外,还可以建立临时表temporary tables。这些临时表用来保存一个会话SESSION的数据,或者保存在一个事务中需要的数据。当会话退出或者用户提交commit和回滚rollback事务的时候,临时表的数据自动清空,但是临时表的结构以及元数据还存储在用户的数据字典中。 Oracle的临时表创建之后基本不占用表空间,临时表并非存放在用户的表空间中,而是存放在 Schema 所指定的临时表空间中。如果你没有指定临时表(包括临时表的索引)存放的表空的时候,你插入到临时表的数据是存放在ORACLE系统的临时表空间中(TEMP)。 可以对临时表创建索引,视图,触发器,可以用export和import工具导入导出表的定义,但是不能导出数据。表的定义对所有的会话可见。建立在临时表上的索引也是临时的,也是只对当前会话或者事务有效. 尽管对临时表的DML操作速度比较快,但同样也是要产生 Redo Log ,只是同样的DML语句,比对 PERMANENT 的DML 产生的Redo Log 少。
临时表的不足之处:
1.不支持lob对象,这也许是设计者基于运行效率的考虑,但实际应用中确实需要此功能时就无法使用临时表了。 2.不支持主外键关系
特性和性能(与普通表和视图的比较)
1.临时表只在当前连接内有效 2.临时表不建立索引,所以如果数据量比较大或进行多次查询时,不推荐使用 3.数据处理比较复杂的时候时表快,反之视图快点 4.在仅仅查询数据的时候建议用游标: open cursor for 'sql clause';
临时表的应用: 对于一个电子商务类网站,不同消费者在网站上购物,就是一个独立的 SESSION,选购商品放进购物车中,最后将购物车中的商品进行结算。也就是说,必须在整个SESSION期间保存购物车中的信息。同时,还存在有些消费者,往往最终结账时放弃购买商品。如果,直接将消费者选购信息存放在最终表(PERMANENT)中,必然对最终表造成非常大的压力。因此,对于这种案例,就可以采用创建临时表(ON COMMIT PRESERVE ROWS)的方法来解决。数据只在 SESSION 期间有效,对于结算成功的有效数据,转移到最终表中后,ORACLE自动TRUNCATE 临时数据;对于放弃结算的数据,ORACLE 同样自动进行 TRUNCATE ,而无须编码控制,并且最终表只处理有效订单,减轻了频繁的DML的压力。 Temp Table 的另一个应用,就是存放数据分析的中间数据。 1)基于事务,在事务提交时,自动删除记录
2)基于会话,当用户退出session 时,自动删除记录
|
||||||
5、data block 数据块 |
||||||
pctfree:预留空间的百分比,这个数值要得当 过大,浪费块空间 过小:update 产生行迁移,insert 产生行链接,降低了记录的访问速度,影响性能。 |
||||||
6、表的 空间(extent)管理: |
||||||
当建立表的时候,建立相应的段,然后自动分配相应的extent(1个或者多个),亦可以手工提前分配extent(用于需大量插入数据的表)
——表的数据块的移动(move)
|
||||||
外部表管理: 1) sql loader 导入 2) 通过external table管理(只读) |
||||||
管理外部表 外部表是表结构被存放在数据字典,而表数据被存放在OS文件的表。通过使用外部表,不仅可以在数据库中查询OS文件的数据,还可以使用INSERT方式将OS文件数据装载到数据库中,从而实现SQL*Loader所提供的功能。建立外部表后,可以查询外部表的数据,在外部表上执行连接查询,或对外部表的数据进行排序。需要注意,外部表上不能执行DML修改,也不能在外部表上建立索引。
建立外部表 建立外部表 时使用create table 命令完成的,但建立外部表时必须指定 organization external 选项 .与建立普通表不同,使用create table 建立外部表 包括两部分内容: 一部分描述列的数据类型,另一部分描述os文件 与表列的对应关系. 下面以访问os文件emp.dat 的数据为例,说明建立和使用外部表的方法,假定emp.dat包括以下数据: ——准备工作: [oracle@solaris10 ~]$mkdir /export/home/oracle/dat [oracle@solaris10 ~]$cd /export/home/oracle/dat [oracle@solaris10 dat]$vi empxt1.dat 360,Jane,Janus,ST_CLERK,121,17-MAY-2001,3000,0,50,jjanus 361,Mark,Jasper,SA_REP,145,17-MAY-2001,8000,.1,80,mjasper 362,Brenda,Starr,AD_ASST,200,17-MAY-2001,5500,0,10,bstarr 363,Alex,Alda,AC_MGR,145,17-MAY-2001,9000,.15,80,aalda
[oracle@solaris10 dat]$vi empxt2.dat 401,Jesse,Cromwell,HR_REP,203,17-MAY-2001,7000,0,40,jcromwel 402,Abby,Applegate,IT_PROG,103,17-MAY-2001,9000,.2,60,aapplega 403,Carol,Cousins,AD_VP,100,17-MAY-2001,27000,.3,90,ccousins 404,John,Richardson,AC_ACCOUNT,205,17-MAY-2001,5000,0,110,jrichard
——建立对应的目录:
SYS @ PROD > conn /as sysdba Connected.
SYS @ PROD > create or replace directory admin_dat_dir 该目录存放 数据文件 as '/export/home/oracle/dat';
Directory created.
SYS @ PROD > create or replace directory admin_log_dir 该目录存放导入操作产生的日志 as '/export/home/oracle/log';
Directory created.
SYS @ PROD > create or replace directory admin_bad_dir 该目录存放导入失败的那些数据 as '/export/home/oracle/bad';
Directory created.
SYS @ PROD > !
[oracle@solaris10 ~]$mkdir /export/home/oracle/{log,bad} [oracle@solaris10 ~]$ls
1 Documents core dat local.login shell 1.sql afiedt.buf cr_anny_db.sql hell.txt local.profile x86 Desktop bad cr_dict.sql local.cshrc log
——授权scott 可以访问所建立的目录
SYS @ PROD > grant read on directory admin_dat_dir to scott; Grant succeeded.
SYS @ PROD > grant write on directory admin_log_dir to scott;
Grant succeeded.
SYS @ PROD > grant write on directory admin_bad_dir to scott;
Grant succeeded.
——建立外部表
SYS @ PROD > conn scott/tiger
Connected.
SYS @ PROD >
CREATE TABLE admin_ext_employees (employee_id NUMBER(4), first_name VARCHAR2(20), last_name VARCHAR2(25), job_id VARCHAR2(10), manager_id NUMBER(4), hire_date DATE, salary NUMBER(8,2), commission_pct NUMBER(2,2), department_id NUMBER(4), email VARCHAR2(25) ) ORGANIZATION EXTERNAL ( TYPE ORACLE_LOADER DEFAULT DIRECTORY admin_dat_dir ACCESS PARAMETERS ( records delimited by newline badfile admin_bad_dir:'empxt%a_%p.bad' logfile admin_log_dir:'empxt%a_%p.log' fields terminated by ',' missing field values are null ( employee_id, first_name, last_name, job_id, manager_id, hire_date char date_format date mask "dd-mon-yyyy", salary, commission_pct, department_id, email ) ) LOCATION ('empxt1.dat', 'empxt2.dat') ) PARALLEL REJECT LIMIT UNLIMITED;
Table created.
SYS @ PROD > select * from tab;
TNAME TABTYPE CLUSTERID ------------------------------ ------- ---------- DEPT TABLE EMP TABLE BONUS TABLE SALGRADE TABLE TEST TABLE ADMIN_EXT_EMPLOYEES TABLE
6 rows selected.
——查询外部表记录
SYS @ PROD > select * from ADMIN_EXT_EMPLOYEES;
EMPLOYEE_ID FIRST_NAME LAST_NAME JOB_ID MANAGER_ID HIRE_DATE SALARY COMMISSION_PCT DEPARTMENT_ID EMAIL ----------- ---------- ---------- ---------- ---------- ------------------- ---------- -------------- ------------- ---------- 360 Jane Janus ST_CLERK 121 2001-05-17 00:00:00 3000 0 50 jjanus 361 Mark Jasper SA_REP 145 2001-05-17 00:00:00 8000 .1 80 mjasper 362 Brenda Starr AD_ASST 200 2001-05-17 00:00:00 5500 0 10 bstarr 363 Alex Alda AC_MGR 145 2001-05-17 00:00:00 9000 .15 80 aalda 401 Jesse Cromwell HR_REP 203 2001-05-17 00:00:00 7000 0 40 jcromwel 402 Abby Applegate IT_PROG 103 2001-05-17 00:00:00 9000 .2 60 aapplega 403 Carol Cousins AD_VP 100 2001-05-17 00:00:00 27000 .3 90 ccousins 404 John Richardson AC_ACCOUNT 205 2001-05-17 00:00:00 5000 0 110 jrichard 10 rows selected.
只能读,不能做dml
SYS @ PROD > delete from ADMIN_EXT_EMPLOYEES;
delete from ADMIN_EXT_EMPLOYEES * ERROR at line 1: ORA-30657: operation not supported on external organized table
——把外部表数据插入到oracle 表里
SYS @ PROD > create table employees as select * from admin_ext_employees where 1=2;
Table created.
SYS @ PROD > insert into employees select * from admin_ext_employees;
10 rows created.
SYS @ PROD > select * from employees;
EMPLOYEE_ID FIRST_NAME LAST_NAME JOB_ID MANAGER_ID HIRE_DATE SALARY COMMISSION_PCT DEPARTMENT_ID EMAIL ----------- ---------- ---------- ---------- ---------- ------------------- ---------- -------------- ------------- ---------- 401 Jesse Cromwell HR_REP 203 2001-05-17 00:00:00 7000 0 40 jcromwel 402 Abby Applegate IT_PROG 103 2001-05-17 00:00:00 9000 .2 60 aapplega 403 Carol Cousins AD_VP 100 2001-05-17 00:00:00 27000 .3 90 ccousins 404 John Richardson AC_ACCOUNT 205 2001-05-17 00:00:00 5000 0 110 jrichard 360 Jane Janus ST_CLERK 121 2001-05-17 00:00:00 3000 0 50 jjanus 361 Mark Jasper SA_REP 145 2001-05-17 00:00:00 8000 .1 80 mjasper 362 Brenda Starr AD_ASST 200 2001-05-17 00:00:00 5500 0 10 bstarr 363 Alex Alda AC_MGR 145 2001-05-17 00:00:00 9000 .15 80 aalda
|