create index/create index online區別

kunlunzhiying發表於2018-02-06
create index/create index online區別
此例項需要3個會話,會話1建立索引,會話2修改索引鍵欄位的值,會話3檢視鎖的情況。

建立測試表
  1. create table t_test
  2. (
  3.   col1 number,
  4.   col2 number
  5. );

造測試資料(根據自己機器具體情況估計需要的資料量,使建立索引的時間大概在20-30秒
  1. insert into t_test
  2. select rownum col1, rownum col2 from dual
  3. connect by rownum<10000000;
  4. commit;

create index

會話1:
  1. SQL> set time on
  2. 10:22:01 SQL> set timing on
  3. 10:22:02 SQL>

  4. --獲取 會話1 sid
  5. 10:22:04 SQL> select sid from v$mystat where rownum=1;

  6.        SID
  7. ----------
  8.        144

  9. Elapsed: 00:00:00.01

會話2:
  1. SQL> set time on
  2. 10:22:06 SQL> set timing on
  3. 10:22:06 SQL>

  4. --獲取 會話2 sid
  5. 10:22:06 SQL> select sid from v$mystat where rownum=1;

  6.        SID
  7. ----------
  8.        147

  9. Elapsed: 00:00:00.01

會話3:
  1. SQL> set time on
  2. 10:22:11 SQL> set timing on
  3. 10:22:11 SQL>

  4. --格式化輸出
  5. 10:22:13 SQL> set line 200
  6. 10:23:03 SQL> col addr for a10
  7. 10:23:03 SQL> col kaddr for a10
  8. 10:23:03 SQL> col sid for 999999
  9. 10:23:03 SQL> col type for a10
  10. 10:23:03 SQL> col id1 for 99999999999
  11. 10:23:03 SQL> col id2 for 99999999999
  12. 10:23:03 SQL> col lmod for 99
  13. 10:23:03 SQL> col request for 99
  14. 10:23:03 SQL> col ctime for 999999
  15. 10:23:03 SQL> col block for 99
  16. 10:23:03 SQL> col table_name for a30
  17. 10:23:03 SQL>

會話1:
  1. --建立索引,不使用online(因為要在 會話2、會話3 中做其它操作,所以表中資料要量要足夠大)
  2. 10:25:08 SQL> create index ix_test_col1 on t_test(col1);

  3. Index created.

  4. Elapsed: 00:00:59.73

會話2:
  1. --修改指定行的索引欄位,此時update語句會hang住,等待索引建立,從會話3 中的鎖的情況可以看到 會話2 在等待 會話1
  2. 10:25:04 SQL> update t_test set col1=102400 where col2=102400;

  3. 1 row updated.

  4. Elapsed: 00:01:02.63

會話3:
  1. --檢視此時鎖的情況
  2. 10:24:29 SQL> select a.*, decode(a.type, \'TM\', b.object_name) table_name
  3. 10:24:32 2 from v$lock a, dba_objects b
  4. 10:24:32 3 where a.id1=b.object_id(+)
  5. 10:24:32 4 and a.sid in(144, 147);

  6. ADDR       KADDR      SID     TYPE       ID1          ID2          LMODE      REQUEST CTIME   BLOCK TABLE_NAME
  7. ---------- ---------- ------- ---------- ------------ ------------ ---------- ------- ------- ----- ------------------------------
  8. 315C65FC   315C6614   144     TM         18           0            3          0       1       0     OBJ$
  9. 315C66A8   315C66C0   147     TM         5180637      0            0          3       0       0     T_TEST
  10. 315C6550   315C6568   144     TM         5180637      0            4          0       3       1     T_TEST
  11. 3203444C   32034460   144     DL         5180637      0            3          0       3       0
  12. 32034394   320343A8   144     DL         5180637      0            3          0       3       0
  13. 31627F54   31627F78   144     TX         655384       57423        6          0       3       0

  14. 6 rows selected.

  15. Elapsed: 00:00:02.12
  16. 10:25:52 SQL> /

  17. ADDR       KADDR      SID     TYPE       ID1          ID2          LMODE      REQUEST CTIME   BLOCK TABLE_NAME
  18. ---------- ---------- ------- ---------- ------------ ------------ ---------- ------- ------- ----- ------------------------------
  19. 315C5A88   315C5AD0   144     TS         6            23571        6          0       18      0
  20. 315C65FC   315C6614   144     TM         18           0            3          0       35      0     OBJ$
  21. 315C66A8   315C66C0   147     TM         5180637      0            0          3       34      0     T_TEST
  22. 315C6550   315C6568   144     TM         5180637      0            4          0       37      1     T_TEST
  23. 3203444C   32034460   144     DL         5180637      0            3          0       37      0
  24. 32034394   320343A8   144     DL         5180637      0            3          0       37      0
  25. 31627F54   31627F78   144     TX         655384       57423        6          0       37      0

  26. 7 rows selected.

  27. Elapsed: 00:00:00.39
  28. 10:26:16 SQL> /

  29. ADDR       KADDR      SID     TYPE       ID1          ID2          LMODE      REQUEST CTIME   BLOCK TABLE_NAME
  30. ---------- ---------- ------- ---------- ------------ ------------ ---------- ------- ------- ----- ------------------------------
  31. 32034394   320343A8   147     CU         754675352    0            6          0       0       0

  32. Elapsed: 00:00:00.21
  33. 10:26:20 SQL> /

  34. ADDR       KADDR      SID     TYPE       ID1          ID2          LMODE      REQUEST CTIME   BLOCK TABLE_NAME
  35. ---------- ---------- ------- ---------- ------------ ------------ ---------- ------- ------- ----- ------------------------------
  36. 315C6550   315C6568   147     TM         5180637      0            3          0       4       0     T_TEST
  37. 31616060   31616084   147     TX         393221       56619        6          0       4       0

  38. Elapsed: 00:00:00.77

會話2:
  1. --回滾修改
  2. 10:26:21 SQL> rollback;

  3. Rollback complete.

  4. Elapsed: 00:00:00.01

會話3:
  1. 10:26:26 SQL> /

  2. no rows selected

  3. Elapsed: 00:00:00.03
  4. 10:26:36 SQL> /

  5. no rows selected

  6. Elapsed: 00:00:00.01

create index online

會話1:
  1. --刪除索引,並加online選項重建
  2. 10:26:46 SQL> drop index ix_test_col1;

  3. Index dropped.

  4. Elapsed: 00:00:00.35
  5. 10:26:59 SQL> create index ix_test_col1 on t_test(col1) online;

  6. Index created.

  7. Elapsed: 00:02:47.07

會話2:
  1. --修改指定行的索引欄位,此時update不會待索引建立,而是很快結束
  2. 10:26:50 SQL> update t_test set col1=102400 where col2=102400;

  3. 1 row updated.

  4. Elapsed: 00:00:09.21

會話3:
  1. --檢視鎖的情況
  2. 10:26:53 SQL> /

  3. ADDR       KADDR      SID     TYPE       ID1          ID2          LMODE      REQUEST CTIME   BLOCK TABLE_NAME
  4. ---------- ---------- ------- ---------- ------------ ------------ ---------- ------- ------- ----- ------------------------------
  5. 315C66A8   315C66C0   147     TM         5180637      0            3          0       0       0     T_TEST
  6. 315C6550   315C6568   144     TM         5180637      0            2          0       1       0     T_TEST
  7. 3203444C   32034460   144     DL         5180637      0            3          0       2       0
  8. 32034394   320343A8   144     DL         5180637      0            3          0       2       0
  9. 315C65FC   315C6614   144     TM         5180671      0            4          0       1       0     SYS_JOURNAL_5180670
  10. 31627F54   31627F78   144     TX         327692       57125        6          0       2       0

  11. 6 rows selected.

  12. Elapsed: 00:00:02.49
  13. 10:27:26 SQL> /

  14. ADDR       KADDR      SID     TYPE       ID1          ID2          LMODE      REQUEST CTIME   BLOCK TABLE_NAME
  15. ---------- ---------- ------- ---------- ------------ ------------ ---------- ------- ------- ----- ------------------------------
  16. 315C66A8   315C66C0   147     TM         5180637      0            3          0       6       0     T_TEST
  17. 315C6550   315C6568   144     TM         5180637      0            2          0       7       0     T_TEST
  18. 3203444C   32034460   144     DL         5180637      0            3          0       8       0
  19. 32034394   320343A8   144     DL         5180637      0            3          0       8       0
  20. 315C65FC   315C6614   144     TM         5180671      0            4          0       7       0     SYS_JOURNAL_5180670
  21. 31627F54   31627F78   144     TX         327692       57125        6          0       8       0
  22. 31616060   31616084   147     TX         655370       57432        6          0       6       0

  23. 7 rows selected.

  24. Elapsed: 00:00:02.16
  25. 10:27:38 SQL> /

  26. ADDR       KADDR      SID     TYPE       ID1          ID2          LMODE      REQUEST CTIME   BLOCK TABLE_NAME
  27. ---------- ---------- ------- ---------- ------------ ------------ ---------- ------- ------- ----- ------------------------------
  28. 315C5A88   315C5AD0   144     TS         6            23579        6          0       3       0
  29. 315C66A8   315C66C0   147     TM         5180637      0            3          0       19      0     T_TEST
  30. 315C6550   315C6568   144     TM         5180637      0            2          0       20      0     T_TEST
  31. 3203444C   32034460   144     DL         5180637      0            3          0       21      0
  32. 32034394   320343A8   144     DL         5180637      0            3          0       21      0
  33. 315C65FC   315C6614   144     TM         5180671      0            4          0       20      0     SYS_JOURNAL_5180670
  34. 31627F54   31627F78   144     TX         327692       57125        6          0       21      0
  35. 31616060   31616084   147     TX         655370       57432        6          0       19      0

  36. 8 rows selected.

  37. Elapsed: 00:00:00.17
  38. 10:28:29 SQL> /

  39. ADDR       KADDR      SID     TYPE       ID1          ID2          LMODE      REQUEST CTIME   BLOCK TABLE_NAME
  40. ---------- ---------- ------- ---------- ------------ ------------ ---------- ------- ------- ----- ------------------------------
  41. 315C5A88   315C5AD0   144     TS         6            23579        6          0       52      0
  42. 315C66A8   315C66C0   147     TM         5180637      0            3          0       68      1     T_TEST
  43. 315C6550   315C6568   144     TM         5180637      0            2          4       69      0     T_TEST
  44. 3203444C   32034460   144     DL         5180637      0            3          0       70      0
  45. 32034394   320343A8   144     DL         5180637      0            3          0       70      0
  46. 315C65FC   315C6614   144     TM         5180671      0            4          0       69      0     SYS_JOURNAL_5180670
  47. 31627F54   31627F78   144     TX         327692       57125        6          0       70      0
  48. 31616060   31616084   147     TX         655370       57432        6          0       68      0

  49. 8 rows selected.

  50. Elapsed: 00:00:00.14

  51. --從鎖的情況中看到建立索引過程中出現了表SYS_JOURNAL_5180670,檢視錶的相關資訊
  52. 10:28:52 SQL> col partitioned for a20
  53. 10:29:02 SQL> col temporary for a20
  54. 10:29:08 SQL> select table_name, iot_type, partitioned, temporary from user_tables where table_name=\'SYS_JOURNAL_5180670\';

  55. TABLE_NAME                     IOT_TYPE     PARTITIONED          TEMPORARY
  56. ------------------------------ ------------ -------------------- --------------------
  57. SYS_JOURNAL_5180670            IOT          NO                   N

  58. Elapsed: 00:00:00.00
  59. 10:29:10 SQL> set line 100
  60. 10:29:15 SQL> desc SYS_JOURNAL_5180670
  61.  Name                                                  Null?    Type
  62.  ----------------------------------------------------- -------- ------------------------------------
  63.  C0                                                    NOT NULL NUMBER
  64.  OPCODE                                                         CHAR(1)
  65.  PARTNO                                                         NUMBER
  66.  RID                                                   NOT NULL ROWID

  67. 10:29:19 SQL> set line 200
  68. 10:29:37 SQL> select a.*, decode(a.type, \'TM\', b.object_name) table_name
  69. 10:29:48 2 from v$lock a, dba_objects b
  70. 10:29:48 3 where a.id1=b.object_id(+)
  71. 10:29:48 4 and a.sid in(144, 147);

  72. ADDR       KADDR      SID     TYPE       ID1          ID2          LMODE      REQUEST CTIME   BLOCK TABLE_NAME
  73. ---------- ---------- ------- ---------- ------------ ------------ ---------- ------- ------- ----- ------------------------------
  74. 315C5A88   315C5AD0   144     TS         6            23579        6          0       132     0
  75. 315C66A8   315C66C0   147     TM         5180637      0            3          0       148     1     T_TEST
  76. 315C6550   315C6568   144     TM         5180637      0            2          4       149     0     T_TEST
  77. 3203444C   32034460   144     DL         5180637      0            3          0       150     0
  78. 32034394   320343A8   144     DL         5180637      0            3          0       150     0
  79. 315C65FC   315C6614   144     TM         5180671      0            4          0       149     0     SYS_JOURNAL_5180670
  80. 31627F54   31627F78   144     TX         327692       57125        6          0       150     0
  81. 31616060   31616084   147     TX         655370       57432        6          0       148     0

  82. 8 rows selected.

  83. Elapsed: 00:00:00.13

會話2:
  1. --回滾update
  2. 10:27:28 SQL> rollback;

  3. Rollback complete.

  4. Elapsed: 00:00:00.01
  5. 10:30:04 SQL>

會話3:
  1. --檢視鎖的情況,沒有記錄,索引建立已結束
  2. 10:29:52 SQL> /

  3. no rows selected

  4. Elapsed: 00:00:00.08
  5. 10:30:07 SQL> /

  6. no rows selected

  7. Elapsed: 00:00:00.01

結論:
1.create index 會阻塞其它會話修改索引欄位,直到索引建立結束;
2.create index online 允許其它會話修改索引欄位,但如果修改索引欄位的會話沒有commit或是rollbak,則索引建立會被阻塞;
3.online建立索引時會臨時建立一個IOT的表,索引建立結束後刪除IOT表(IOT表的使用方法暫時還不清楚)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28211342/viewspace-2150891/,如需轉載,請註明出處,否則將追究法律責任。

相關文章