はじめに
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.」の値とブロック数が、ほぼ等しくなりました。
断片化が解消されたと言えます。
デフラグ実行時の注意点
デフラグ後の性能確認
では、デフラグの前後でどのくらい処理速度が変わるのか、確認してみましょう。
developer.data.Defrag1D~developer.data.Defrag10Dまでのグローバルを、forループで全レコード回してみました。
んんっ、あれ!?
処理速度に3倍近いほどの差が出ているんですが・・・
こんなに差がでるものなんだ
もう一つのデフラグコマンド
デフラグを実行するコマンドは、もう一つあります。
ターミナルでネームスペースを「%SYS」に変更し、下記コマンドを実行します。
zn "%SYS"
w ##class(SYS.Database).Defragment([dir])
引数「dir」は、デフラグを実行するデータベースのディレクトリになります。
このデフラグコマンドは、データベース拡張の警告が出ません。
しれっと拡張しますが、タスクで実行するにはうってつけです。
覚えておいて損はしないコマンドになります。
おわりに
デフラグを行ってもデータの動きが激しいシステムであれば、また断片化が発生してしまいます。
そのため、あまり神経質になっても仕方がない面もあります。
ただ、データの動きが小さいデータベースで、大量のデータを取得するような使い方をするのであれば、デフラグの実行はかなり効果を発揮しそうですね!
以上、デフラグを行うコマンドの紹介でした。