【IRIS/Cache】データベースのデフラグ方法

はじめに

IRIS/Cacheは、長時間使用してもパフォーマンスが低下する事がありません。

そのため、出番がなかなか発生しないコマンドになります。
出番のないコマンドって、忘れがちですよね。

今回は、おばあちゃんの知恵袋的なコマンドになります。
備忘を兼ねて、データベースのデフラグ方法をご紹介いたします。

※Cacheに関してはバージョンによって実行不可となります。

デフラグのコマンド

コマンド実行

GBLOCKCOPY等を使うと、結果的にデフラグを行った事になりますが、今回はデフラグを行うコマンドのご紹介になります。

デフラグの対象は、データベース単位になります。
ネームスペース単位ではありません。

コマンド実行前に、断片化の状況を確認しておきましょう。
「%GSIZE」を実行して確認します(%GSIZEに関してはここを参照して下さい)。

directory: d:\irisdb\sample-data\
Page: 1                           GLOBAL SIZE                                                                            16 Apr 2024
                                                                                                                             8:04 PM
      Global        Blocks       Bytes Used  Packing   Contig.
      --------    --------  ---------------  -------   -------
      developer.data.Defrag10D
                    23,807      172,689,552     89 %       242
      developer.data.Defrag10I
                    16,793      104,582,412     76 %    10,068
      developer.data.Defrag1D
                    23,808      172,660,248     89 %        15
      developer.data.Defrag1I
                    16,790      104,562,760     76 %    12,707
      developer.data.Defrag2D
                    23,807      172,678,692     89 %         7
      developer.data.Defrag2I
                    16,791      104,574,248     76 %     8,985
      developer.data.Defrag3D
                    23,808      172,671,712     89 %        11
      developer.data.Defrag3I
                    16,791      104,572,120     76 %     9,576
      developer.data.Defrag4D
                    23,807      172,663,888     89 %        16
      developer.data.Defrag4I
                    16,789      104,559,168     76 %     9,712
      developer.data.Defrag5D
                    23,807      172,664,620     89 %        10
      developer.data.Defrag5I
                    16,790      104,568,412     76 %    13,337
      developer.data.Defrag6D
                    23,806      172,654,424     89 %        12
      developer.data.Defrag6I
                    16,788      104,555,664     76 %     9,161
      developer.data.Defrag7D
                    23,807      172,662,200     89 %         8
      developer.data.Defrag7I
                    16,789      104,560,248     76 %     9,174
      developer.data.Defrag8D
                    23,807      172,671,464     89 %         3
      developer.data.Defrag8I
                    16,791      104,569,864     76 %     9,137
      developer.data.Defrag9D
                    23,806      172,668,220     89 %        15
      developer.data.Defrag9I
                    16,790      104,562,888     76 %    12,167


      TOTAL         Blocks       Bytes Used  Packing   Contig.
      --------    --------  ---------------  -------   -------
                   405,972    2,772,352,804     84 %   104,363

「Contig.(連続したブロック数)」の値と「Blocks(総ブロック数)」の値に着目します。
両者の値が乖離している程、断片化していると言えます。

かなりのグローバルが断片化している状況ですね。

では、この状況を解消すべく、デフラグコマンドを投入したいと思います。
ネームスペースを「%SYS」にして、「d ^DATABASE」を入力して下さい。

d ^DATABASE
%SYS>d ^DATABASE
 
 
 1) Create a database
 2) Edit a database
 3) List databases
 4) Delete a database
 5) Mount a database
 6) Dismount a database
 7) Compact globals in a database
 8) Show free space for a database
 9) Show details for a database
10) Recreate a database
11) Manage database encryption
12) Return unused space for a database
13) Compact free space in a database
14) Defragment a database
15) Show background database tasks
 
Option? [14]
Database directory? [DATファイルのフォルダパス入力(D:\IRISDB\SAMPLE-DATA)]
 
There are 3179MB of data to be processed.
 
Ok to begin defragmentation? [y]

「DATABASE」コマンドは1~15までの機能があり、今回は14の「Defragment a database」を実行します。

デフラグ対象のDATファイルのフォルダパスを入力した後、「y」をクリックしてコマンドの実行を開始させます。

コマンド投入後、作業進捗がターミナル上に表示されます。
 →そこそこ時間がかかります。

------------------------------------------------------------------------------
データベースをデフラグ, ID=1, as of 2024-04-17 18:29:34
------------------------------------------------------------------------------
Start Time:     2024-04-17 18:26:38
Namespace:      %SYS
State:          Done  (PID: 3812)
データベース:         d:\irisdb\sample-data\
Progress:       100.00%
                |############################################################|
Final Status:   OK
------------------------------------------------------------------------------
データベースをデフラグ ended (see status above)

デフラグ処理が完了したと表示されたので、データ・ブロックの状況を再度「%GSIZE」を使用して確認します。

directory: d:\irisdb\sample-data\
Page: 1                           GLOBAL SIZE                                                                            17 Apr 2024
                                                                                                                             6:34 PM
      Global        Blocks       Bytes Used  Packing   Contig.
      --------    --------  ---------------  -------   -------
      developer.data.Defrag10D
                    23,807      172,689,552     89 %    23,806
      developer.data.Defrag10I
                    16,793      104,582,412     76 %    16,792
      developer.data.Defrag1D
                    23,808      172,660,248     89 %    23,806
      developer.data.Defrag1I
                    16,790      104,562,764     76 %    16,789
      developer.data.Defrag2D
                    23,807      172,678,692     89 %    23,806
      developer.data.Defrag2I
                    16,791      104,574,248     76 %    16,790
      developer.data.Defrag3D
                    23,808      172,671,712     89 %    23,807
      developer.data.Defrag3I
                    16,791      104,572,120     76 %    16,790
      developer.data.Defrag4D
                    23,807      172,663,888     89 %    23,806
      developer.data.Defrag4I
                    16,789      104,559,172     76 %    16,788
      developer.data.Defrag5D
                    23,807      172,664,620     89 %    23,806
      developer.data.Defrag5I
                    16,790      104,568,412     76 %    16,789
      developer.data.Defrag6D
                    23,806      172,654,424     89 %    23,805
      developer.data.Defrag6I
                    16,788      104,555,664     76 %    16,787
      developer.data.Defrag7D
                    23,807      172,662,200     89 %    23,806
      developer.data.Defrag7I
                    16,789      104,560,248     76 %    16,788
      developer.data.Defrag8D
                    23,807      172,671,464     89 %    23,806
      developer.data.Defrag8I
                    16,791      104,569,868     76 %    16,790
      developer.data.Defrag9D
                    23,806      172,668,220     89 %    23,805
      developer.data.Defrag9I
                    16,790      104,562,892     76 %    16,789


      TOTAL         Blocks       Bytes Used  Packing   Contig.
      --------    --------  ---------------  -------   -------
                   405,972    2,772,352,820     84 %   405,951

「Contig.」の値とブロック数が、ほぼ等しくなりました。
断片化が解消されたと言えます。

デフラグ実行時の注意点

データベースの後方に空きスペースが無い場合、データベースが肥大化します。

There are 3004MB of data to be processed.
 
There are 0MB of freespace at the end of the database, and
defragmentation requires an additional 3024MB to operate.
 
You can continue, in which case the database may expand to accomodate up to
3024MB of additional space needed for defragmentation to operate.
 
Ok to begin defragmentation? [y]

デフラグ実行に空きスペースが無い為、3024MBデータベースを拡張すると言っています。

デフラグ完了後、元のサイズが2.93GBに対し、5.94GBに肥大化しました。

肥大化したなら仕方なし、データベースの縮小を行いましょう。
コマンドは後日ご紹介いたします。

デフラグ後の性能確認

では、デフラグの前後でどのくらい処理速度が変わるのか、確認してみましょう。
developer.data.Defrag1D~developer.data.Defrag10Dまでのグローバルを、forループで全レコード回してみました。

んんっ、あれ!?

処理速度に3倍近いほどの差が出ているんですが・・・
こんなに差がでるものなんだ

もう一つのデフラグコマンド

デフラグを実行するコマンドは、もう一つあります。

ターミナルでネームスペースを「%SYS」に変更し、下記コマンドを実行します。

zn "%SYS"
w ##class(SYS.Database).Defragment([dir])

引数「dir」は、デフラグを実行するデータベースのディレクトリになります。

このデフラグコマンドは、データベース拡張の警告が出ません。
しれっと拡張しますが、タスクで実行するにはうってつけです。

覚えておいて損はしないコマンドになります。

おわりに

デフラグを行ってもデータの動きが激しいシステムであれば、また断片化が発生してしまいます。
そのため、あまり神経質になっても仕方がない面もあります。

ただ、データの動きが小さいデータベースで、大量のデータを取得するような使い方をするのであれば、デフラグの実行はかなり効果を発揮しそうですね!

以上、デフラグを行うコマンドの紹介でした。