
本記事は、グローバルが格納される魔法の「箱」、ブロックについて解説します。
Q. ブロックって何?
A. デンマーク発祥のおもちゃ
・・・ではありません。
すいません。LEGOブロックではないです。
グローバルを格納する「箱」をイメージして下さい。
ObjectScriptは、グローバルをブロックという単位で管理しています。
これは、データベース(.datファイル)やメモリ上のキャッシュで使用される最小の単位です。
ブロックには様々な種類があります。
我々が通常参照するグローバル、多種あるブロックの中の1つ「データブロック」に格納されています。
※例外あり
1つのデータブロックには、1つのグローバルと複数のグローバルノードとデータ値が格納されます。
普段、各ブロックを意識して使用する事はないと思います。
ただ、要所要所でこのブロックを意識する事で、処理速度が変わってきたりします。
それらのポイントは別の記事にて記載します。
先ずは、ブロックの基本について解説したいと思います。
ブロックの種類
データベースの中身であるブロックには、役割毎に性質の異なるブロックが存在しています。
普段ObjectScriptを使用している分には特に意識する必要はありません。
ただ、$orderの降順・昇順のカラクリやパフォーマンスチェック等で必用となって来るので、知っておいて損はないと思います。
ブロック名 | タイプ番号 | 説明 |
---|---|---|
ディレクトリ・ブロック | 9 | データベース内のグローバル名のインデックス カタログ・ブロックとも言われる |
上部ポインタ・ブロック | 66 | 下部ポインタ・ブロックのインデックス |
下部ポインタ・ブロック | 6 | データ・ブロックのインデックス |
ポインタ・ブロック | 70 | データ・ブロックのインデックス ※データ量が少ない時(上部・下部に分かれない程度) |
データ・ブロック | 8 | グローバルの値が格納されている |
他にも「ビッグ・データ・ブロック、マップ・ブロック」等々、複数種類のブロックが存在していますが、今回は割愛します。
各ブロックの構成イメージは下記になります。
ディレクトリ・ブロックを頂点にしデータ・ブロックを末端として、ピラミッド構造となっています。
ポインタブロックが上下に分割するのは、データ量に依存します。

ざっくりとしたブロックの構成をイメージした所で、各ブロックを詳細に見てみましょう。
各ブロックの確認
各ブロックを参照するため、確認用のデータを作成したいと思います。
先ずはターミナルを起動し、下記コマンドを実行して下さい。
k ^BlockSearch
f pos=1:1:100 s ^BlockSearch(pos)="ブロックを探す旅に出よう!"_pos
ブロック情報を取得する方法は、「%SYS」ネームスペースにてコマンド「d ^REPAIR」を実行します。
zn "%SYS"
d ^REPAIR
入力後、どのデータベースを参照するか確認してくるので、対象のディレクトリを入力します。
→今回は、いつもの検証用DB「D:\IRISDB\SAMPLE-DATA」を使います。
d ^REPAIR
***Block Repair/Examine Program***
Directory: : d:\iris\mgr\ => D:\IRISDB\SAMPLE-DATA
Global Directory Block: 3
Map Blocks: 2 62466 62467 62468 62469 62470 62471 62472 499714 499715 499716 499717 499718 499719 499720 499721 999426 999427 999428 999429 999430 999431 999432 999433 1499138 1499139 1499140 1499141 1499142 1499143 1499144 1499145 1998850 1998851 1998852
Entering Block Repair Menu
Block #:
後は、参照したいブロック番号を入力する事で、ブロックの中身を参照する事が可能です。
先ずは、ディレクトリ・ブロックから参照しましょう。
ディレクトリ・ブロック
「Global Directory Block: 3」とあるので、ディレクトリ・ブロックはNo.3のブロックになります。
「3」を入力してEnterを押下します。
内容 | 説明 |
---|---|
Type | ディレクトリ・ブロックのタイプ番号=9 |
Count of Nodes | DBには87のグローバルが格納されている |
「–more–」と表示されるので、もう一度Enterを押下します。
Block # 3 Type: 9 GLOBAL DIR
Link Block: 0 Offset: 1892
Count of Nodes: 87 Big String Nodes: 0
Pointer Length:0 Next Pointer Length:0 Diff Byte:Hex 0
Pointer Reference: ^BlockSearch
Next Pointer Reference:
Next pointer stored? No
--more--
# Node PTR,NEW GROWTH,COLL,TYPE,PROT
1 ^BlockSearch 29843 50 5 0 195
2 ^DefData 464684 50 5 0 195
3 ^ERRORS 51 50 5 0 195
4
...略
87 ^test 464686 50 5 0 195
Block Repair Function (Current Block 3):
このデータベースにある、全グローバルの一覧が表示されました。
参照予定のグローバル「^BlockSearch」のポインタブロックは、No. 29843になります。
次は、「ブロックNo. 29843」の「ポインタ・ブロック」情報を参照してみましょう。
ポインタ・ブロック
「Block Repair Function (Current Block 3):」の隣に「29843」と入力し、Enterを押下します。
「^BlockSearch」のポインタ・ブロック情報が表示されました。
Block Repair Function (Current Block 3): 29843
Block # 29843 Type: 70 TOP/BOTTOM POINTER
Link Block: 0 Offset: 44
Count of Nodes: 1 Collate: 5
--more--
内容 | 説明 |
---|---|
Type | ポインタ・ブロックのタイプ番号=70 |
「–more–」と表示されるので、もう一度Enterを押下します。
--more--
# Node POINTER
1 ^BlockSearch 29842
このポインタ・ブロックにある、全データ・ブロックの一覧が表示されました。
※とは言っても、データ量が少ないため、1つか表示されていません。
次は、末端のブロックである「データ・ブロック」を参照してみましょう。
データ・ブロック
「Block Repair Function (Current Block 29843):」の隣に「29842」と入力し、Enterを押下します。
「^BlockSearch」のデータ・ブロック情報が表示されました。
Block Repair Function (Current Block 29843): 29842
Block # 29842 Type: 8 DATA
Link Block: 0 Offset: 3644
Count of Nodes: 101 Collate: 5 Big String Nodes: 0
Pointer Length:11 Next Pointer Length:0 Diff Byte:Hex 0
Pointer Reference: ^BlockSearch
Next Pointer Reference:
Next pointer stored? No
--more--
内容 | 説明 |
---|---|
Type | ポインタ・ブロックのタイプ番号=8 |
Count of Nodes | ノードは101種存在している |
「–more–」と表示されるので、もう一度Enterを押下します。
--more--
# Node Data
1 ^BlockSearch
2 ^BlockSearch(1) ブロックを探す旅に出よう!1
3 ^BlockSearch(2) ブロックを探す旅に出よう!2
4
...略
101 ^BlockSearch(100) ブロックを探す旅に出よう!100
Block Repair Function (Current Block 29842):
^BlockSearchの全グローバルが表示されました。
ノードを、1 ~ 100までしか作成しなかったので、ポインタ・ブロック1つ、データ・ブロック1つのミニマム構成になります。
次は、少しグローバル量を増やして、ポインタを上/下に分割してみましょう。
続・各ブロックの確認
次は、ポインタブロックを上/下に分割したいので、少し多めにデータを作成したいと思います。
下記コマンドを、ターミナルより実行します。
k ^BlockSearch
f pos=1:1:1000000 s ^BlockSearch(pos)="ブロックを探す旅に出よう!"_pos
上記コマンドが完了したら、次は「^REPAIR」コマンドを実行します。
zn "%SYS"
d ^REPAIR
手順は先ほどと変わりません。
「^BlockSearch」のポインタ・ブロックは、ブロックNo. 29843です。
上部ポインタ・ブロック
先ほどとは変わり、No.29843のブロックは「上部ポインタブロック」に変更されています。
Block Repair Function (Current Block 3): 29843
Block # 29843 Type: 66 TOP POINTER
Link Block: 0 Offset: 88
Count of Nodes: 6 Collate: 5
First Node: ^BlockSearch
Last Node: ^BlockSearch(817117)
--more--
内容 | 説明 |
---|---|
Type | 上部ポインタ・ブロックのタイプ番号=66 |
Count of Nodes | 下部ポインタ・ブロックは6つある |
First Node | 最初の下部ポインタ・ブロックの開始ノードは「^BlockSearch」 |
Last Node | 最後の下部ポインタ・ブロックの開始ノードは「^BlockSearch(817117)」 |
データ量が増えた事で、表示される情報もまた増えてきました。
Enterを押下して、下部ポインタ・ブロックを表示します。
--more--
# Node POINTER
1 ^BlockSearch 465598
2 ^BlockSearch(163226) 465597
3 ^BlockSearch(327234) 466413
4 ^BlockSearch(490170) 467228
5 ^BlockSearch(654180) 468043
6 ^BlockSearch(817117) 468858
では、次に「下部ポインタ・ブロック」を参照してみましょう。
下部ポインタ・ブロック
今回作成したデータでは、下部ポインタ・ブロックは6つ作成されています。
また、最初のブロックNoは「465598」です。
Block Repair Function (Current Block 29843): 465598
Block # 465598 Type: 6 BOTTOM POINTER
Link Block: 465597 Offset: 6556
Count of Nodes: 814 Collate: 5
First Node: ^BlockSearch
Last Node: ^BlockSearch(163023)
--more--
内容 | 説明 |
---|---|
Type | 下部ポインタ・ブロックのタイプ番号=6 |
Count of Nodes | 紐づいているデータ・ブロック数=814 |
Link Block | 隣の下部ポインタ・ブロック番号 |
First Node | 最初のデータ・ブロックの開始ノードは「^BlockSearch」 |
Last Node | 最後のデータ・ブロックの開始ノードは「^BlockSearch(163023)」 |
Enterを押下して、紐づいているデータ・ブロックを表示します。
--more--
# Node POINTER
1 ^BlockSearch 29842
2 ^BlockSearch(204) 29844
...略
814 ^BlockSearch(163023) 465391
Block Repair Function (Current Block 465598):
大量にデータを作成したので、紐づいているデータ・ブロックの数が凄い量ですね。
最後に、「データブロック」を少し見てみましょう。
大量データ時のデータ・ブロック
データ・ブロックが1つだった時と異なり、表示している値が増えています。
Block Repair Function (Current Block 468858): 29842
Block # 29842 Type: 8 DATA
Link Block: 29844 Offset: 7352
Count of Nodes: 204 Collate: 5 Big String Nodes: 0
Pointer Length:11 Next Pointer Length:15 Diff Byte:Hex 20
Pointer Reference: ^BlockSearch
Next Pointer Reference: ^BlockSearch(204)
Next pointer stored? Yes
--more--
内容 | 説明 |
---|---|
Link Block | 隣のデータ・ブロック番号 |
Pointer Reference | 最初のノード |
Next Pointer Reference | 隣のデータ・ブロックの最初のノード |
各ブロック情報の解説は以上です。
各ブロックの全体像
^BlockSearchに関する、ブロック構造の全体像を下記に表示します。

まとめ
これまでをまとめると下記になります。
以上、グローバルアクセスとグローバル・バッファの動作について解説しました。
本記事が、皆さまの実務や学びの中で、少しでもお役に立てれば幸い