zoukankan      html  css  js  c++  java
  • Oracle基础 12 对象 objects 同义词/序列/试图/索引

    --创建同义词
    create public synonym employees for hr.employees;  --公共同义词
    需要 create public synonym 权限

    表的所有用户授予公共权限  
    grant select on employees to public;

    create synonym t1_s for t1;   --私有同义词
    如果想在不同的环境中通过不同的别名引用同一个表时,要创建私有同义词。
      
    编译同义词 
    alter synonym t1_s compile;
     
    管理同义词
    select table_name, synonym_name 
    from dba_synonyms
    where owner='IKKI';
      
    删除同义词
    drop public synonym employees;
    drop synonym t1_s;


    --创建序列
      create sequence seq1 
      increment by 1
      start with 1
      maxvalue 100 | minvalue 10 | nomaxvalue
      cache | nocache 
      cycle | nocycle;

      例如:
      create sequence seq1
      increment by 1
      start with 10
      maxvalue 999
      nocache 
      nocycle;


    查看序列
      select * from user_sequences; 
      select seq1.nextval from dual;
      select seq1.currval from dual;


    使用序列
      create table emp2(
        id number(10),
        name varchar2(20),
        dept varchar2(20),
        bh number(10)
      );
      insert into emp2(bh,id,name,dept)
      values(seq1.nextval,302,'tom',2002);


    --rowid
      select rowid,bh,id,name  
      from emp2;

      select * from emp2
      where rowid='AAASOVAAEAAAAKOAAB';

    --创建试图
      create view my_employees as
      select employee_id,first_name,last_name,salary
      from employees
      where manager_id=122 
      with read only;            --用户只能从试图进行查询
      
    删除试图
      drop view my_employees;


    物化试图
      可以在物化试图上做以下事情:
      在物化试图上创建索引;
      在分区表上创建物化试图;
      对物化试图进行分区。

      
    刷新方式
      on commit:用此方式,当一个主表的更改数据被提交时,物化试图被自动刷新以反应数据的更改。
      on demand:用此方式,你必须执行诸如 DBMS_MVIEW.REFREST 这样的过程来更新物化试图。

      
    刷新类型
      complete:此刷新类型将完全重新计算基于物化试图的查询。如果物化试图原来花费12小时建立,那么重建也将花费同样的时间。显然,当主表中很少一部分行被更改、删除或插入时,不应该使用此选项。
      fast:Oracle 将使用物化试图日志来记录主表的所有更改。然后使用物化试图日志来更新物化试图。物化试图日志是基于相应物化试图的表。在物化试图与联接相关的每个表都需要有自己的物化试图日志,以便捕捉表的更改。
      force:如果选择此选项,Oracle 将尽量使用 fast 刷新机制,如果由于某些原因而不能使用该机制,则将使用 complete 刷新方法。此选项默认的刷新方法。
      never:此刷新选项不刷新物化试图。显然,对于主表有许多更改的物化试图来说,这不是一个可行的选项。

      使用 DBMS_MVIEW 程序包

      
    创建物化试图
    1、授予必要的权限
       grant create materialized view to ikki;
       grant query rewrite to ikki;    
      
    2、创建物化试图日志
       create materialized view log
       on products with sequence,rowid
       (prod_id, prod_name, prod_desc, prod_subcategory,
        prod_subcategory_desc, prod_category, prod_category_desc, prod_weight_class, prod_unit_of_measure, prod_pack_size, supplier_id,
        prod_status, prod_list_price, prod_min_price)
        including new values;

      create materialized view log on sales
      with sequence,rowid
      (prod_id, cust_id, time_id, channel_id, promo_id,
       quantity_sold, amount_sold)
       including new values;

      
    3、创建物化试图
      create materialized view product_sales_mv
      build immediate
      refresh fast
      enable query rewrite
      as select p.prod_name, sum(s.amount_sold) as dollar_sales,
      count(*) as cnt, count(s.amount_sold) as cnt_amt
      from sales s, products p
      where s.prod_id=p.prod_id
      group by p.prod_name;

      build immediate:立即建立物化试图,这是默认选项。另一种方法是使用 build deferred 选项,此选项将在以后某个指定时刻装载物化试图及其数据。
      refresh fast:说明物化试图采用 fast 刷新方法。
      enable query rewrite:表示 Oracle 优化程序将透明的重写查询以使用新创建的物化试图而不是基础的主表。



    SQL> create materialized view log on ygb;
    Materialized view log created.

    SQL> create materialized view mv_ygb
      2  refresh fast
      3  as select * from ygb;
    Materialized view created.

    删除物化视图日志
    SQL> drop materialized view log on ygb;
    Materialized view log dropped.

    删除物化视图
    SQL> drop materialized view mv_ygb;
    Materialized view dropped.

     


    --创建索引
      create index emp_tb_id on emp2(id);


    删除索引
      drop index emp_tb_id;


    重建索引
      alter index emp_tb_id rebuild;

      alter index emp_tb_id rebuild online;

    在进行索引的联机重建时,可以执行所有的 DML 操作,但不能执行任何 DDL 操作。


    不可见索引
    你可以把不可见索引作为临时索引,以便执行某些特殊操作,或者用来在索引成为正式索引前先对其进行测试。此外,有时使一个索引不可见可见替代删除索引或使其不可用。你可以使一个索引临时不可见来测试删除此索引的效果。


    1、创建不可见索引
    create index idx_test on test(tname)
    invisible;


    2、更改索引使其不可见
    alter index idx_test invisible;
    alter index idx_test visible;


    3、查询索引是否可见
    select index_name,visibility from user_indexes
    where index_name='IDX_TEST';


    --关于创建 Oracle 表的有效索引的准则:
        1、如果需要访问的数据不超过表中的4%或5%,则可以使用索引。全表扫描适用于请求的数据占全表数据百分比较高的查询。请记住,用索引来检索行需要两个读操作:即读索引和读表。
        2、相对较小的表应该避免使用索引。全表扫描很适合小表。对于小表不需要同时存储表的数据和索引的数据。
        3、为所有表创建主键。在指定一列作为主键时,Oracle自动创建该列的索引。
        4、对包括在多表联接操作中使用的列建立索引。
        5、对 where 子句中频繁使用的列建立索引。
        6、对包括在 order by 和 group by 操作的列或涉及排序的 union 和 distinct 等其他操作中的列建立索引。由于索引已经被排序,因此执行前述操作的排序要求将显著减少。
        7、由长字符串组成的列通常不是索引的候选列。
        8、被频繁更改的列由于涉及开销问题,理论上不建索引。
        9、使索引数目较少。
        10、当唯一列值可能不唯一时需要使用组合索引。在组合索引中,驱动列或第一列应该为选择性最强的列。
    建立索引的黄金法则:表的索引应该基于你锁期望的查询中出现的表列。一个表可以创建多个索引:可以选择创建X列或Y列或二者的组合索引。

  • 相关阅读:
    查看JAVA占用CPU高的线程日志
    行为面试法(STAR)
    下载mysql document
    win10 子系统ubuntu中文乱码
    java 排序
    进制
    开始转型学习java
    java Collections工具类
    java Map实例
    java Map
  • 原文地址:https://www.cnblogs.com/john2017/p/6364481.html
Copyright © 2011-2022 走看看