【IRIS/Cache】グローバルざっくり解説#1 ブロックって何?

本記事は、グローバルが格納される魔法の「」、ブロックについて解説します。

※この記事は下記の方向けになります。
  • ObjectScript初心者の方
  • グローバル構造について詳しく知りたい方

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 NodesDBには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に関する、ブロック構造の全体像を下記に表示します。

まとめ

これまでをまとめると下記になります。

まとめ
  • ブロックの概念と種類
  • ブロック情報と確認方法
  • ブロックの構造

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