• Oracle学习笔记(九)


    全局临时表自动处理数据:

    drop table ljb_tmp_session;
    create global temporary table ljb_tmp_session on commit preserve rows as select  * from dba_objects where 1=2;
    select table_name,temporary,duration from user_tables  where table_name='LJB_TMP_SESSION';
    drop table  ljb_tmp_transaction;
    create global temporary table ljb_tmp_transaction on commit delete rows as select * from dba_objects where 1=2;
    select table_name, temporary, DURATION from user_tables  where table_name='LJB_TMP_TRANSACTION';
    
    insert all 
       into  ljb_tmp_transaction
       into  ljb_tmp_session
    select * from dba_objects;
    
    select session_cnt,transaction_cnt from (select count(*) session_cnt from ljb_tmp_session),
     (select count(*) transaction_cnt from ljb_tmp_transaction);
    
    commit;
     
    select session_cnt,transaction_cnt from (select count(*) session_cnt from ljb_tmp_session),
    (select count(*) transaction_cnt from ljb_tmp_transaction);
    
    
    select session_cnt,transaction_cnt from (select count(*) session_cnt from ljb_tmp_session),
    (select count(*) transaction_cnt from ljb_tmp_transaction);
    

      不同session数据独立:

    drop table ljb_tmp_session;
    create global temporary table ljb_tmp_session on commit preserve rows as select  * from dba_objects where 1=2;
    select table_name,temporary,duration from user_tables  where table_name='LJB_TMP_SESSION';
    drop table  ljb_tmp_transaction;
    create global temporary table ljb_tmp_transaction on commit delete rows as select * from dba_objects where 1=2;
    select table_name, temporary, DURATION from user_tables  where table_name='LJB_TMP_TRANSACTION';
    
    --不同session的例子试验基于sesssion 的临时表即可了,不用试验另外一个了。
    ---连上session 1
     insert into ljb_tmp_session select * from dba_objects where rownum<=10;
     --可以体会提交,基于session 的提交并清理数据
     commit;
     select count(*) from ljb_tmp_session;
    
    
      COUNT(*)
    ----------
        10 
     
    ---不退出session 1,继续登录session 2
    insert into ljb_tmp_session select * from dba_objects where rownum<=20;
    commit;
    select count(*) from ljb_tmp_session;
    
      COUNT(*)
    ----------
        20
    

      产生日志较少:

    全局临时表是否在同样delete ,insert 和update 的情况下,产生的redo比普通表要少的多。
    
    sqlplus "/ as sysdba"
    grant all on v_$mystat to ljb;
    grant all on v_$statname to ljb;
    connect  ljb/ljb
    drop table t purge;
    create table t as select * from dba_objects ;
    --以下创建视图,方便后续直接用select * from v_redo_size进行查询
    create or replace view v_redo_size as
        select a.name,b.value
        from v$statname a,v$mystat b
        where a.statistic#=b.statistic#
        and a.name='redo size';
        
        
    select * from v_redo_size;
    
    --中间输入你的删除插入更新的动作
    
    select * from v_redo_size;    
    
    两次相减就是产生的redo量
    

      索引组织表:

    --必须有主键!
    ---分别建索引组织表和普通表进行试验
    set autotrace off
    drop table heap_addresses purge;
    drop table iot_addresses purge;
    create table heap_addresses
       (empno    number(10),
        addr_type varchar2(10),
        street    varchar2(10),
        city      varchar2(10),
        state     varchar2(2),
        zip       number,
        primary key (empno)
       )
    /
    
    create table iot_addresses
       (empno    number(10),
        addr_type varchar2(10),
        street    varchar2(10),
        city      varchar2(10),
        state     varchar2(2),
        zip       number,
       primary key (empno)
       )
       organization index
    /
    insert into heap_addresses
       select object_id,'WORK','123street','washington','DC',20123
       from all_objects;
    insert into iot_addresses
        select object_id,'WORK','123street','washington','DC',20123
        from all_objects;
    commit;
    
    ---分别比较索引组织表和普通表的查询性能
    set linesize 1000
    set autotrace traceonly
    select * from heap_addresses where empno=22;
    SQL> select * from heap_addresses where empno=22;
    
    执行计划
    ----------------------------------------------------------------------------------------------
    | Id  | Operation                   | Name           | Rows  | Bytes | Cost (%CPU)| Time     |
    ----------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT            |                |     1 |    50 |     1   (0)| 00:00:01 |
    |   1 |  TABLE ACCESS BY INDEX ROWID| HEAP_ADDRESSES |     1 |    50 |     1   (0)| 00:00:01 |
    |*  2 |   INDEX UNIQUE SCAN         | SYS_C0013751   |     1 |       |     1   (0)| 00:00:01 |
    ----------------------------------------------------------------------------------------------
    统计信息
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
              3  consistent gets
              0  physical reads
              0  redo size
            659  bytes sent via SQL*Net to client
            405  bytes received via SQL*Net from client
              1  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
              1  rows processed
              
              
    select * from iot_addresses where empno=22;
    
    执行计划
    ----------------------------------------------------------------------------------------
    | Id  | Operation         | Name               | Rows  | Bytes | Cost (%CPU)| Time     |
    ----------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |                    |     1 |    50 |     1   (0)| 00:00:01 |
    |*  1 |  INDEX UNIQUE SCAN| SYS_IOT_TOP_104441 |     1 |    50 |     1   (0)| 00:00:01 |
    ----------------------------------------------------------------------------------------
    统计信息
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
              2  consistent gets
              0  physical reads
              0  redo size
            751  bytes sent via SQL*Net to client
            416  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
              1  rows processed
     
    

      簇表:

    --构造环境
    --注意这个删除的先后顺序,否则会报ORA-00951: 簇非空
    set autotrace off
    drop table cust_orders;
    drop cluster shc;
    
    CREATE CLUSTER shc
    (
       cust_id     NUMBER,
       order_dt    timestamp SORT
    )
    HASHKEYS 10000
    HASH IS cust_id
    SIZE  8192
    /
    CREATE TABLE cust_orders
    (  cust_id       number,
       order_dt      timestamp SORT,
       order_number  number,
       username      varchar2(30),
       ship_addr     number,
       bill_addr     number,
       invoice_num   number
    )
    CLUSTER shc ( cust_id, order_dt )
    /
    
    
    ---开始执行分析
    set autotrace traceonly 
    variable x number
    --以下是利用有序散列聚族表的方法,发现排序被避免
    select cust_id, order_dt, order_number
      from cust_orders
     where cust_id = :x
     order by order_dt;
     
    
    执行计划
    ----------------------------------------------------------------------
    | Id  | Operation         | Name        | Rows  | Bytes | Cost (%CPU)|
    ----------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |             |     1 |    39 |     0   (0)|
    |*  1 |  TABLE ACCESS HASH| CUST_ORDERS |     1 |    39 |            |
    ----------------------------------------------------------------------
    统计信息
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
              0  consistent gets
              0  physical reads
              0  redo size
            416  bytes sent via SQL*Net to client
            404  bytes received via SQL*Net from client
              1  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
              0  rows processed
     
    --以下是普通方法,排序不可避免
    select job, hiredate, empno
      from scott.emp
     where job = 'CLERK'
     order by hiredate;
    
    执行计划
    ---------------------------------------------------------------------------
    | Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    ---------------------------------------------------------------------------
    |   0 | SELECT STATEMENT   |      |     3 |    60 |     4  (25)| 00:00:01 |
    |   1 |  SORT ORDER BY     |      |     3 |    60 |     4  (25)| 00:00:01 |
    |*  2 |   TABLE ACCESS FULL| EMP  |     3 |    60 |     3   (0)| 00:00:01 |
    ---------------------------------------------------------------------------
    统计信息
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
              7  consistent gets
              0  physical reads
              0  redo size
            640  bytes sent via SQL*Net to client
            415  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              1  sorts (memory)
              0  sorts (disk)
              4  rows processed
    

      外键索引性能:

    drop table t_p cascade constraints purge;
    drop table t_c cascade constraints purge;
    
    CREATE TABLE T_P (ID NUMBER, NAME VARCHAR2(30));
    ALTER TABLE T_P ADD CONSTRAINT  T_P_ID_PK  PRIMARY KEY (ID);
    CREATE TABLE T_C (ID NUMBER, FID NUMBER, NAME VARCHAR2(30));
    
    ALTER TABLE T_C ADD CONSTRAINT FK_T_C FOREIGN KEY (FID) REFERENCES T_P (ID);
    
    INSERT INTO T_P SELECT ROWNUM, TABLE_NAME FROM ALL_TABLES;
    INSERT INTO T_C SELECT ROWNUM, MOD(ROWNUM, 1000) + 1, OBJECT_NAME  FROM ALL_OBJECTS;
    COMMIT;
    
    ---外键未建索引前的表连接性能分析
    set autotrace traceonly
    set linesize 1000
    SELECT A.ID, A.NAME, B.NAME FROM T_P A, T_C B WHERE A.ID = B.FID AND A.ID = 880;
    
    执行计划
    ------------------------------------------------------------------------------------------
    | Id  | Operation                    | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
    ------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT             |           |    71 |  4260 |   137   (1)| 00:00:02 |
    |   1 |  NESTED LOOPS                |           |    71 |  4260 |   137   (1)| 00:00:02 |
    |   2 |   TABLE ACCESS BY INDEX ROWID| T_P       |     1 |    30 |     0   (0)| 00:00:01 |
    |*  3 |    INDEX UNIQUE SCAN         | T_P_ID_PK |     1 |       |     0   (0)| 00:00:01 |
    |*  4 |   TABLE ACCESS FULL          | T_C       |    71 |  2130 |   137   (1)| 00:00:02 |
    ------------------------------------------------------------------------------------------
    统计信息
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
            452  consistent gets
              0  physical reads
              0  redo size
           3605  bytes sent via SQL*Net to client
            459  bytes received via SQL*Net from client
              6  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
             72  rows processed
             
             
    --外键建索引后的表连接性能分析
    CREATE INDEX IND_T_C_FID ON T_C (FID);
    SELECT A.ID, A.NAME, B.NAME FROM T_P A, T_C B WHERE A.ID = B.FID AND A.ID = 880;
    执行计划
    --------------------------------------------------------------------------------------------
    | Id  | Operation                    | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
    --------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT             |             |    72 |  4320 |    69   (0)| 00:00:01 |
    |   1 |  NESTED LOOPS                |             |    72 |  4320 |    69   (0)| 00:00:01 |
    |   2 |   TABLE ACCESS BY INDEX ROWID| T_P         |     1 |    30 |     0   (0)| 00:00:01 |
    |*  3 |    INDEX UNIQUE SCAN         | T_P_ID_PK   |     1 |       |     0   (0)| 00:00:01 |
    |   4 |   TABLE ACCESS BY INDEX ROWID| T_C         |    72 |  2160 |    69   (0)| 00:00:01 |
    |*  5 |    INDEX RANGE SCAN          | IND_T_C_FID |    72 |       |     1   (0)| 00:00:01 |
    --------------------------------------------------------------------------------------------
    统计信息
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
             83  consistent gets
              0  physical reads
              0  redo size
           3605  bytes sent via SQL*Net to client
            459  bytes received via SQL*Net from client
              6  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
             72  rows processed 
    

      外键与锁:

    --外键索引性能研究之准备
    drop table t_p cascade constraints purge;
    drop table t_c cascade constraints purge;
    
    CREATE TABLE T_P (ID NUMBER, NAME VARCHAR2(30));
    ALTER TABLE T_P ADD CONSTRAINT  T_P_ID_PK  PRIMARY KEY (ID);
    CREATE TABLE T_C (ID NUMBER, FID NUMBER, NAME VARCHAR2(30));
    
    ALTER TABLE T_C ADD CONSTRAINT FK_T_C FOREIGN KEY (FID) REFERENCES T_P (ID);
    
    INSERT INTO T_P SELECT ROWNUM, TABLE_NAME FROM ALL_TABLES;
    INSERT INTO T_C SELECT ROWNUM, MOD(ROWNUM, 1000) + 1, OBJECT_NAME  FROM ALL_OBJECTS;
    COMMIT;
    
    create index idx_IND_T_C_FID on T_C(FID);
    
    外键有索引,没有死锁情况产生
    --首先开启会话1
    select sid from v$mystat where rownum=1;
    DELETE T_C WHERE FID = 2;
    
    --接下来开启会话2,也就是开启一个新的连接
    select sid from v$mystat where rownum=1;
    DELETE T_P WHERE ID = 2000;
    
    外键索引先删除
    drop index  idx_IND_T_C_FID;
    
    
    外键索引删除后,立即有锁相关问题
    --首先开启会话1
    select sid from v$mystat where rownum=1;
    DELETE T_C WHERE ID = 2;
    --接下来开启会话2,也就是开启一个新的连接
    select sid from v$mystat where rownum=1;
     
    --然后执行如下进行观察
    DELETE T_P WHERE ID = 2000;
    --居然发现卡住半天不动了!
    

      普通索引改主键:

    drop table t_p cascade constraints purge;
    CREATE TABLE t_p
    (order_id NUMBER(3),
     item_id NUMBER(2),
     comments varchar2(400));
    CREATE INDEX ord_itm_idx ON t_p(order_id,item_id);
    
    alter table t_p add constraint ord_itm_id_pk primary key (order_id,item_id) using index ord_itm_idx ;
    
    ---不需要如此操作(差别只是索引名不一样而已)
    drop index ord_itm_idx;
    alter table t_p add constraint ord_itm_id_pk primary key (order_id,item_id); 
    主键DISABLE再ENABLE后,外键需要重新生效
    drop table t_p  cascade constraints purge; 
    create table t_p (dept_id number,emp_name varchar2(20),emp_id number);
    alter  table t_p add constraints pk_dept_id PRIMARY KEY  (dept_id);
    ALTER  TABLE t_p ADD CONSTRAINT FK_T_F FOREIGN KEY (emp_id) REFERENCES T_P (dept_id) ;
    select CONSTRAINT_TYPE,TABLE_NAME,STATUS from user_constraints t where t.constraint_name in ('PK_DEPT_ID','FK_T_F');
    ALTER TABLE t_p DISABLE CONSTRAINT pk_dept_id CASCADE;
    select CONSTRAINT_TYPE,TABLE_NAME,STATUS from user_constraints t where t.constraint_name in ('PK_DEPT_ID','FK_T_F');
    ALTER TABLE t_p ENABLE CONSTRAINT pk_dept_id ;
    select CONSTRAINT_TYPE,TABLE_NAME,STATUS from user_constraints t where t.constraint_name in ('PK_DEPT_ID','FK_T_F');
    alter table t_p enable constraint FK_T_F;
    select CONSTRAINT_TYPE,TABLE_NAME,STATUS from user_constraints t where t.constraint_name in ('PK_DEPT_ID','FK_T_F');
    

      主键约束有延迟约束到提交才验证的功能

    drop table test cascade constraints;
    create table test as select rownum object_id,object_name from dba_objects where rownum<=20;
    ALTER TABLE test ADD CONSTRAINT pk_object_id PRIMARY KEY(object_id) DEFERRABLE INITIALLY DEFERRED;
    INSERT INTO test VALUES (21,'ABC'); 
    INSERT INTO test VALUES (21,'EFG');
    COMMIT;
    SET CONSTRAINT pk_object_id IMMEDIATE;
    INSERT INTO test VALUES (1,'LATA');
    INSERT INTO test VALUES (2,'KING');
    COMMIT;
    

      主外键设计其他约束条件:

    drop table test cascade constraints;
    create table test as select rownum object_id,object_name from dba_objects where rownum<=20;
    ALTER TABLE test ADD CONSTRAINT pk_object_id PRIMARY KEY(object_id) DEFERRABLE INITIALLY DEFERRED;
    INSERT INTO test VALUES (21,'ABC'); 
    INSERT INTO test VALUES (21,'EFG');
    COMMIT;
    SET CONSTRAINT pk_object_id IMMEDIATE;
    INSERT INTO test VALUES (1,'LATA');
    INSERT INTO test VALUES (2,'KING');
    COMMIT;
    

      表压缩:

    ---压缩表可减少数据量,从而减少IO
    
    DROP TABLE t purge;
    
    CREATE TABLE t NOCOMPRESS AS
    SELECT rownum AS n, rpad(' ',500,mod(rownum,15)) AS pad
    FROM dual
    CONNECT BY level <= 200000;
    
    execute dbms_stats.gather_table_stats(ownname=>user, tabname=>'t');
    
    --未压缩的表当前情况
    SELECT table_name, blocks,compression  FROM user_tables WHERE table_name = 'T';
    TABLE_NAME                         BLOCKS COMPRESS
    ------------------------------ ---------- --------
    T                                   14449 DISABLED
    set autotrace traceonly
    select count(*) from t;
    
    执行计划
    -------------------------------------------------------------------
    | Id  | Operation          | Name | Rows  | Cost (%CPU)| Time     |
    -------------------------------------------------------------------
    |   0 | SELECT STATEMENT   |      |     1 |  3922   (1)| 00:00:48 |
    |   1 |  SORT AGGREGATE    |      |     1 |            |          |
    |   2 |   TABLE ACCESS FULL| T    |   200K|  3922   (1)| 00:00:48 |
    -------------------------------------------------------------------
    统计信息
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
          14297  consistent gets
              0  physical reads
              0  redo size
            423  bytes sent via SQL*Net to client
            416  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
              1  rows processed
          
    --开始压缩表
    set autotrace off
    ALTER TABLE t MOVE COMPRESS;
    execute dbms_stats.gather_table_stats(ownname=>user, tabname=>'t');
    SELECT table_name, blocks,compression  FROM user_tables WHERE table_name = 'T';
    TABLE_NAME                         BLOCKS COMPRESS
    ------------------------------ ---------- --------
    T                                    2639 ENABLED
    
    set autotrace traceonly 
    select count(*) from t;
    
    执行计划
    -------------------------------------------------------------------
    | Id  | Operation          | Name | Rows  | Cost (%CPU)| Time     |
    -------------------------------------------------------------------
    |   0 | SELECT STATEMENT   |      |     1 |   718   (1)| 00:00:09 |
    |   1 |  SORT AGGREGATE    |      |     1 |            |          |
    |   2 |   TABLE ACCESS FULL| T    |   200K|   718   (1)| 00:00:09 |
    -------------------------------------------------------------------
    统计信息
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
           2595  consistent gets
              0  physical reads
              0  redo size
            423  bytes sent via SQL*Net to client
            416  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
              1  rows processed
              
    注意:压缩后的表更新的开销会更大,查询耗费的CPU也更多。所以压缩表一般适合在更新比较少,且CPU消耗不大,IO消耗很大系统中试用。
    

      索引压缩:

    ---压缩索引(联合索引的压缩层度会高一些)
    DROP TABLE t1 purge;
    
    CREATE TABLE t1 AS select * from dba_objects;
    alter table T1 modify owner not null;
    alter table T1 modify object_name not null;
    alter table T1 modify object_type not null;
    insert  into t1 select * from t1;
    insert  into t1 select * from t1;
    commit;
    create index idx1_object_union  on t1(owner,object_type,object_name);
    execute dbms_stats.gather_index_stats(ownname=>user, indname=>'idx1_object_union');
    
    --未压缩索引的当前情况
    SELECT t.index_name,t.compression,t.leaf_blocks,t.blevel  FROM user_indexes t WHERE index_name = 'IDX1_OBJECT_UNION';
    
    INDEX_NAME                     COMPRESS LEAF_BLOCKS     BLEVEL
    ------------------------------ -------- ----------- ----------
    IDX1_OBJECT_UNION              DISABLED        2043          2
    
    --开始压缩索引
    drop table t2 purge;
    create table t2 as select * from t1;
    alter table T2 modify owner not null;
    alter table T2 modify object_name not null;
    alter table T2 modify object_type not null;
    create index idx2_object_union  on t2(owner,object_type,object_name);
    ALTER index  idx2_object_union  rebuild  COMPRESS;
    execute dbms_stats.gather_index_stats(ownname=>user, indname=>'idx2_object_union');
    
    SELECT t.index_name,t.compression,t.leaf_blocks,t.blevel  FROM user_indexes t WHERE index_name = 'IDX2_OBJECT_UNION';
    
    INDEX_NAME                     COMPRESS LEAF_BLOCKS     BLEVEL
    ------------------------------ -------- ----------- ----------
    IDX2_OBJECT_UNION              ENABLED          907          2
    
    
    set linesize 1000
    set autotrace traceonly
    select count(*) from t1 ;
    
    执行计划
    -----------------------------------------------------------------------------------
    | Id  | Operation             | Name              | Rows  | Cost (%CPU)| Time     |
    -----------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT      |                   |     1 |   572   (1)| 00:00:07 |
    |   1 |  SORT AGGREGATE       |                   |     1 |            |          |
    |   2 |   INDEX FAST FULL SCAN| IDX1_OBJECT_UNION |   251K|   572   (1)| 00:00:07 |
    -----------------------------------------------------------------------------------
    统计信息
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
           2067  consistent gets
              0  physical reads
              0  redo size
            425  bytes sent via SQL*Net to client
            415  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
              1  rows processed
              
    select count(*) from t2 ;
    
    执行计划
    -----------------------------------------------------------------------------------
    | Id  | Operation             | Name              | Rows  | Cost (%CPU)| Time     |
    -----------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT      |                   |     1 |   258   (1)| 00:00:04 |
    |   1 |  SORT AGGREGATE       |                   |     1 |            |          |
    |   2 |   INDEX FAST FULL SCAN| IDX2_OBJECT_UNION |   282K|   258   (1)| 00:00:04 |
    -----------------------------------------------------------------------------------
    统计信息
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
            922  consistent gets
              0  physical reads
              0  redo size
            425  bytes sent via SQL*Net to client
            415  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
              1  rows processed
    

      列值如何存放:

    --什么类型就放什么值,否则会发生类型转换,导致系能问题!
    --(是存放字符的字段就设varchar2类型,是存放数值的字段就设置number类型,是存放日期的字段就设置date类型)
    
    --举例说明:
    drop table t_col_type purge;
    create table t_col_type(id varchar2(20),col2 varchar2(20),col3 varchar2(20));
    insert into t_col_type select rownum,'abc','efg' from dual connect by level<=10000;
    commit;
    create index idx_id on t_col_type(id);
    set linesize 1000
    set autotrace traceonly
    
    select * from t_col_type where id=6;
    
    执行计划
    --------------------------------------------------------------------------------
    | Id  | Operation         | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
    --------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |            |     1 |    36 |     9   (0)| 00:00:01 |
    |*  1 |  TABLE ACCESS FULL| T_COL_TYPE |     1 |    36 |     9   (0)| 00:00:01 |
    --------------------------------------------------------------------------------
       1 - filter(TO_NUMBER("ID")=6)
    统计信息
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
             32  consistent gets
              0  physical reads
              0  redo size
            540  bytes sent via SQL*Net to client
            415  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
              1  rows processed
    
    --实际上只有如下写法才可以用到索引,这个很不应该,是什么类型的取值就设置什么样的字段。
              
    select * from t_col_type where id='6';
    执行计划
    ------------------------------------------------------------------------------------------
    | Id  | Operation                   | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
    ------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT            |            |     1 |    36 |     2   (0)| 00:00:01 |
    |   1 |  TABLE ACCESS BY INDEX ROWID| T_COL_TYPE |     1 |    36 |     2   (0)| 00:00:01 |
    |*  2 |   INDEX RANGE SCAN          | IDX_ID     |     1 |       |     1   (0)| 00:00:01 |
    ------------------------------------------------------------------------------------------
       2 - access("ID"='6')
    统计信息
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
              4  consistent gets
              0  physical reads
              0  redo size
            544  bytes sent via SQL*Net to client
            415  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
              1  rows processed   
    

      过时的字段:

    CHAR和LONG基本要被VARCHAR2和CLOB等替换,属于已经过时的字段类型。
    
    其中CHAR不利扩展,且有可能浪费空间。
    而LONG的更新查询操作极为麻烦!
    

      

  • 相关阅读:
    「Codeforces 724F」Uniformly Branched Trees
    「笔记」组合入门题选做
    「算法笔记」组合入门与应用
    「算法笔记」可持久化线段树
    「算法笔记」期望 DP 入门
    「NOIP 2016」换教室
    「算法笔记」基础数论
    「笔记」关于乱搞
    python 的列表遍历删除
    Python基础第三篇:函数
  • 原文地址:https://www.cnblogs.com/sunliyuan/p/12306809.html
Copyright © 2020-2023  润新知