`

oracle学习笔记

阅读更多
1.RDBMS (Relation database management system)   关系数据库系统;
2.常用的数据库有:oracle  (市场占有率44%)、 DB2(由于数据库很大, 市场占有率12%)  SQLserver(microsoft)  mysql(开源)  sysbase;
3.跟数据库打交道的人分两种:DBA(数据库管理员,金牌证书)、程序员();
4.sql数据库的语言类型:数据操纵语言(data MANIPULATION LANGUAGE) DML 用于改变数据库对象     语句:update,insert,delete
                       数据定义语言(DATA DENIFITION LANGUAGE): DDL       语句:create,alter,drop
                       数据控制语言(DATA CONTROL LANGUAGE)      DCL 用于权限授予和收回     语句:  grant
                       数据访问语言(data QUERY LANGUAGE);       DQL     语句:   select
5.sql语言分:86版     select * from tablename a, tablename b where a.字段=b.字段;
             92版     select * from tablename a join tablename b on conditions;
  oracle从1.0~8.0i版本的兼容性不好,9i不耗内存;10g(grid)将表当成一个一个网格来处理(表),当前主流;11g(太大)。
5.范式:对于数据库来说有六大范式,对于程序员来说只要满足前三个
---在一张表里不能出现相同的字段; 1NF
---在满足第一范式的基础上,必须要有唯一的主键或复合主键;2NF
---在满足第二范式的基础上,消除键与键之间的依赖性。    3NF
6.笛卡尔积  
内联接  表自身的联接
7.表的联接         (+) 不能与 in or一起
                   左联接   select * from emp a ,dept b where a.detpno=b.deptno(+);
           外联接  右联接   select * from emp a, dept b where a.deptno(+)=b.deptno;
                   全联接   select * from emp a ,dept b where a.deptno=b.deptno(+) union select * from emp a, dept b where a.deptno(+)=b.deptno;

8.SQL中的对象有:table、index、view、sequence、synonym、constraint、procedure、function、cursor、package、trigger;
      对象命名 table       t_  
           index    ind_
   view     v_
       sequence seq_
   synonym  syn_
   constraint   cons_
   procedure    proc_
   function     func_
   cursor       cur_
   package      pkg_
   trigger      trg_
     查看sql中的对象:select * from user_object ;

9.table  表:行和列的组合就构成了表。
表的重命名rename oldname  to newname;
         建表:create table table_name ;
         表的复制:create table table_name as select * from table_name1;
         表结构的复制:create table table_name as select * from table_name1 where 1=0;
表中的数据复制insert into table_name(col1,col2,col3) select c1,c2,c3 from table_name1;
         删除整张表(包括结构和数据):drop table table_name;  
删除表的数据(截断表):truncate table table_name;   截断数据不用commit,没有事务,截断的数据不能恢复
         查看表信息:  select * from tab;        select * from user_tables;
建表(字段):  create table table_name (column1 datatype primary key,column2 datatype constraint constraint_name,....colname3 references tablename(field));
         表结构的修改:给表增加列    alter table table_name add columnname datatype [default value];
                       改变列的类型    alter table table_name modify columnname datatype [default value];
                       删除列   alter table table_name drop column column_name;
   重命名列 alter table table_name rename column old_colname to new_colname;
  
   给表添加备注 comment on table table_name is '';
   查看表的备注 select * from user_tab_comments where TABLE_NAME='EMPLOYEES';
  
   给表列添加备注 comment on column table_name.column_name is '';
   查看列的备注 select * from user_col_comments where TABLE_NAME='EMPLOYEES';
  
         表数据的修改:删除表的数据   delete from tablename where (condition);  commit;       如果不加where条件,则删除该表中的所有数据但不包括结构(字段);
                       插入数据:insert into table_name(column1,column2,column3...)values(value1,value2,value3...);
                       数据的更新:update table_name set 字段1=value,字段2 = value where(condition);
删除表:DROP TABLE temp_test;
10.临时表   
create global temporary table temp_
(
field  datatype,
field1  datatype
)
on commit delete rows;

on commit preserve rows;
     
create global temporary table temp_test(
username  VARCHAR2(20),
password  VARCHAR2(20)
)
on commit preserve rows;   
 
11.index  索引:是用于加速数据存取速度的数据库对象,通过索引可以降低I/O次数,从而提高sql语句的访问性能。
         索引根据索引列值得唯一性可分为:唯一索引和非唯一索引;   根据索引列的个数可分为:单列索引和复合索引。
唯一索引与唯一约束的区别:索引是物理概念,约束是逻辑概念。实现上没有什么区别唯一约束就是创建一个唯一索引来实现的。
         一张表中可以建立多个索引,但是索引的组合必须不同;
         索引的创建:create index indx_name on table_name(字段1,字段2,...);
         索引的维护:索引的重建(当执行delete操作时,在索引上只会进行逻辑删除,其空间不能提供其他数据的插入操作;索引当频繁使用索引后应定期将索引重建,以提高其利用率);
                               alter index index_name rebuild;
         索引的删除:drop index index_name;
         显示索引信息:select * from user_indexes;     (用于显示当前用户的所有索引)
                       select * from user_ind_columns;   (用于显示当前用户所有索引列的信息)。
不能用or replace
CREATE UNIQUE INDEX ind_    ON tablename(field);

索引重建
判断是否需要重建索引:
SQL>analyze index index_name validate structure;
SQL> select height,DEL_LF_ROWS/LF_ROWS from index_stats;
( 或 Select index_name,blevel from dba_indexes where blevel>=4 );
说明 : 当查询出来的 height>=4 或者 DEL_LF_ROWS/LF_ROWS>0.2 的场合 , 该索引考虑重建 ;

重建索引的办法:
1.1、删除并从头开始建立索引。
删除并从头开始建索引:方法是最慢的,最耗时的。一般不建议。
1.2 、 使用 alter index index_name rebuild 命令重建索引。
快速重建索引的一种有效的办法,因为使用现有索引项来重建新索引,如果客户操作时有其他用户在对这个表操作,尽量使用带online参数来最大限度的减少索引重建时将会出现的任何加锁问题,alter index index_name rebuild online。但是由于新旧索引在建立时同时存在,因此,使用这种技巧则需要有额外的磁盘空间可临时使用,当索引建完后把老索引删除,如果没有成功,也不会影响原来的索引。利用这种办法可以用来将一个索引移到新的表空间。
Alter index index_name rebuild tablespace tablespace_name [online];

Alter index index_name rebuild online parallel 4 tablespace space_name; Alter index index_name noparallel;

优点:是快速重建索引的一种有效的办法,可以用来将一个索引移到新的表空间。
缺点:重建期间需要额外空间。
1.3 、 使用 alter index index_name coalesce 命令重建索引。
使用带有coalesce参数时重建期间不需要额外空间,它只是在重建索引时将处于同一个索引分支内的叶块拼合起来,这最大限度的减少了与查询过程中相关的潜在的加锁问题,但是,coalesce选项不能用来将一个索引转移到其他表空间
alter index index_name coalesce;
优点:重建期间不需要额外空间。
缺点:coalesce选项不能用来将一个索引转移到其他表空间

--select 'alter index ' || a.segment_name || ' rebuild tablespace NG_INDEX online;' from dba_segments a where a.segment_type = 'INDEX' and a.owner = 'AMS20130223';
12.view  
视图以经过定制的方式显示来自一个或多个表的数据
视图可以视为“虚拟表”或“存储的查询”
创建视图所依据的表称为“基表”
视图的优点有:
提供了另外一种级别的表安全性
隐藏的数据的复杂性
简化用户的SQL命令
隔离基表结构的改变
通过重命名列,从另一个角度提供数据
视图: 是一个表或多个表的逻辑表示,它对应一条select语句,并且其查询结果将被作为一张表对待,所有视图也被称为虚表。
         视图的创建:create view view_name as select * from table_name where(condition);
         视图的修改:create or replace view view_name(视图列的别名) as select * from table_name;
         视图的删除:drop view view_name;
         显示视图信息:select * from user_views;

13.sequence  序列:是用于生成唯一数字的数据库对象。
            建立序列:create sequence seq_deptno
                      start with 50
                      increment by 1
                      maxvalue 100
                      minvalue 10;
            序列的使用:通过伪列nextval和currval来实现的      insert into mydept (deptno,dname,loc) values(seq_deptno.nextval,'DEVELOPMENT','DALLAS');     COMMIT;
            序列的修改:alter sequence seq_deptno --只能改increment by num
                                increment by num;
                      
            序列的删除: drop sequence seq_name;
            显示序列信息: select * from user_sequences;    
                          注:oracle为该数据字典视图提供了同义词SEQ,可以使用SEQ取得序列信息。select * from seq;
            不能用or replace

14.synonym  同义词:方案对象的别名;同义词包括:公共同义词和私有同义词。
           创建同义词:公共同义词    create public synonym syn_name for [schema.]object    schema:方案 
                       私有同义词    create synonym syn_name for [schema.]object;
           删除同义词:drop synonym syn_name;
           查看同义词信息:select * from user_synonyms;
                           注:oracle为该数据字典视图提供了同义词syn,可以使用syn取得序列信息。select * from syn;

15.constraint: 约束:用于确保数据库数据满足特定的商业逻辑或企业规则。
              约束包括NOT NULL,UNIQUE,PRIMARY KEY,FOREIGN KEY,CHECK等5种类型。constraint_type    =>  funpc
             1). not null
                 create table table_name(column1 datatype [constraint cons_name] not null,column2 datatype....);
             2).unique
                 create table table_name(column1 datatype ,column2 datatype.... ,[constraint cons_name] unique(column));
             3).primary key
                 create table table_name(column1 datatype,column2 datatype [constraint cons_name] primary key,column3 datatype....);
             4).FOREIGN KEY
                 create table table_name(column1 datatype,column2 datatype [constraint cons_name] references table(column),column3 datatype....);
             5).check   create table table_name(column1 datatype,column2 datatype....,check(condition));
                
             增加约束的格式:
   1)alter table table_name add [constraint cons_name] constraint_type (column,....);
   2)alter table table_name modify columnname [constraint cons_name] not null;    
 
             1).not null      alter table table_name modify columnname [constraint cons_name] not null;
             2).unique        alter table table_name add [constraint cons_name] unique(column);
             3).primary key   alter table table_name add [constraint cons_name] primary key(column);
             4).foreign key   alter table table_name add [constraint cons_name] foreign key(column) references tablename(column);
             5).check         alter table table_name add [constraint cons_name] check(condition);

  alter table emp add constraint cons_unique_sal unique(sal);
              alter table emp add constraint cons_fk_deptno foreign key(deptno) references dept(deptno);
  alter table emp add constraint cons_pk_emp primary key(empno);
              alter table table_name add constraint cons_ck check(sal > 800 AND comm IS NOT NULL);

             删除约束:  alter table table_name drop constraint cons_name;
             查看约束:  select * from user_constraints;
             查看当前用户约束所对应的表列:   select * from user_cons_columns;
alter table EMP
drop constraint FK_DEPTNO;
 
alter table EMP
add constraint FK_DEPTNO foreign key (DEPTNO)
references DEPT (DEPTNO) ON DELETE cascade ; --级联删除

启用/停用约束
alter table table_name enable constraint cons_name;
alter table table_name disable constraint cons_name;

16.块    块(block)是pl/sql的基本程序单元;块由三个部分组成:定义部分、执行部分、例外处理部分。
         declare
          /*
           *        定义部分(定义变量、常量、复杂数据类型、游标)
           */
         begin
          /*
           *        执行部分(pl/sql语句)
           */
         exception  
when others then
   ...
   rollback;
          /*
           *        例外处理部分(处理运行错误)
           */
         end;

17.控制结构语句     条件语句:包括了3种语句if-then、if-then-else、if-then-elsif。
                              if condition then
                                  statements;
                              [elsif condition then
                                  statements;]
                              [else statements;]
                              end if;

                    循环语句: 包括了基本循环、while循环、for循环等3种类型。
                              1).基本循环   loop
                                                  statement;
                                                  ....
                                                  exit [when condition];
                                            end loop;
                              2).while循环   while condition loop
                                                   statament;
                                                   statament;
                                                   statament;
                                                   ....
                                             end loop;
                              3).for循环    for counter in [reverse] n1..n2  loop
                                                 statament;
                                                 statament;
                                                 statament;
                                                 ....
                                            end loop;
pl/sql中赋值   :=
18.cursor:  游标:定义游标、打开游标、提取数据、关闭游标。
           cursor cv_name is select * from table where (condition);    --定义游标
           open   cv_name;                   --打开游标
           fetch  cv_name into variabel1[variabel2,variable3,....];
           close  cv_name;
       
          1).简化写法   for  一行元素 in 游标   loop
                             一行元素.属性;
                             一行元素.字段;
                        end loop;

                  例:
                        declare
                           cursor cv_emp_cursor is
                              select ename,sal,empno from emp order by empno;
                        begin
                             for v_emp in cv_emp_cursor loop
                                dbms_output.put_line('v_ename='|| v_emp.ename ||',v_sal=' || v_emp.sal || ',empno=' || v_emp.empno);
                              end loop;
                        end;
         
           2).传统写法    fetch  cursor_name into  variabel1[,variabel2,variable3,....];
  
                        declare
   v_ename emp.ename%type;
   v_sal emp.sal%type;
                           v_empno emp.empno%type;
  
                           cursor cv_emp_cursor is
                              select ename,sal,empno from emp order by empno;
                        begin

open cv_emp_cursor;

                           loop
                           fetch cv_emp_cursor into v_ename,v_sal,v_empno;
exit when cv_emp_cursor%notfound;
dbms_output.put_line('v_ename='|| v_ename || ',v_sal=' ||v_sal|| ',v_empno='|| v_empno);
                           end loop;
  
                           close cv_emp_cursor;
  
                        end;         

19.procedure:  过程:用于执行特定操作的pl/sql块.
              过程中的参数有三种模式:in(输入)  out(输出)  in out(输入输出)
              过程的建立:  create or replace procedure proc_name(argumeng1 [mode1] datatype1,argument2 [mode2] datatype2,....)
                           is/as
                              ---定义变量            

                           begin
                              ---body                   注意:select into的用法。
                           end;
           
              过程的调用: call proc_name(argumeng1 [mode1] datatype1,argument2 [mode2] datatype2,....);
                          exec proc_name(argumeng1 [mode1] datatype1,argument2 [mode2] datatype2,....);
              删除过程:drop procedure proc_name;
              查看过程源代码: select * from user_source;
 
  查看过程 SELECT * FROM user_procedures;
 
  过程中无参时,定义时不能有()  create or replace procedure proc_name  is/as    begin end;
  调用时,一定要有()     call proc_name();

20.function:  函数: 用于返回特定数据.
             函数和过程的区别是函数有返回值,过程没有返回值.
             函数中的参数有三种模式:in(输入)  out(输出)  in out()
             函数的建立:  create or replace function func_name(argumeng1 [mode1] datatype1,argument2 [mode2] datatype2,....) return datatype
                           is/as
                              ---定义变量
                           begin
                              ---body
                           end;
             函数的调用: call func_name(argumeng1 [mode1] datatype1,argument2 [mode2] datatype2,....);
                         exec func_name(argumeng1 [mode1] datatype1,argument2 [mode2] datatype2,....);
             函数的删除:drop function func_name;
             查看函数源代码: select * from user_source;

查看函数 SELECT * FROM user_objects a WHERE a.object_type = 'FUNCTION';
            
        

21.package:  包:用于逻辑组合相关的自定义类型、常量、变量、游标、过程、函数。包由包体和包规范两部分组成。
            包的创建:create [or replace] package  pkg_name
                       is|as
                        ——定义
procedure proc_**();
function func_**();
  end;
        包体的创建:  
  create [or replace] package body pkg_name
                       is|as
                        ——定义
procedure proc_**()
begin
  ...
end;

function func_**()
begin
  ...
end;
  end;

22.trigger:  触发器:存放在数据库中,并且被隐含执行的存储过程。触发器分语句触发器和行触发器。
                  语句触发器的语法:  create [or replace] trigger trg_name
                                             {before|after|instead of} insert [or update or delete] of 字段
                                      on table_name
  [declare]
                                      pl/sql block;
      

                  行触发器的语法:    create or replace trigger trg_name
                                             {before|after|instead of} insert [or update or delete] of 字段
                                      on table_name
    [REFERENCING NEW AS New OLD AS Old]
                                      for each row [when condition] when new.  old.
  [declare]
                                      pl/sql block;
                  注意:
                        触发器中不能有commit; 
                        insert时,old的值为空值。
                  禁止/激活触发器    alter trigger trg_name enable;
                                     alter trigger trg_name disable;
  删除:
       drop trigger trg_name;
                  显示触发器信息     select * from user_triggers;
  --触发器通过insert update delete是不能触发自己的
 
  --如果要写用如下方法:
  CREATE OR REPLACE TRIGGER trg_emp
BEFORE INSERT ON emp
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW

  DECLARE

  BEGIN
:NEW.sal := 1000;
  END;
 
  --------------------------------------------
  if inserting then
 
  elsif updating then
 
  elsif deleting then
 
  end  if;

  类名Change
23.java source : create or replace and compile java source named Change
               as
   java代码

删除:

  drop java source Change;

调用:
    
CREATE OR REPLACE FUNCTION xchg(v NUMBER) RETURN VARCHAR2
  AS
LANGUAGE JAVA NAME 'com.waytojob.pub.Change.trans(double) return java.lang.String';

24.表空间
DROP TABLESPACE USERS1 INCLUDING CONTENTS AND DATAFILES;
    --保证先要有目录
CREATE [UNDO撤消表空间] TABLESPACE USERS1 DATAFILE
'F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS011.DBF' SIZE 5M AUTOEXTEND ON NEXT 1280K MAXSIZE UNLIMITED;

25.临时表空间
DROP TABLESPACE TEMP1 INCLUDING CONTENTS AND DATAFILES;
--保证先要有目录
CREATE TEMPORARY TABLESPACE TEMP1 TEMPFILE
'F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEMP011.DBF' SIZE 20M AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED;
--给表更改表空间. 一定注意,修改表空间后,原来表上的索引全部失效,需要重新rebuild。!!!!!!!!!!!
alter table tablename move tablespace newTableSpace;
alter user username
    --限额
        quota 大小(unlimited无限大)  on users1;
26.dblink
-- Drop existing database link
drop public database link REMOTE_01;
-- Create database link
--不能OR replace连用
create public database link  REMOTE_01
connect to scott identified by "tiger"
using 'localhost:1521/orcl';

调用: 表@dblink名
SELECT * FROM emp@remote01;
drop public database link REMOTE_01;
    CREATE  public database link  REMOTE_01
         connect to scott identified by "tiger"
       using '192.168.1.133:1521/test';
    SELECT * FROM SCOTT.EMP@REMOTE_01 a,dept b WHERE a.deptno = b.deptno;
    -- Create the synonym
    create or replace synonym REMOTE_EMP
          for SCOTT.EMP@REMOTE_01;
    SELECT * FROM remote_emp a,dept b WHERE a.deptno = b.deptno;         
27.内置函数   数字函数:  ROUND  TRUNC   MOD   ABS  CEIL  EXP   FLOOR   LOG   POWER....
  字符函数:  UPPER  LOWER  LENGTH   TRIM   INSTR  CONCAT  SUBSTR    substr  LPAD  RPAD....
              日期时间函数:MONTHS_BETWEEN    ADD_MONTHS   NEXT_DAY   ....
              转换函数: TO_CHAR()   TO_DATE()   TO_NUMBER()
              聚合函数: SUM()  AVG()  MAX()   MIN()   COUNT()               
28.数据库数据的恢复    1). 当使用drop语句删除数据库数据时,我们可以在pl/sql中browse中的Recycle bin文件夹中找到被drop的文件,右击restore;
也可以通过查看回收站来查看,在通过sql恢复
SELECT * FROM USER_RECYCLEBIN a order by a.droptime desc;
flashback table t_test to before drop ;
--如果存在同名的,就需要恢复时重命名
flashback table t_test to before drop rename to t_test1 ;

清空回收站 purge recyclebin; 
清空回收站的某个表 purge table "BIN$/UpBuh+LQ9yZGN95BFsk5Q==$0";

                       2). 如使用delete语句删除数据库数据时,我们使用flashback_transaction_query;
                            select * from flashback_transaction_query where (condition);

flashback table t_patrolpoint to timestamp to_timestamp('13-08-28 15:00:05','yy-mm-dd hh24:mi:ss');
alter table t_patrolpoint enable row movement;

  imp username/pwd@IP:port/sid file=要导入dmp的路径 full=y  如:imp scott/tiger@localhost:1521/orcl file=c:\1.dmp full=y
exp username/pwd@IP:port/sid file=要导出dmp的路径         如:exp scott/tiger@localhost:1521/orcl file=c:\2.dmp


exp/imp

下面介绍的是导入导出的实例,向导入导出看实例基本上就可以完成,因为导入导出很简单。
数据导出:
1 将数据库TEST完全导出,用户名system 密码manager 导出到D:\daochu.dmp中
   exp system/manager@TEST file=d:\daochu.dmp full=y
2 将数据库中system用户与sys用户的表导出
   exp system/manager@TEST file=d:\daochu.dmp owner=(system,sys)
3 将数据库中的表table1 、table2导出
   exp system/manager@TEST file=d:\daochu.dmp tables=(table1,table2)
4 将数据库中的表table1中的字段filed1以"00"打头的数据导出
   --exp system/manager@TEST file=d:\daochu.dmp tables=(table1) query=\" where filed1 like '00%'\"
exp mohurd1/mohurd1@192.168.1.250:1521/orcl file=c:\mohurd1_20120116.dmp   log=c:\mohurd1_20120116.log  
imp mohurd3/mohurd3@192.168.1.250:1521/orcl fromuser=mohurd2 touser=mohurd3 file=c:\mohurd2.dmp   log=c:\mohurd2.log
 
上面是常用的导出,对于压缩我不太在意,用winzip把dmp文件可以很好的压缩。
不过在上面命令后面 加上 compress=y  就可以了

数据的导入
1 将D:\daochu.dmp 中的数据导入 TEST数据库中。
   imp system/manager@TEST  file=d:\daochu.dmp
   上面可能有点问题,因为有的表已经存在,然后它就报错,对该表就不进行导入。
   在后面加上 ignore=y 就可以了。
2 将d:\daochu.dmp中的表table1 导入
imp system/manager@TEST  file=d:\daochu.dmp  tables=(table1)

29、Oracle缓存表(db_buffer_pool)由三部分组成:
1、buffer_pool_defualt
2、buffer_pool_keep
3、buffer_pool_recycle

如果要把表钉死在内存中,也就是把表钉在keep区。相关的命令为:
alter table 表名 storage(buffer_pool keep);  这句命令把表示表如果缓存的话是缓存在keep区。
可以通过语句:
select table_name from dba_tables where buffer_pool='KEEP';查询到该表是放在keep区中的。  但是不意味着表已经被缓存了。
下面的语句把表缓存:
alter table 表名 cache; 可以通过
select table_name from dba_tables where rtrim(cache)='Y';  查询到该表已经被缓存了。
加入到keep区的表不是说不能被移出内存,不过是比较不容易移出内存。
也可以手工来移出内存,命令如下:
alter table ... nocache; 

30、start with…connect by prior
SELECT ……
  FROM ……
        [WHERE CONDITION1 AND CONDITION2]
CONNECT BY {PRIOR列名1=列名2|列名1=PRIOR裂名2} [CONDITION3……]
[START WITH];
CONNECT BY子句说明每行数据将是按层次顺序检索,并规定将表中的数据连入树型结构的关系中。
PRIOR运算符必须放置在连接关系的两列中某一个的前面。对于节点间的父子关系,PRIOR运算符在父节点的一侧,另一侧表示子节点,从而确定查找树结构是的顺序是自顶向下还是自底向上。在连接关系中,除了可以使用列名外,还允许使用列表达式。START WITH子句为可选项,用来标识哪个节点作为查找树型结构的根节点。若该子句被省略,则表示所有满足查询条件的行作为根节点。
将condition放在where后和放在CONNECT BY的区别:
放在where后是对整个树形结构的结果进行过滤,即使父节点不满足条件,子节点也会查询出来(从父到子结构查询);而放在CONNECT BY后,是在获取树形结构时进行过滤,如果父节点不满足条件,子节点是不会被查询出来(从父到子结构查询)

31、LOBINDEX、LOBSEGMENT
当我们建立一个含有lob字段的表时,oracle会自动为lob字段建立两个单独的segment,一个用来存放数据(LOBSEGMENT),另一个用来存放索引(LOBINDEX),并且它们都会存储在对应表指定的表空间中。但是当我们用alter table tablename move tablespace tbs_name 来对表做空间迁移时,只能移动非lob字段以外的数据。而如果我们要同时移动lob相关字段的数据,我们就必需用如下的含有特殊参数据的文句来完成,它就是: alter table tablename move lob(columeName) store as (tablespace newTableSpaceName);  
这样,就将这两个对象从老的表空间移至新的表空间。

32、分区表
分区的优点:
1、增强可用性:如果表的一个分区由于系统故障而不能使用,表的其余好的分区仍可以使用;
2、减少关闭时间:如果系统故障只影响表的一部份分区,那么只有这部份分区需要修复,矿能比整个大表修复花的时间更少;
3、维护轻松:如果需要得建表,独产管理每个公区比管理单个大表要轻松得多;
4、均衡I/O:可以把表的不同分区分配到不同的磁盘来平衡I/O改善性能;
5、改善性能:对大表的查询、增加、修改等操作可以分解到表的不同分区来并行执行,可使运行速度更快,在数据仓库的TP查询特别有用。
6、分区对用户透明,最终用户感觉不到分区的存在。
--查询分区part_15的数据
select * from t_task partition(part_15);
--查询子分区part_15_1的数据
select * from t_task subpartition(part_15_1);

分区维护:
(1)增加一个分区:分区范围只能往上增,不能增加一个少于原有的分区:
--添加分区
alter table t_task add partition part_11 values(11);
--添加分区、子分区
alter table t_task add partition PART_11 values(11) tablespace ng_data (
subpartition PART_11_1 values (1) tablespace ng_data, 
subpartition PART_11_2 values (2) tablespace ng_data
);
--在已有的分区中添加子分区
alter table t_task modify partition PART_11 add subpartition PART_11_1024 values (1024) tablespace ng_data; 
(2)合并分区:(合并后的分区必须指下最后一个大value的分区)
alter table t_task merge partitions part_11,part_12 into  partition part_13
(3)删除一个分区:
--删除分区
alter table t_task drop partition part_01
--删除子分区
alter table T_TASK drop subpartition PART_17_DEFAULT;
(4)将分区改名
alter table T_TASK rename Partition part_01 to part_011
(5)将分区改表空间
alter table T_TASK move part_01 tablespace ng_data nologging
(6)查询特定分区
   select * from t_task partition(part_15);
select * from t_task subpartition(part_15_1);
  (7)添加数据
   insert into table_name select * from table_name partition (partition_name)
  (8)分区表的导出
  userid=USER/PWD
  buffer=102400
  tables=table_name:partition_name,
  file=E:exp_paraxxx.dmp
  log=E:exp_paraxxx.log
  
未完待续……
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics