パフォーマンス劣化はインデックスのせいなのか!? をみっちり検証:おら! オラ! Oracle再検証 @IT出張所(1)(4/4 ページ)
本連載は、インサイトテクノロジーが発行しているメールマガジン「おら!オラ! Oracle どっぷり検証生活」で過去に取り上げたテーマを、最新のバージョンや新しい切り口で再検証してみようという企画です。最初に取り上げるテーマは、メルマガの歴史の中でも最も古いテーマであるインデックス検証(B-Treeインデックスのパフォーマンス劣化に関する検証)についてです。
リーフブロックの中に格納されている値とは?
それでは、実際にリーフブロック-1と0にはどのような値が格納されているのか、ブロックの中身を確認してみることにしましょう。
ブロックの中身は、以下コマンドで確認できます。
alter system dump datafile [ファイルID] block [ブロック番号];
ブロックのファイルIDとブロック番号はDBMS_UTILITYというパッケージを使用して取得できます。DBMS_UTILITYに取得したいブロックのアドレスを入れればファイルIDとブロック番号が返ってきます。
SQL> SELECT DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE(16831123) as "FILE_ID(LEAFBLOCK-1)", 2 DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(16831123) as "BLOCK_ID(LEAFBLOCK-1)", 3 DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE(16831262) as "FILE_ID(LEAFBLOCK0)", 4 DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(16831262) as "BLOCK_ID(LEAFBLOCK0)" 5 FROM dual; FILE_ID(LEAFBLOCK-1) BLOCK_ID(LEAFBLOCK-1) FILE_ID(LEAFBLOCK0) BLOCK_ID(LEAFBLOCK0) -------------------- --------------------- ------------------- -------------------- 4 53907 4 54046 SQL> alter system dump datafile 4 block 53907; System altered. SQL> alter system dump datafile 4 block 54046; System altered.
これで、先ほどのトレースファイルにブロックの情報が出力されています。早速見てみましょう(必要そうな個所――leaf block dump部分――だけ抜粋しています)。
Leaf block dump =============== header address 547020900=0x209ae064 kdxcolev 0 KDXCOLEV Flags = - - - kdxcolok 1 kdxcoopc 0x80: opcode=0: iot flags=--- is converted=Y kdxconco 2 kdxcosdc 2 kdxconro 71 kdxcofbo 178=0xb2 kdxcofeo 1036=0x40c kdxcoavs 858 kdxlespl 0 kdxlende 0 kdxlenxt 16831262=0x100d31e kdxleprv 0=0x0 kdxledsz 0 kdxlebksz 1888 row#0[1036] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 02 col 1; len 6; (6): 01 00 d2 6b 00 00 row#1[1048] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 03 col 1; len 6; (6): 01 00 d2 6b 00 01 row#2[1060] flag: ------, lock: 2, len=12 col 0; len 2; (2): c1 03 col 1; len 6; (6): 01 00 d3 27 00 00 row#3[1072] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 04 col 1; len 6; (6): 01 00 d2 6b 00 02 row#4[1084] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 05 col 1; len 6; (6): 01 00 d2 6b 00 03 row#5[1096] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 06 col 1; len 6; (6): 01 00 d2 6b 00 04 row#6[1108] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 07 col 1; len 6; (6): 01 00 d2 6b 00 05 row#7[1120] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 08 col 1; len 6; (6): 01 00 d2 6b 00 06 row#8[1132] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 09 col 1; len 6; (6): 01 00 d2 6b 00 07 row#9[1144] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 0a col 1; len 6; (6): 01 00 d2 6b 00 08 row#10[1156] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 0b col 1; len 6; (6): 01 00 d2 6b 00 09 row#11[1168] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 0c col 1; len 6; (6): 01 00 d2 6b 00 0a row#12[1180] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 0d col 1; len 6; (6): 01 00 d2 6b 00 0b row#13[1192] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 0e col 1; len 6; (6): 01 00 d2 6b 00 0c row#14[1204] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 0f col 1; len 6; (6): 01 00 d2 6b 00 0d row#15[1216] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 10 col 1; len 6; (6): 01 00 d2 6b 00 0e row#16[1228] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 11 col 1; len 6; (6): 01 00 d2 6b 00 0f row#17[1240] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 12 col 1; len 6; (6): 01 00 d2 6b 00 10 row#18[1252] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 13 col 1; len 6; (6): 01 00 d2 6b 00 11 row#19[1264] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 14 col 1; len 6; (6): 01 00 d2 6b 00 12 row#20[1276] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 15 col 1; len 6; (6): 01 00 d2 6b 00 13 row#21[1288] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 16 col 1; len 6; (6): 01 00 d2 6b 00 14 row#22[1300] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 17 col 1; len 6; (6): 01 00 d2 6b 00 15 row#23[1312] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 18 col 1; len 6; (6): 01 00 d2 6b 00 16 row#24[1324] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 19 col 1; len 6; (6): 01 00 d2 6b 00 17 row#25[1336] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 1a col 1; len 6; (6): 01 00 d2 6b 00 18 row#26[1348] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 1b col 1; len 6; (6): 01 00 d2 6b 00 19 row#27[1360] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 1c col 1; len 6; (6): 01 00 d2 6b 00 1a row#28[1372] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 1d col 1; len 6; (6): 01 00 d2 6b 00 1b row#29[1384] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 1e col 1; len 6; (6): 01 00 d2 6b 00 1c row#30[1396] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 1f col 1; len 6; (6): 01 00 d2 6b 00 1d row#31[1408] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 20 col 1; len 6; (6): 01 00 d2 6b 00 1e row#32[1420] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 21 col 1; len 6; (6): 01 00 d2 6b 00 1f row#33[1432] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 22 col 1; len 6; (6): 01 00 d2 6b 00 20 row#34[1444] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 23 col 1; len 6; (6): 01 00 d2 6b 00 21 row#35[1456] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 24 col 1; len 6; (6): 01 00 d2 6b 00 22 row#36[1468] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 25 col 1; len 6; (6): 01 00 d2 6b 00 23 row#37[1480] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 26 col 1; len 6; (6): 01 00 d2 6b 00 24 row#38[1492] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 27 col 1; len 6; (6): 01 00 d2 6b 00 25 row#39[1504] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 28 col 1; len 6; (6): 01 00 d2 6b 00 26 row#40[1516] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 29 col 1; len 6; (6): 01 00 d2 6b 00 27 row#41[1528] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 2a col 1; len 6; (6): 01 00 d2 6b 00 28 row#42[1540] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 2b col 1; len 6; (6): 01 00 d2 6b 00 29 row#43[1552] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 2c col 1; len 6; (6): 01 00 d2 6b 00 2a row#44[1564] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 2d col 1; len 6; (6): 01 00 d2 6b 00 2b row#45[1576] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 2e col 1; len 6; (6): 01 00 d2 6b 00 2c row#46[1588] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 2f col 1; len 6; (6): 01 00 d2 6b 00 2d row#47[1600] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 30 col 1; len 6; (6): 01 00 d2 6b 00 2e row#48[1612] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 31 col 1; len 6; (6): 01 00 d2 6b 00 2f row#49[1624] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 32 col 1; len 6; (6): 01 00 d2 6b 00 30 row#50[1636] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 33 col 1; len 6; (6): 01 00 d2 6b 00 31 row#51[1648] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 34 col 1; len 6; (6): 01 00 d2 6b 00 32 row#52[1660] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 35 col 1; len 6; (6): 01 00 d2 6b 00 33 row#53[1672] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 36 col 1; len 6; (6): 01 00 d2 6b 00 34 row#54[1684] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 37 col 1; len 6; (6): 01 00 d2 6b 00 35 row#55[1696] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 38 col 1; len 6; (6): 01 00 d2 6b 00 36 row#56[1708] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 39 col 1; len 6; (6): 01 00 d2 6b 00 37 row#57[1720] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 3a col 1; len 6; (6): 01 00 d2 6b 00 38 row#58[1732] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 3b col 1; len 6; (6): 01 00 d2 6b 00 39 row#59[1744] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 3c col 1; len 6; (6): 01 00 d2 6b 00 3a row#60[1756] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 3d col 1; len 6; (6): 01 00 d2 6b 00 3b row#61[1768] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 3e col 1; len 6; (6): 01 00 d2 6b 00 3c row#62[1780] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 3f col 1; len 6; (6): 01 00 d2 6b 00 3d row#63[1792] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 40 col 1; len 6; (6): 01 00 d2 6b 00 3e row#64[1804] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 41 col 1; len 6; (6): 01 00 d2 6b 00 3f row#65[1816] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 42 col 1; len 6; (6): 01 00 d2 6b 00 40 row#66[1828] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 43 col 1; len 6; (6): 01 00 d2 6b 00 41 row#67[1840] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 44 col 1; len 6; (6): 01 00 d2 6b 00 42 row#68[1852] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 45 col 1; len 6; (6): 01 00 d2 6b 00 43 row#69[1864] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 46 col 1; len 6; (6): 01 00 d2 6b 00 44 row#70[1876] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 47 col 1; len 6; (6): 01 00 d2 6b 00 45 ----- end of leaf block dump -----
Leaf block dump =============== header address 545362020=0x20819064 kdxcolev 0 KDXCOLEV Flags = - - - kdxcolok 1 kdxcoopc 0x87: opcode=7: iot flags=--- is converted=Y kdxconco 2 kdxcosdc 1 kdxconro 60 kdxcofbo 156=0x9c kdxcofeo 1138=0x472 kdxcoavs 982 kdxlespl 0 kdxlende 0 kdxlenxt 16831117=0x100d28d kdxleprv 16831123=0x100d293 kdxledsz 0 kdxlebksz 1888 row#0[1138] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 48 //この3行が1まとまり col 1; len 6; (6): 01 00 d2 6b 00 46 row#1[1150] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 49 col 1; len 6; (6): 01 00 d2 6b 00 47 row#2[1162] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 4a col 1; len 6; (6): 01 00 d2 6b 00 48 row#3[1174] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 4b col 1; len 6; (6): 01 00 d2 6b 00 49 row#4[1186] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 4c col 1; len 6; (6): 01 00 d2 6b 00 4a row#5[1198] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 4d col 1; len 6; (6): 01 00 d2 6b 00 4b row#6[1210] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 4e col 1; len 6; (6): 01 00 d2 6b 00 4c row#7[1222] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 4f col 1; len 6; (6): 01 00 d2 6b 00 4d row#8[1234] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 50 col 1; len 6; (6): 01 00 d2 6b 00 4e row#9[1246] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 51 col 1; len 6; (6): 01 00 d2 6b 00 4f row#10[1258] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 52 col 1; len 6; (6): 01 00 d2 6b 00 50 row#11[1270] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 53 col 1; len 6; (6): 01 00 d2 6b 00 51 row#12[1282] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 54 col 1; len 6; (6): 01 00 d2 6b 00 52 row#13[1294] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 55 col 1; len 6; (6): 01 00 d2 6b 00 53 row#14[1306] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 56 col 1; len 6; (6): 01 00 d2 6b 00 54 row#15[1318] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 57 col 1; len 6; (6): 01 00 d2 6b 00 55 row#16[1330] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 58 col 1; len 6; (6): 01 00 d2 6b 00 56 row#17[1342] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 59 col 1; len 6; (6): 01 00 d2 6b 00 57 row#18[1354] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 5a col 1; len 6; (6): 01 00 d2 6b 00 58 row#19[1366] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 5b col 1; len 6; (6): 01 00 d2 6b 00 59 row#20[1378] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 5c col 1; len 6; (6): 01 00 d2 6b 00 5a row#21[1390] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 5d col 1; len 6; (6): 01 00 d2 6b 00 5b row#22[1402] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 5e col 1; len 6; (6): 01 00 d2 6b 00 5c row#23[1414] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 5f col 1; len 6; (6): 01 00 d2 6b 00 5d row#24[1426] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 60 col 1; len 6; (6): 01 00 d2 6b 00 5e row#25[1438] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 61 col 1; len 6; (6): 01 00 d2 6b 00 5f row#26[1450] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 62 col 1; len 6; (6): 01 00 d2 6b 00 60 row#27[1462] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 63 col 1; len 6; (6): 01 00 d2 6b 00 61 row#28[1474] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 64 col 1; len 6; (6): 01 00 d2 6b 00 62 row#29[1486] flag: ------, lock: 0, len=12 col 0; len 2; (2): c2 02 col 1; len 6; (6): 01 00 d2 6b 00 63 row#30[1498] flag: ------, lock: 0, len=13 col 0; len 3; (3): c2 02 02 col 1; len 6; (6): 01 00 d2 6b 00 64 row#31[1511] flag: ------, lock: 0, len=13 col 0; len 3; (3): c2 02 03 col 1; len 6; (6): 01 00 d2 6b 00 65 row#32[1524] flag: ------, lock: 0, len=13 col 0; len 3; (3): c2 02 04 col 1; len 6; (6): 01 00 d2 6b 00 66 row#33[1537] flag: ------, lock: 0, len=13 col 0; len 3; (3): c2 02 05 col 1; len 6; (6): 01 00 d2 6b 00 67 row#34[1550] flag: ------, lock: 0, len=13 col 0; len 3; (3): c2 02 06 col 1; len 6; (6): 01 00 d2 6b 00 68 row#35[1563] flag: ------, lock: 0, len=13 col 0; len 3; (3): c2 02 07 col 1; len 6; (6): 01 00 d2 6b 00 69 row#36[1576] flag: ------, lock: 0, len=13 col 0; len 3; (3): c2 02 08 col 1; len 6; (6): 01 00 d2 6b 00 6a row#37[1589] flag: ------, lock: 0, len=13 col 0; len 3; (3): c2 02 09 col 1; len 6; (6): 01 00 d2 6b 00 6b row#38[1602] flag: ------, lock: 0, len=13 col 0; len 3; (3): c2 02 0a col 1; len 6; (6): 01 00 d2 6b 00 6c row#39[1615] flag: ------, lock: 0, len=13 col 0; len 3; (3): c2 02 0b col 1; len 6; (6): 01 00 d2 6b 00 6d row#40[1628] flag: ------, lock: 0, len=13 col 0; len 3; (3): c2 02 0c col 1; len 6; (6): 01 00 d2 6b 00 6e row#41[1641] flag: ------, lock: 0, len=13 col 0; len 3; (3): c2 02 0d col 1; len 6; (6): 01 00 d2 6b 00 6f row#42[1654] flag: ------, lock: 0, len=13 col 0; len 3; (3): c2 02 0e col 1; len 6; (6): 01 00 d2 6b 00 70 row#43[1667] flag: ------, lock: 0, len=13 col 0; len 3; (3): c2 02 0f col 1; len 6; (6): 01 00 d2 6b 00 71 row#44[1680] flag: ------, lock: 0, len=13 col 0; len 3; (3): c2 02 10 col 1; len 6; (6): 01 00 d2 6c 00 00 row#45[1693] flag: ------, lock: 0, len=13 col 0; len 3; (3): c2 02 11 col 1; len 6; (6): 01 00 d2 6c 00 01 row#46[1706] flag: ------, lock: 0, len=13 col 0; len 3; (3): c2 02 12 col 1; len 6; (6): 01 00 d2 6c 00 02 row#47[1719] flag: ------, lock: 0, len=13 col 0; len 3; (3): c2 02 13 col 1; len 6; (6): 01 00 d2 6c 00 03 row#48[1732] flag: ------, lock: 0, len=13 col 0; len 3; (3): c2 02 14 col 1; len 6; (6): 01 00 d2 6c 00 04 row#49[1745] flag: ------, lock: 0, len=13 col 0; len 3; (3): c2 02 15 col 1; len 6; (6): 01 00 d2 6c 00 05 row#50[1758] flag: ------, lock: 0, len=13 col 0; len 3; (3): c2 02 16 col 1; len 6; (6): 01 00 d2 6c 00 06 row#51[1771] flag: ------, lock: 0, len=13 col 0; len 3; (3): c2 02 17 col 1; len 6; (6): 01 00 d2 6c 00 07 row#52[1784] flag: ------, lock: 0, len=13 col 0; len 3; (3): c2 02 18 col 1; len 6; (6): 01 00 d2 6c 00 08 row#53[1797] flag: ------, lock: 0, len=13 col 0; len 3; (3): c2 02 19 col 1; len 6; (6): 01 00 d2 6c 00 09 row#54[1810] flag: ------, lock: 0, len=13 col 0; len 3; (3): c2 02 1a col 1; len 6; (6): 01 00 d2 6c 00 0a row#55[1823] flag: ------, lock: 0, len=13 col 0; len 3; (3): c2 02 1b col 1; len 6; (6): 01 00 d2 6c 00 0b row#56[1836] flag: ------, lock: 0, len=13 col 0; len 3; (3): c2 02 1c col 1; len 6; (6): 01 00 d2 6c 00 0c row#57[1849] flag: ------, lock: 0, len=13 col 0; len 3; (3): c2 02 1d col 1; len 6; (6): 01 00 d2 6c 00 0d row#58[1862] flag: ------, lock: 0, len=13 col 0; len 3; (3): c2 02 1e col 1; len 6; (6): 01 00 d2 6c 00 0e row#59[1875] flag: ------, lock: 0, len=13 col 0; len 3; (3): c2 02 1f col 1; len 6; (6): 01 00 d2 6c 00 0f ----- end of leaf block dump -----
row#XXから3行ずつで1まとまりになっていて、その1まとまりが1行のデータを表しています。
row#0[1036] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 02 col 1; len 6; (6): 01 00 d2 6b 00 00
2行目、3行目にあるcol 0とcol 1が実際に格納されているデータで、col 0は値(TEST_LEAFテーブルのIDの値)、col 1はテーブルに格納されているデータのアドレス(rowid)になります。このrowidはテーブルデータを参照する際に使用されます。例えば、IDを条件にNAMEを取得したい場合、インデックスだけではNAME情報を取得することができないため、このrowidを使用してテーブルを参照しに行きます。
c1 02の02という値が実際のデータで16進に変換されて格納されています。ただし実際の値は、この値にマイナス1した値が格納されていて、この行の場合1が格納されていることになります。
そして、注目すべきは、リーフブロック-1(ブロックID:53907)のrow#1とrow#2です。
row#1[1048] flag: ------, lock: 0, len=12 col 0; len 2; (2): c1 03 col 1; len 6; (6): 01 00 d2 6b 00 01 row#2[1060] flag: ------, lock: 2, len=12 col 0; len 2; (2): c1 03 col 1; len 6; (6): 01 00 d3 27 00 00
col 0の値をみると、c1 03という同じ値が格納されていることが分かります。c1 03は10進数では3で、-1すると2という値になります。やはり、先ほどINSERTした値はリーフブロック-1に格納されていたようです。
また、それぞれのリーフブロックの値を見ると、リーフブロック-1には1から70までの値、リーフブロック0には71から130という値が格納されており、約半分に分割されていることが確認できます(図5)。
このように、データが挿入されることで新しいブロックが追加されることをリーフ分割と呼びます。
ちなみに、ブロックの最後の値のみ新ブロックに格納すると思っている方もいるかもしれませんが、それだといっぱいのブロックに値を挿入するたびにリーフ分割が発生してしまうことになり、ブロックが大量に増殖してしまうことになる為、Oracleは半分に分けて格納しています。
データ削除時の状態
最後にデータを削除した時のインデックスの状態についても確認しておきましょう。
先にnrowが箱でrrowが中身と説明しました。データを削除するということは箱の中身を削除するということなので、nrowではなくrrowの値が変化することになります。実際に全データを削除して確認してみましょう。
SQL> DELETE FROM TEST_LEAF; 10001 rows deleted. SQL> COMMIT; Commit complete. SQL> ALTER SESSION SET EVENTS 'IMMEDIATE TRACE NAME TREEDUMP LEVEL 70389'; Session altered.
----- begin tree dump branch: 0x100d285 16831109 (0: nrow: 83, level: 1) leaf: 0x100d293 16831123 (-1: nrow: 71 rrow: 0) leaf: 0x100d31e 16831262 (0: nrow: 60 rrow: 0) leaf: 0x100d28d 16831117 (1: nrow: 123 rrow: 0) leaf: 0x100d28e 16831118 (2: nrow: 123 rrow: 0) leaf: 0x100d28f 16831119 (3: nrow: 123 rrow: 0) leaf: 0x100d290 16831120 (4: nrow: 123 rrow: 0) leaf: 0x100d286 16831110 (5: nrow: 123 rrow: 0) leaf: 0x100d287 16831111 (6: nrow: 123 rrow: 0) leaf: 0x100d288 16831112 (7: nrow: 123 rrow: 0) leaf: 0x100d289 16831113 (8: nrow: 123 rrow: 0) leaf: 0x100d28b 16831115 (9: nrow: 123 rrow: 0) leaf: 0x100d28c 16831116 (10: nrow: 123 rrow: 0) leaf: 0x100d28a 16831114 (11: nrow: 123 rrow: 0) leaf: 0x100d294 16831124 (12: nrow: 123 rrow: 0) leaf: 0x100d295 16831125 (13: nrow: 123 rrow: 0) leaf: 0x100d296 16831126 (14: nrow: 123 rrow: 0) leaf: 0x100d297 16831127 (15: nrow: 123 rrow: 0) leaf: 0x100d298 16831128 (16: nrow: 123 rrow: 0) leaf: 0x100d299 16831129 (17: nrow: 123 rrow: 0) leaf: 0x100d29a 16831130 (18: nrow: 123 rrow: 0) leaf: 0x100d29b 16831131 (19: nrow: 123 rrow: 0) leaf: 0x100d29c 16831132 (20: nrow: 123 rrow: 0) leaf: 0x100d29d 16831133 (21: nrow: 123 rrow: 0) leaf: 0x100d29e 16831134 (22: nrow: 123 rrow: 0) leaf: 0x100d29f 16831135 (23: nrow: 123 rrow: 0) leaf: 0x100d2a0 16831136 (24: nrow: 123 rrow: 0) leaf: 0x100d291 16831121 (25: nrow: 123 rrow: 0) leaf: 0x100d292 16831122 (26: nrow: 123 rrow: 0) leaf: 0x100d2d3 16831187 (27: nrow: 123 rrow: 0) leaf: 0x100d2c7 16831175 (28: nrow: 123 rrow: 0) leaf: 0x100d2c8 16831176 (29: nrow: 123 rrow: 0) leaf: 0x100d2c9 16831177 (30: nrow: 123 rrow: 0) leaf: 0x100d2ca 16831178 (31: nrow: 123 rrow: 0) leaf: 0x100d2cb 16831179 (32: nrow: 123 rrow: 0) leaf: 0x100d2cc 16831180 (33: nrow: 123 rrow: 0) leaf: 0x100d2cd 16831181 (34: nrow: 123 rrow: 0) leaf: 0x100d2ce 16831182 (35: nrow: 123 rrow: 0) leaf: 0x100d2cf 16831183 (36: nrow: 123 rrow: 0) leaf: 0x100d2d0 16831184 (37: nrow: 123 rrow: 0) leaf: 0x100d2c3 16831171 (38: nrow: 123 rrow: 0) leaf: 0x100d2c4 16831172 (39: nrow: 123 rrow: 0) leaf: 0x100d2c5 16831173 (40: nrow: 123 rrow: 0) leaf: 0x100d2c6 16831174 (41: nrow: 123 rrow: 0) leaf: 0x100d2d4 16831188 (42: nrow: 123 rrow: 0) leaf: 0x100d2d5 16831189 (43: nrow: 123 rrow: 0) leaf: 0x100d2d6 16831190 (44: nrow: 123 rrow: 0) leaf: 0x100d2d7 16831191 (45: nrow: 123 rrow: 0) leaf: 0x100d2d8 16831192 (46: nrow: 123 rrow: 0) leaf: 0x100d2d9 16831193 (47: nrow: 123 rrow: 0) leaf: 0x100d2da 16831194 (48: nrow: 123 rrow: 0) leaf: 0x100d2db 16831195 (49: nrow: 123 rrow: 0) leaf: 0x100d2dc 16831196 (50: nrow: 123 rrow: 0) leaf: 0x100d2dd 16831197 (51: nrow: 123 rrow: 0) leaf: 0x100d2de 16831198 (52: nrow: 123 rrow: 0) leaf: 0x100d2df 16831199 (53: nrow: 123 rrow: 0) leaf: 0x100d2e0 16831200 (54: nrow: 123 rrow: 0) leaf: 0x100d2d1 16831185 (55: nrow: 123 rrow: 0) leaf: 0x100d2d2 16831186 (56: nrow: 123 rrow: 0) leaf: 0x100d313 16831251 (57: nrow: 123 rrow: 0) leaf: 0x100d307 16831239 (58: nrow: 123 rrow: 0) leaf: 0x100d308 16831240 (59: nrow: 123 rrow: 0) leaf: 0x100d309 16831241 (60: nrow: 123 rrow: 0) leaf: 0x100d30a 16831242 (61: nrow: 123 rrow: 0) leaf: 0x100d30b 16831243 (62: nrow: 123 rrow: 0) leaf: 0x100d30c 16831244 (63: nrow: 123 rrow: 0) leaf: 0x100d30d 16831245 (64: nrow: 123 rrow: 0) leaf: 0x100d30e 16831246 (65: nrow: 123 rrow: 0) leaf: 0x100d30f 16831247 (66: nrow: 123 rrow: 0) leaf: 0x100d310 16831248 (67: nrow: 123 rrow: 0) leaf: 0x100d303 16831235 (68: nrow: 123 rrow: 0) leaf: 0x100d304 16831236 (69: nrow: 123 rrow: 0) leaf: 0x100d305 16831237 (70: nrow: 123 rrow: 0) leaf: 0x100d306 16831238 (71: nrow: 123 rrow: 0) leaf: 0x100d314 16831252 (72: nrow: 123 rrow: 0) leaf: 0x100d315 16831253 (73: nrow: 123 rrow: 0) leaf: 0x100d316 16831254 (74: nrow: 123 rrow: 0) leaf: 0x100d317 16831255 (75: nrow: 123 rrow: 0) leaf: 0x100d318 16831256 (76: nrow: 123 rrow: 0) leaf: 0x100d319 16831257 (77: nrow: 123 rrow: 0) leaf: 0x100d31a 16831258 (78: nrow: 123 rrow: 0) leaf: 0x100d31b 16831259 (79: nrow: 123 rrow: 0) leaf: 0x100d31c 16831260 (80: nrow: 123 rrow: 0) leaf: 0x100d31d 16831261 (81: nrow: 30 rrow: 0) ----- end tree dump
rrowの値がすべて0になりました。つまり、データ自体は1件も入ってないのにブロックという箱は大量に存在している、ということになります。1件もデータがないのにブロックだけ存在しているということは、参照時にこのブロックを読み込んでしまうとパフォーマンスに影響することは容易に予想できると思います。
次回はいよいよ11gのインデックス構造を検証!
以上、インデックスの構造とその特徴について解説してきました。これを踏まえて弊社メルマガのインデックス検証を読んでいただけると、検証の内容が理解しやすくなるのではないでしょうか。
次回は、インデックス検証の内容を最新のOracle Database 11gで検証します。
筆者紹介
株式会社インサイトテクノロジー コンサルティング本部
内山 義夫(うちやま よしお)
内山 義夫は細い目の奥にキラリと光る鋭い洞察力で、数多くのパフォーマンストラブルを解決してきたデータベースコンサルタント。コンサルティング業務を行うかたわら、現場で必要とされる知識を追求する「おら! オラ! Oracle - どっぷり検証生活」の制作も行っている。
Copyright © ITmedia, Inc. All Rights Reserved.