注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

陈钟鸣的博客

独立之精神,自由之思想.

 
 
 

日志

 
 

用一周时间写的Oracle教程(临别寄语?)  

2008-05-20 16:50:45|  分类: oracle |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
0.环境

    sqlplus /nolog
    
    conn / as sysdba
    create user training identified by training;
    grant connect to training;
    grant resource to training;
    grant select on scott.emp to training;
    conn training/training
    
1.充分利用数据库的功能:

    1.1 审计功能(operate log):
        --create a test table
        create table emp as select * from scott.emp;
        alter table emp add constraint pk_emp primary key (empno);
        select view_name from user_views;
        
        --enableversioning
        EXECUTE DBMS_WM.CreateWorkspace ('myws');
        execute DBMS_WM.GotoWorkspace('myws');
        execute dbms_wm.enableversioning('EMP','VIEW_WO_OVERWRITE');
        --execute dbms_wm.enableversioning('EMP','VIEW_W_OVERWRITE');
        select view_name from user_views;
        
        --DML
        update emp set ename=ename||'01' where empno=1000;
        update emp set ename=ename||'02' where empno=1000;
        delete from emp where empno=7369;
        insert into emp values(5000,'SMITH','CLERK',7902,null,800,0,30);
        
        commit;
        
        --versioning
        set line 2000
        set pages 2000
        col wm_workspace format a10
        col WM_USERNAME format a8
        select * from emp_hist;
        
        --export
        execute dbms_wm.export(table_name=>'EMP',staging_table=>'EMP_HISTORY',workspace => 'LIVE',overwrite_existing_data=>TRUE);
        
        --disable versioning
        execute dbms_wm.disableversioning(table_name=>'EMP',force=>TRUE);
        
    1.2 表别名
    
        conn / as sysdba
        grant create synonym to training;
        conn training/training
        
        CREATE SYNONYM emp_1 FOR emp;
        
        select * from emp_1;
        
    1.3 一条sql根据不同的条件插入多个表
    
        --使用insert first,insert all代替if
        create table emp_2 as select * from emp where 1=0;
        create table emp_3 as select * from emp where 1=0;
        
        insert first
            when deptno=30 then
              into emp_2
                  values(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO)
            when deptno<>30 then
                into emp_3
                    values(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO)
        select EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO from emp;
        
        
        select * from emp_2;
        select * from emp_3;
        
    1.4 使用merge into代替update,delete和insert
        
        update emp set sal = 0;
        delete from emp where empno = 1000;
        select * from emp;
        
        
        merge into emp a
            using (select EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO from emp_2) b
            on (a.empno = b.empno)
            when matched then
                update set a.sal = b.sal*1.01
                delete where empno=4000
            when not matched then
                insert  values(b.EMPNO,b.ENAME,b.JOB,b.MGR,b.HIREDATE,b.SAL,b.COMM,b.DEPTNO);
            
    1.4    大数据量装载,使用sqlldr,与外部表.
            (略)
            
    1.5 使用物化视图
    
        --权限准备
        conn / as sysdba
        grant select on scott.dept to training;
        grant create materialized view to training;
        grant QUERY REWRITE to training;
        grant GLOBAL QUERY REWRITE to training;
        
        --数据准备
        create table dept as select * from scott.dept;
        alter table dept add constraint pk_dept primary key (deptno);
        
        --创建物化视图,view存在的问题.
        create materialized view mv_emp
        parallel 4
        build immediate
        refresh on commit
        as
            select a.empno,a.ename,a.sal,b.deptno, b.dname
            from emp a,dept b
            where a.deptno = b.deptno(+);
            
        delete from emp where empno=2000;
        select * from mv_emp;
        
    1.6 几个特殊的数据类型
    
        --两个时间段类型
        --interval year to month
            select interval '123-11' year(3) to month from dual;
            select sysdate+interval '123-11' year(3) to month from dual;
            
        --INTERVAL DAY(5) TO SECOND
            select (sysdate - (sysdate - 10.1)) DAY(5) TO SECOND from dual
            select sysdate + interval '+00010 02:24:00.000000' DAY(5) TO SECOND from dual;
            
2. 表模式选择

    2.0 使用正确的数据类型
        一个大的原则,日期就用日期型,数字就用数字型,字符串就用字符串型.
        
        如果一定要用字符串,就选好格式.
        有个简单的例子:
        第一行,每四个月执行一次,第二行,每三年零五个月执行一次,第三行,每121天零3小时执行一次.
        create table job(lastexecute date,planType number,planDate varchar2(20));
        insert into job values(trunc(sysdate),1,'4');
        insert into job values(trunc(sysdate),2,'003-5');
        insert into job values(trunc(sysdate),3,'+121 03:00:00.000000');
        --
        --求下次的执行时间
        select lastexecute,case planType when 1 then ADD_MONTHS(lastexecute,to_number(plandate))
                                                    when 2 then lastexecute+TO_YMINTERVAL(plandate)
                                                    when 3 then lastexecute+TO_DSINTERVAL(plandate)
                                                    else lastexecute
                                             end nextexecute
        from job;    
        
                LASTEXECUTE         NEXTEXECUTE
        ------------------- -------------------
        2008-05-16 00:00:00 2008-09-16 00:00:00
        2008-05-16 00:00:00 2011-09-16 00:00:00
        2008-05-16 00:00:00 2008-05-17 03:00:00
        
    2.1 堆表
    
        普通类型的表.
        create table tmp (id number,ename varchar2(10));
        
    2.2 群表
    
        好处:
            --通过公共键物理地将数据保存在一起.
            --允许将来自多个数据库的数据存储在相同的物理数据库块中.
        坏处:
            --不能进行群的直接路径装载.
            --不能分区集群表.
            
        grant select any dictionary to training;
        grant alter session to training;
        
        --B* tree索引集群表
        create cluster user_objects_cluster_btree(username varchar2(30)) size 1024;
        create index user_objects_idx on cluster     user_objects_cluster_btree;
        --散列群
        create cluster user_objects_cluster_hash(username varchar2(30)) hashkeys 100 size 3168;
        
        --在群中创建表
        create table user_info
        (
            username,user_id,account_status
        )
        cluster user_objects_cluster_btree(username)
        as
        select username,user_id,account_status
        from dba_users
        where 1=0;
        
        create table users_objects
        (
            owner,object_name,object_id,object_type
        )
        cluster user_objects_cluster_hash(owner)
        as
        select owner,object_name,object_id,object_type
        from dba_objects
        where 1=0;
        
        insert
          when (r=1) then
              into user_info
              (username,user_id,account_status) values(username,user_id,account_status)
            when (1=1) then
                into users_objects    
                (owner,object_name,object_id,object_type) values(owner,object_name,object_id,object_type)
        select a.username,a.user_id,a.account_status,b.owner,b.object_name,b.object_id,b.object_type,
            row_number() over (partition by owner order by object_id) r
        from dba_users a,all_objects b
        where a.username = b.owner ;
        
        
        begin
            for x in(select username from all_users)
            loop
                for i in 1..10
                loop
                    for y in (select a.username,b.object_name from user_info a,users_objects b where a.username=b.owner)
                    loop
                      null;
                    end loop;
                end loop;
            end loop;
        end;
        
        
    --tkprof的统计结果:
        Rows     Row Source Operation
        -------  ---------------------------------------------------
              4  SORT ORDER BY (cr=3 pr=0 pw=0 time=221 us)
              4   TABLE ACCESS CLUSTER COL$ (cr=3 pr=0 pw=0 time=132 us)
              1    INDEX UNIQUE SCAN I_OBJ# (cr=2 pr=0 pw=0 time=42 us)(object id 3)
        
        ********************************************************************************
        
        call     count       cpu    elapsed       disk      query    current        rows
        ------- ------  -------- ---------- ---------- ---------- ----------  ----------
        Parse        1      0.02       0.02          0          0          0           0
        Execute      1      4.59       4.86          0          0          0           1
        Fetch        0      0.00       0.00          0          0          0           0
        ------- ------  -------- ---------- ---------- ---------- ----------  ----------
        total        2      4.62       4.88          0          0          0           1


    小结:
        --物理地集中放置数据.
        --提高缓冲区存放效率.
        --减少逻辑I/O
        --减少索引需求,因为所有表共享一个群键索引.
        以上是优点,但B*tree群也存在一些缺点:
        --不能进行直接路径装载,
        --不能分区.
        --设置群尽寸要他细思考.
        --必须控制或可控制对群的插入,否则集群效果会变坏.
        --集群表的插入比传统表慢,因为数据需要它必须进入的位置.堆表可以在任何放置数据的地方添加数据;

    2.3 IOT表
        索引组织表基本是一个存储在索引中的表.它本质上类似于一个B*tree群,其中数据与一个键值物理地存
        储在一起,但它有以下不同:
        --存在一个数据结构,一个索引结构,而B*tree群有一个索引和一个数据段.
        --数据按键排序.
        --IOT在两实现方面非常有用.一种是作为关联表,这些表用于多对多的关系中.另一种是表中数据的物理
        放置非常重要,但不能预知数据插入的顺序,或者数据不能以群随时保持数据集中放置的次序到达.
        
        2.3.1 用IOT替代关联表以节省空间
            --传统关联
            create table association
            (
                primary_key_table1,
                primaray_key_table2
            );
            
            create index association_indx1 on association(primary_key_table1,primaray_key_table2);
            create index association_indx2 on association(primary_key_table2,primaray_key_table1);
            
            --IOT方式
            create table association_iot
            (
                primary_key_table1,
                primaray_key_table2
                primary key (primary_key_table1,primaray_key_table2)                
            )
            organization index;
            
            create index association_iot_inx on
                association_iot(primaray_key_table2);
            
        2.3.2 用IOT集中放置随机插入的数据
        
            --(在索引段中存储数据IOT)
            create table iot
            (
                username varchar2(30),
                document_name varchar2(30),
                other_data char(100),
                constraint iot_pk
                primary key(username,document_name)
            )    
            organization index;
            
            create table heap
            (
                username varchar2(30),
                document_name varchar2(30),
                other_data char(100),
                constraint heap_pk
                primary key(username,document_name)
            );
            
            --随机插入数据
            truncate table heap;
            truncate table iot;
            begin
                for i in 1..100
                loop
                    for x in (select username from all_users)
                    loop
                        insert into heap(username,document_name,other_data)
                            values(x.username,x.username||'_'||i,'x');
                            
                        insert into iot(username,document_name,other_data)
                            values(x.username,x.username||'_'||i,'x');
                        
                    end loop;
                end loop;
                commit;
            end;
            --**以上这段代码并非高效的代码,这里只是举例子,在生产环境中,尽量不要这个写.
            --建议使用bulk collect
            
            
            select * from heap where username='SCOTT';
            
            実行計画
            ----------------------------------------------------------
               0      SELECT STATEMENT Optimizer=CHOOSE
               1    0   TABLE ACCESS (BY INDEX ROWID) OF 'HEAP'
               2    1     INDEX (RANGE SCAN) OF 'HEAP_PK' (UNIQUE)
                        
            統計
            ----------------------------------------------------------
                      0  recursive calls
                      0  db block gets
                     77  consistent gets
                      0  physical reads
                    128  redo size
                   3386  bytes sent via SQL*Net to client
                    569  bytes received via SQL*Net from client
                      8  SQL*Net roundtrips to/from client
                      0  sorts (memory)
                      0  sorts (disk)
                    100  rows processed
                    
            select * from iot where username='SCOTT';
            
            実行計画
            ----------------------------------------------------------
               0      SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=82 Bytes=11152)
               1    0   INDEX (RANGE SCAN) OF 'IOT_PK' (UNIQUE) (Cost=2 Card=82 Bytes=11152)
            
            統計
            ----------------------------------------------------------
                      0  recursive calls
                      0  db block gets
                     15  consistent gets
                      0  physical reads
                    128  redo size
                   3386  bytes sent via SQL*Net to client
                    569  bytes received via SQL*Net from client
                      8  SQL*Net roundtrips to/from client
                      0  sorts (memory)
                      0  sorts (disk)
                    100  rows processed
            
            总结:
            --物理地集中存储数据
            --提高缓冲区高速缓存效率.
            --降低逻辑I/O
            --减少对索引的需求;表就是索引.
            
            --数据排序存储.
            --IOT可以联机重建
            --对于非常宽的行,IOT结构可能存在问题.比较适于瘦长表.
            
    2.4 分区表
        自从oracle8i 开始可以把一个表分割为多个小的部分,这样可以对oracle的性能优化带来很大的好处
        2.4.1 范围分区
                create table RangeTable(
          id number(10,0) ,
          name varchar2(90),
          grade number(10,0),
          constraint pk_rangetable primary key(id)
        )
        partition by range(grade)
        (
          partition part1 values less than (100) tablespace users,
          partition part2 values less than (200) tablespace users,
          partition part3 values less than (300) tablespace users,
          partition part4 values less than (400) tablespace users,
          partition part5 values less than (500) tablespace users,
          partition part0 values less than (MAXVALUE) tablespace users
        );
        
        insert into rangetable select rownum,trim(object_name),trunc(dbms_random.value()*1000) from all_objects;
        
                select count(*) from rangetable where grade <= 200 ;

                  COUNT(*)
                ----------
                      5935
                
                
                実行計画
                ----------------------------------------------------------
                   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=19 Card=1 Bytes=2)
                   1    0   SORT (AGGREGATE)
                   2    1     PARTITION RANGE (ITERATOR)
                   3    2       TABLE ACCESS (FULL) OF 'RANGETABLE' (Cost=19 Card=29288 Bytes=58576)
                   
        2.4.2 Hash分区
        
              create table HashTable(
          id int primary key,
          name varchar(20),
          grade int
        )
        partition by hash(grade)
        partitions 10
        store in (users);
                
        2.4.3 List分区
        
            create table ListTable(
                id int primary key,
                name varchar2(20),
                area varchar2(10)
            )
            partition by list(area)
            (
                partion part1 values('shanghai','beijing')
                partion part2 values('dalian','shenyang')
            );
            
        2.4.4 索引分区
        
            create index indexTable_index
            on indextable(name)
            local
            (
                partition part1 tablespace users
                partition part2 tablespace users
                partition part3 tablespace users
            );
            
            --local告诉oracle表indextable的每一个分区建立一个索引.
            
            --gloabal为全局索引,全局索引可以包含多个分区的值
            --注意:不能为散列分区或子分区创建全局索引.
            
            create index indextable_index
            on indextable(name)
            global;
            
            --分区维护
      --移动分区
          alter table goods move partition p1 tablespace system;
      --删除分区
          alter table goods drop partition p1;
      --添加分区
          alter table goods add partition p1 values less than(to_date('1999-08=01','YYYY-MM-DD'));
      --结合分区(只能用于散列方法分区)
        alter table goods coalesce partition;
      --截断分区
          alter table goods truncate partition p3;
      --拆分分区
          alter table goods split partiiton p2
               at(to_date('1999-12-12','yyyy-mm-dd'))
               into(partiiton p4,partiiton p5);
      --合并分区
          alter table goods merge partitions p4,p5 into parititon p6
            
            --交换表中的数据
       alter table tab2 exchange partiiton p1 with table tab1
      
      --用exp倒出分区表:
      
               C:\Documents and Settings\5109160096>exp scott/tiger tables=(rangetable:part1);
                
                指定された表をエクスポートします... 従来型パス経由...
                . 表                     RANGETABLEをエクスポート中
                . パーティション                          PART1をエクスポート中       2947行エクスポートされまし
                
                
            --逻辑备份与恢复举例:
                select count(*) from rangetable where grade<100;
                  COUNT(*)
                    ----------
                          3535
                exp scott/tiger file=part1 tables=(rangetable:part1)
                
                alter table rangetable truncate partition part1;--截断一个分区(删除分区中的所有数据)
                select count(*) from rangetable where grade<100;
                  COUNT(*)
                    ----------
                             0
                imp scott/tiger file=part1 tables=(rangetable)  ignore=y
                select count(*) from rangetable where grade<100;
                  COUNT(*)
                    ----------
                          3535

            --交换分区数据
                create table RangeTable_tmp
                (
          id number(10,0),
          name varchar2(90),
          grade number(10,0),
          constraint pk_rangetable_tmp primary key(id)
        );
        insert into rangetable_tmp select * from rangetable where grade < 50;
        commit;
        select count(*) from rangetable_tmp;
        
        alter table rangetable exchange partition part1 with table rangetable_tmp;
        select count(*) from rangetable where grade<100;
        select count(*) from rangetable_tmp;
        
            --分区的好处
                --易于管理.
                --提高性能.
                --提高可用性.

    2.5 外部表
        --略
    
3. 索引的类型
    3.1 B*Tree索引
        --传统的标准的索引类型
    3.2 Bitmap索引
        --一种索,其中利用位图,单个索引项可指向许多行.通常在B*tree索引中,单个索引项指向单个行.而在位图索引中,单个索引项可能指向数百行.
        
    3.3 FBI
        --基于函数的索引.
            --进行不区分大小写的搜索或排序.
            --对复杂方程式进行搜索
            --实现自己的函数和操作符,然后在其上进行搜索,高效地扩展SQL语言.
            
            --提高访问效率
                create table fbi_1
                (
          name varchar2(90)
        );
                insert into fbi_1
           select (case a.r
                           when trunc(r) then
                           upper(a.object_name)
                           else
                           lower(a.object_name)
                           end)
           from (select rownum/2 r,object_name from all_objects) a;
           
       create index fbi_1_inx on fbi_1(name);
       
       select * from fbi_1 where upper(name)='EMP';

                NAME
                ---------------------------------------------------------------------
                emp
                emp
                
                実行計画
                ----------------------------------------------------------
                   0      SELECT STATEMENT Optimizer=CHOOSE
                   1    0   TABLE ACCESS (FULL) OF 'FBI_1'
                   
                drop index fbi_1_inx;
                
                create index fbi_1_inx on fbi_1(upper(name));
                analyze table fbi_1 compute statistics;
                
                select * from fbi_1 where upper(name)='EMP';
                
                実行計画
                ----------------------------------------------------------
                   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=3 Card=2 Bytes=46)
                   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'FBI_1' (Cost=3 Card=2 Bytes=46)
                   2    1     INDEX (RANGE SCAN) OF 'FBI_1_INX' (NON-UNIQUE) (Cost=1 Card=2)
                
            --减小索引大小.
            
                alter table fbi_1 add  flag char(1);
                 
                 update fbi_1 set flag = 1 where rownum<29000;
                 update fbi_1 set flag = 0 where flag is null;
                 
                 select flag, count(*) from fbi_1 group by flag;
                FL   COUNT(*)
                -- ----------
                0         308
                1       28999
                
                create index fbi_1_ind_2 on fbi_1(decode(flag,'1',null,'0',flag));
                
                create view v_fbi_1 as
                    select name,decode(flag,'1',null,'0',flag) flag from fbi_1;
                    
                analyze table fbi_1 compute statistics
                for table
                for all indexes
                for all indexed columns;    
                
                analyze index fbi_1_ind_2 validate structure for all;
                
                
                NAME                 DEL_LF_ROWS    LF_ROWS    LF_BLKS
                -------------------- ----------- ---------- ----------
                FBI_1_IND_2                    0        308          1
                
                select /*+ index(SCOTT.FBI_1 FBI_1_IND_2)*/ * from v_fbi_1 where flag = '0';
                
                実行計画
                ----------------------------------------------------------
                   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=308 Bytes=7392)
                   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'FBI_1' (Cost=2 Card=308Bytes=7392)
                   2    1     INDEX (RANGE SCAN) OF 'FBI_1_IND_2' (NON-UNIQUE) (Cost=1Card=308)

                
    3.4 域索引
        --自己建立的索引,如对文本,空间数据等...
        
            conn scott/tiger@coconet
            接続されました。
            drop table tcontents;
            create table tcontents (id number(10),subject varchar2(10));

             --创建日文分词
            execute ctx_ddl.create_preference('japanese_lexer','japanese_vgram_lexer');
            create index tcontents_ind on tcontents(subject) indextype is ctxsys.context parameters ('lexer japanese_lexer sync(on commit)') parallel 2 online;

            insert into tcontents values(1,'陳');
            insert into tcontents values(2,'ぃ');
            insert into tcontents values(3,'馬');
            
            commit;
            insert into tcontents values(4,'豊田');
            insert into tcontents values(4,'江藤');
            commit;
            
            SELECT * FROM tcontents WHERE contains (subject, '陳 or 馬 or 江')  > 0;
            
            
            
    3.5 反向索引
        --B*tree索引的一种,索引键中的字节的颠倒的.

    3.6 降序索引
        --B*tree索引的一种,其中一个或多个字段降序排列.
            create table t as select * from all_objects;
            CREATE INDEX IND_T ON T(OWNER,OBJECT_TYPE);
            CREATE INDEX desc_ind_t ON T(OWNER desc ,OBJECT_TYPE asc);
            exec dbms_stats.gather_index_stats('SCOTT','T');
            
            select /*+index(T IND_T)*/* from t order by OWNER desc ,OBJECT_TYPE asc;
            
            実行計画
            ----------------------------------------------------------
               0      SELECT STATEMENT Optimizer=CHOOSE (Cost=1666 Card=29316 Bytes=2843652)
               1    0   SORT (ORDER BY) (Cost=1666 Card=29316 Bytes=2843652)
               2    1     TABLE ACCESS (BY INDEX ROWID) OF 'T' (Cost=826 Card=29316 Bytes=2843652)
               3    2       INDEX (FULL SCAN) OF 'IND_T' (NON-UNIQUE) (Cost=26 Card=29316)

            select /*+index(T desc_ind_t)*/* from t order by OWNER desc ,OBJECT_TYPE asc;
            
            実行計画
            ----------------------------------------------------------
               0      SELECT STATEMENT Optimizer=CHOOSE (Cost=826 Card=29316 Bytes=2843652)
               1    0   TABLE ACCESS (BY INDEX ROWID) OF 'T' (Cost=826 Card=29316Bytes=2843652)
               2    1     INDEX (FULL SCAN) OF 'DESC_IND_T' (NON-UNIQUE) (Cost=26 Card=29316)
            
4. SQL语句处理

    4.1 使用索引
        --在查询,链接时尽量使用域索引.
        
    4.2 避免%word%的情况
        --可以尝试使用域索引代替.
        
    4.3 用连接代替子查询
        select * from emp where deptno in(select deptno from dept);
        
    4.4 表连接
    
        --多表连接
            create table t1 (sid number(10,0),name varchar2(20));
            create table t2 (cid number(10,0),class varchar2(20));
            create table t3 (tid number(10,0),teacher varchar2(20));
            alter table t1 add cid number(10,0);
            alter table t2 add tid number(10,0);
            alter table t3 add cid number(10,0);
            
            insert into t1 values(1,'chen',1);
            insert into t1 values(2,'chen',2);
            insert into t1 values(3,'chen',1);
            insert into t2 values(1,'1 class',1);
            insert into t2 values(2,'2 class',2);
            insert into t3 values(1,'t1',2);
            insert into t3 values(2,'t2',1);
            
            select a.name,a.class,t3.teacher
            from
            (select t1.*,t2.class from t1,t2 where t1.cid = t2.cid) a,
            t3
            where
            a.cid = t3.cid;
            
        --exsits表连接
            select * from emp a exsits(select 1 from dept b where a.deptno = b.deptno);
            
5. 表分析与索引重建
    5.1 分析表
        --收集表的统计数据
        --CBO优化器是依赖表数据统计的数据字典,来进行优化的.
        --如果使用CBO但是没有正确的数据提供给优化器,优化器会作出错误的执行计划,导致效率低下.
        
        analyze table desctable compute statistics;
        execute DBMS_STATS.GATHER_TABLE_STATS ('SCOTT', 'DESCTABLE');
        
    5.2 索引重建
        系统运行一段时间后,索引有可能损坏,损坏的索引,有时会引致SQL被heap住.
        特别是在move表或分区后,一定要重建一下索
引..
        
        alter index SYS_IOT_TOP_31062 rebuild;
        
    5.3 每日监视表空间的使用情况
            
        SELECT upper(f.tablespace_name) "tablespace_Name",
               d.Tot_grootte_Mb "size",
               d.Tot_grootte_Mb - f.total_bytes "used",
               to_char(round((d.Tot_grootte_Mb - f.total_bytes) / d.Tot_grootte_Mb * 100,2),'990.99') "used percent",
               f.total_bytes "free_size",
               f.max_bytes "maxbytes"
         FROM     
            (SELECT tablespace_name,
                    round(SUM(bytes)/(1024*1024),2) total_bytes,
                    round(MAX(bytes)/(1024*1024),2) max_bytes
              FROM sys.dba_free_space
             GROUP BY tablespace_name) f,
            (SELECT dd.tablespace_name, round(SUM(dd.bytes)/(1024*1024),2) Tot_grootte_Mb
              FROM   sys.dba_data_files dd
              GROUP BY dd.tablespace_name) d
        WHERE d.tablespace_name = f.tablespace_name   
        ORDER BY 4 DESC;
  评论这张
 
阅读(92)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017