ITPub博客

首页 > 数据库 > Oracle > 关于索引的几个问题--续集

关于索引的几个问题--续集

原创 Oracle 作者:lff1530983327 时间:2014-12-31 09:31:56 0 删除 编辑
3.外键是否应该加索引,你觉得呢?
 

曾经在那一次讲座中听到过以为大师讲道:外健索引因为重复可以减少很多 I/O但是如果不建外建索引,
引致
oracle误将小标当策划那个被驱动表,后果将会很严重。当时确实是不太明白会有什么严重的后果呢?
Tom大师也曾经说过:索引未建外键是导致死锁的最主要原因,你说这又是为啥呢?今天决定来一探究竟!

---------前-----------------------------------------------------------------------------------

| Id  | Operation                    | Name         | Rows  | Bytes | Cost (%CPU)| Time     |

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

|   0 | SELECT STATEMENT             |              |    24 |  1440 |   137   (1)| 00:00:02 |

|   1 |  NESTED LOOPS                |              |    24 |  1440 |   137   (1)| 00:00:02 |

|   2 |   TABLE ACCESS BY INDEX ROWID| T_1          |     1 |    30 |     0   (0)| 00:00:01 |

|*  3 |    INDEX UNIQUE SCAN         | SYS_C0011733 |     1 |       |     0   (0)| 00:00:01 |

|*  4 |   TABLE ACCESS FULL          | T_2          |    24 |   720 |   137   (1)| 00:00:02 |

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

执行计划

----------后------------------------------------------------

Plan hash value: 3282306330

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

| Id  | Operation                    | Name         | Rows  | Bytes | Cost (%CPU)| Time     |

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

|   0 | SELECT STATEMENT             |              |    26 |  1560 |    23   (0)| 00:00:01 |

|   1 |  NESTED LOOPS                |              |    26 |  1560 |    23   (0)| 00:00:01 |

|   2 |   TABLE ACCESS BY INDEX ROWID| T_1          |     1 |    30 |     0   (0)| 00:00:01 |

|*  3 |    INDEX UNIQUE SCAN         | SYS_C0011733 |     1 |       |     0   (0)| 00:00:01 |

|   4 |   TABLE ACCESS BY INDEX ROWID| T_2          |    26 |   780 |    23   (0)| 00:00:01 |

|*  5 |    INDEX RANGE SCAN          | IND_T_2_FID  |    26 |       |     1   (0)| 00:00:01 |

------------------后--------------------------------------------------------------------------

统计信息

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

          7  recursive calls

          1  db block gets

        112  consistent gets

          0  physical reads

          0  redo size

       1802  bytes sent via SQL*Net to client

        530  bytes received via SQL*Net from client

          3  SQL*Net roundtrips to/from client

          0  sorts (memory)

          0  sorts (disk)

         26  rows processed

统计信息

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

          4  recursive calls

          2  db block gets

        516  consistent gets

          0  physical reads

          0  redo size

       1802  bytes sent via SQL*Net to client

        530  bytes received via SQL*Net from client

          3  SQL*Net roundtrips to/from client

          0  sorts (memory)

          0  sorts (disk)

         26  rows processed

---------------------------------------------以上统计信息显示了我的加外键索引前加外键索引后对性能的影响。

外键未建索引还会产生死锁问题索引?

经过试验发现是真的!



 

上面一张图是在未执行create index idx_emp_dept on emp(deptno);后的情况,也就是在没有建立外键索引的情况,可以清楚的看到,此时在子表中删除一行并且为回滚或提交的情况下,在另一窗口中是不能对主表进行delete或则update操作的!因为在子表中的操作导致了主表被锁全表。而在第二张图是在建立了外键索引的情况下进行图一中相同操作的,此时可以看出,在子表中执行的删除操作只是锁定了在子表中被操作的那一行,并未锁定表中其他行。这就是不建立外键索引带来的并发性问题,也就是tom大师提到的死锁问题。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30018455/viewspace-1385727/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-11-12

  • 博文量
    72
  • 访问量
    49748