首页 > 数据库 > Oracle > 关于索引的几个问题--续集
曾经在那一次讲座中听到过以为大师讲道:外健索引因为重复可以减少很多 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/ ,如需转载,请注明出处,否则将追究法律责任。