ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 有关外部表的试验:

有关外部表的试验:

原创 Linux操作系统 作者:orchidllh 时间:2005-04-25 00:00:00 0 删除 编辑

External table和正规的表很相似,具体的定义可以参见《Oracle概念手册》,以下的几点需要注意: 

>创建的语法类似于: "CREATE TABLE ... ORGANIZATION EXTERNAL" 
>数据在数据库的外部组织,是操作系统文件。 
>操作系统文件在数据库中的标志是通过一个逻辑目录来映射的。    
>数据是只读的。(外部表相当于一个只读的虚表) 
>不可以在上面运行任何DML操作,不可以创建索引。  
>可以查询操作和连接。可以并行操作。 


一、将警告日志映射成外部表,可以方便警告日志的管理:
创建一个逻辑目录:
SQL> CREATE DIRECTORY alertlog AS '/home/oracle/admin/centdb/bdump';

SQL> CREATE TABLE alert_tab ( text VARCHAR2(80) )
  2  ORGANIZATION EXTERNAL (
TYPE oracle_loader
DEFAULT DIRECTORY alertlog
    ACCESS PARAMETERS (
  3    4    5    6          RECORDS DELIMITED BY NEWLINE
    )
LOCATION('alert_centdb.log')
  7    8    9  )
REJECT LIMIT 9999;

 10 
Table created.

然后就可以在工具中查询该表的纪录。
这是一个将外部数据对应成外部表的例子,也就是说对于以前将数据用pb或者其他工具倒入数据库的操作都可以通过外部表的方式读取,只要不对外部表进行insert update delete,简单的操作select都是支持的。

二、下面的试验是使用外部表将数据库的数据导出的步骤:
创建逻辑目录:
SQL> CREATE DIRECTORY ext_dir AS '/home/lisa';

Directory created.

创建外部表:
SQL> SQL> CREATE TABLE emp_test
  2  (id, name, SUBSYSTEM_ID)
ORGANIZATION EXTERNAL
(
TYPE ORACLE_DATAPUMP
DEFAULT DIRECTORY ext_dir
LOCATION ('emp1.exp')
  3    4    5    6    7    8  )
REJECT LIMIT UNLIMITED AS
SELECT id, name, SUBSYSTEM_ID
FROM product_tab;
  9   10   11 
Table created.

查询该表纪录:
SQL> select count(*) from emp_test
  2  ;

  COUNT(*)
----------
        27

在/home/lisa目录下可以看到到处的exp文件:
-rw-r-----    1 oracle   oinstall    12288 Apr 25 14:14 emp1.exp

随后我试验了导出一个四百多万行纪录的表:
SQL> select count(*) from USER_TAB;

  COUNT(*)
----------
   4972208

SQL> select to_char(SYSTIMESTAMP,'yyyymmdd hh24:mi:ss.ff3') from dual;

TO_CHAR(SYSTIMESTAMP,'YYYYMMDD
---------------------------------------------------------------------------
20050425 14:38:22.633

SQL>
SQL> CREATE TABLE emp_test ORGANIZATION EXTERNAL (TYPE ORACLE_DATAPUMP DEFAULT DIRECTORY ext_dir LOCATION ('emp1.exp')) REJECT LIMIT UNLIMITED AS SELECT id,user_name FROM USER_TAB;

select to_char(SYSTIMESTAMP,'yyyymmdd hh24:mi:ss.ff3') from dual;


Table created.

SQL> SQL>
TO_CHAR(SYSTIMESTAMP,'YYYYMMDD
---------------------------------------------------------------------------
20050425 14:38:25.740

只要3秒多钟,我瞠目结舌了半天。

文件154M:
-rw-r-----    1 oracle   oinstall 154574848 Apr 25 14:38 emp1.exp

删除外部表:
SQL> drop table emp_test;

Table dropped.

导入数据:
SQL> CREATE TABLE user_tabtest(id number,USER_NAME VARCHAR2(32)) ORGANIZATION EXTERNAL (  TYPE ORACLE_DATAPUMP   DEFAULT DIRECTORY ext_dir   LOCATION ('emp1.exp') );

Table created.

察看user_tabtest表的数据,与源表相同。

用TYPE ORACLE_DATAPUMP导出的文件必须用TYPE ORACLE_DATAPUMP建立外部表导入,我开始以为用TYPE oracle_loader,费了半天劲也不对。oracle对导出的文件格式进行了处理,这样不是限制了这个功能的时候吗?
虽然导出的速度很快,但是我们通常导出成文本的操作并不能取代,因为格式不能符合我们的要求,所以只是在数据迁移的时候有优势。

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

下一篇: 小哞成长日记
请登录后发表评论 登录
全部评论

注册时间:2008-02-21

  • 博文量
    180
  • 访问量
    844000