zoukankan      html  css  js  c++  java
  • 两表关联查询创建约束,外键对比

    --开启执行计划:

    set autotrace on

    SP2-0618: Cannot find the Session Identifier. Check PLUSTRACE role is enabled

    找不到会话标识符,启用检查
    SP2-0611: Error enabling STATISTICS report

    错误:统计报告

    grant plustrace to scott
    *
    ERROR at line 1:
    ORA-01919: role 'PLUSTRACE' does not exist                ---角色不存在


    SQL> select * from dba_roles where role='PLUSTRACE'; ---查询角色

    no rows selected

    SQL> @?/sqlplus/admin/plustrce.sql                              -----执行脚本
    SQL> drop role plustrace;
    drop role plustrace
    *
    ERROR at line 1:
    ORA-01919: role 'PLUSTRACE' does not exist


    SQL> create role plustrace;

    Role created.

    SQL> grant select on v_$sesstat to plustrace;

    Grant succeeded.

    SQL> grant select on v_$statname to plustrace;

    Grant succeeded.

    SQL> grant select on v_$mystat to plustrace;

    Grant succeeded.

    SQL> grant plustrace to dba with admin option;

    Grant succeeded.

    SQL> set echo off

    -----------------------------

    grant plustrace to scott;

    SQL> select USERNAME,GRANTED_ROLE from user_role_privs;

    USERNAME GRANTED_ROLE
    ------------------------------ ------------------------------
    SCOTT CONNECT
    SCOTT PLUSTRACE
    SCOTT RESOURCE

    ----这是最后的:类似的查询;

    select empno,ename,sal from scott.emp e,scott.dept d where e.deptno=d.deptno; 

    --生成测试:

    SQL> create table emp1 as select * from emp;

    SQL> create table dept2 as select * from dept;

    **********测试查询一(两个表,没有索引,没有约束)*********************************

    SQL> set autotrace traceonly;
    SQL> select empno,ename,sal from emp1 e,dept2 d where e.deptno=d.deptno;

    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
    ----------------------------------------------------------------------------
    | 0 | SELECT STATEMENT | | 14 | 826 | 6 (0)| 00:00:01 |
    |* 1 | HASH JOIN | | 14 | 826 | 6 (0)| 00:00:01 |
    | 2 | TABLE ACCESS FULL| DEPT2 | 4 | 52 | 3 (0)| 00:00:01 |
    | 3 | TABLE ACCESS FULL| EMP1 | 14 | 644 | 3 (0)| 00:00:01 |

    1 - access("E"."DEPTNO"="D"."DEPTNO")

    Note
    -----
     dynamic sampling used for this statement (level=2)

              7  consistent gets

    exec dbms_stats.gather_table_stats(ownname=>'SCOTT',tabname=>'EMP1');

    *****************************************测试查询二(dept2表中建立了主键约束(建立了索引))*******************************************

    --创建外键约束:

    alter table emp1 add constraint emp_forkey foreign key(deptno) references dept2(deptno)
    *
    ERROR at line 1:
    ORA-02270: no matching unique or primary key for this column-list

                    --没有匹配的这个列表唯一或主键

    子表创建与父表的:外键约束,必须要明确父表关联列,有主键或者唯一约束;

    SQL> alter table dept2 add constraint p_k primary key(deptno);

    SQL> select owner,constraint_name from user_constraints ;

    OWNER CONSTRAINT_NAME
    -------------------- --------------------
    SCOTT P_K

    SQL> select INDEX_NAME,TABLE_NAME from user_indexes;

    INDEX_NAME TABLE_NAME
    ------------------------------ ------------------------------
    P_K DEPT2

    --建立主键约束后,父表dept2,的列deptno列自动生成索引;

    SQL> set autotrac traceonly
    SQL> select empno,ename,sal from emp1 e,dept2 d where e.deptno=d.deptno;

    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |        *成本从6减为3
    ---------------------------------------------------------------------------
    | 0 | SELECT STATEMENT | | 14 | 420 | 3 (0)| 00:00:01 |
    | 1 | NESTED LOOPS | | 14 | 420 | 3 (0)| 00:00:01 |             *********从哈希转为嵌套循环
    | 2 | TABLE ACCESS FULL| EMP1 | 14 | 238 | 3 (0)| 00:00:01 |  
    |* 3 | INDEX UNIQUE SCAN| P_K | 1 | 13 | 0 (0)| 00:00:01 |  *********全表扫描,转为索引范围


    3 - access("E"."DEPTNO"="D"."DEPTNO")

    Note
     dynamic sampling used for this statement (level=2)

              7  consistent gets

    ***************************************测试三(emp1与dept2建立主外键约束)**************************************

    SQL> set autotrace off

    SQL> alter table emp1 add constraint f_y foreign key(deptno) references dept2(deptno);

    SQL> select owner,constraint_name from user_constraints;

    OWNER CONSTRAINT_NAME
    -------------------- --------------------
    SCOTT P_K
    SCOTT F_Y

    SQL> select index_name,table_name from user_indexes where table_name='EMP1';

    no rows selected

    select empno,ename,sal from emp1 e,dept2 d where e.deptno=d.deptno;

    | 0 | SELECT STATEMENT | | 14 | 238 | 3 (0)| 00:00:01 |   ---因为测试数据量少,成本没有变化
    |* 1 | TABLE ACCESS FULL| EMP1 | 14 | 238 | 3 (0)| 00:00:01 |  --对DEPT2表根本没有查询;
    ----------

       1 - filter("E"."DEPTNO" IS NOT NULL)         ---直接根据dept2,deptno列非空(主键,非空且唯一);

    14 rows selected.

    *******测试五、测试四的基础上插入一条数据*******

    insert into emp1(empno,ename,deptno) values(8000,'YANG',null);

    select empno,ename,sal from emp1 e,dept2 d where e.deptno=d.deptno;

    --因为查询是等值连接,所以,执行计划不受影响;

    但是会存在脏数据:对于外键约束来说,子表中的数据必须在父表中有匹配值,本次测试中,插入了Null,值没有报错;

    insert into emp1(empno,ename,deptno) values(8100,'YG',11);

    ERROR at line 1:
    ORA-02291: integrity constraint (SCOTT.F_Y) violated - parent key not found  外键还是好的;

    小结:主外键约束,要保证数据干净,子表中,关联列加上not null 约束靠谱;

    alter table emp1 modify deptno not null
    *
    ERROR at line 1:
    ORA-02296: cannot enable (SCOTT.) - null values found

    SQL> delete emp1 where deptno is null;

    SQL> alter table emp1 modify deptno not null;

  • 相关阅读:
    TCP连接异常断开检测(转)
    正排索引与倒排索引(转)
    Elasticsearch之优化
    把网卡中断绑定到CPU,最大化网卡的吞吐量(转)
    十张GIFs让你弄懂递归等概念
    二维数组回形遍历(转)
    如何做Go的性能优化?(转)
    Go的50度灰:Golang新开发者要注意的陷阱和常见错误(转)
    Nginx配置之负载均衡、限流、缓存、黑名单和灰度发布(转)
    从零到卓越:京东客服即时通讯系统的技术架构演进历程(转)
  • 原文地址:https://www.cnblogs.com/lvcha001/p/7744983.html
Copyright © 2011-2022 走看看