クリアフィルター
記事
Hiroshi Sato · 2021年10月7日
これは InterSystems FAQ サイトの記事です。ジャーナルファイルのサイズが大きすぎて、管理ポータルで検索やフィルタリング等できない場合、以下の2つの方法で参照することができます。
① ^JRNDUMP ユーティリティを使用する方法② プログラムで参照する方法
============================================================
① ^JRNDUMP ユーティリティを使用する方法 例えば、グローバル参照 ^ABC を含むジャーナルファイルのすべてのレコードを選択する場合は、以下のようになります。
※以下、すべてのコマンドは %SYS ネームスペースで実行してください。
DO SELECT^JRNDUMP("C:\MyCache\mgr\journal\YYYYMMDD.001","","","^ABC",1)
グローバル参照 ^ABC に完全に一致するレコードのみを選択する場合は、以下のようになります。
DO SELECT^JRNDUMP("C:\MyCache\mgr\journal\YYYYMMDD.001","","","^ABC",0)
グローバル ^ABC に対するローカルの Set 処理のレコードのみを選択する場合は、以下のようになります。
DO SELECT^JRNDUMP("C:\MyCache\mgr\journal\YYYYMMDD.001","","","^ABC","",6)
グローバル ^ABC に対するローカルおよびリモートの Set 処理のレコードのみを選択する場合は、以下のようになります。
DO SELECT^JRNDUMP("C:\MyCache\mgr\journal\YYYYMMDD.001","","","^ABC","","s")
詳細は下記ドキュメントページをご覧ください。
^JRNDUMP を使用したジャーナル・レコードの表示
============================================================ ② プログラムで参照する方法 %SYS.Journal.Record クラスを使用して、任意のジャーナルファイルのレコード内容を取得することができます。
set jrn="C:\intersystems\cache\mgr\journal\20160101.003" set log="C:\temp\journal.log" set file=##class(%File).%New(log) do file.Open("WSN") set rs=##class(%ResultSet).%New("%SYS.Journal.Record:List") do rs.Execute(jrn) while rs.Next() { set time=rs.Get("TimeStamp") // 時間:yyyy-mm-dd hh:mm:ss set type=rs.Get("TypeName") // タイプ:SET、KILL、xxTrans など set gref=rs.Get("GlobalReference") // グローバル参照 set gval=rs.Get("NewValue") // 更新後の値 /* if gref["ABC" { */ set line=time_" ["_type_"] "_gref if type="SET" { set line=line_"="_gval } do file.WriteLine(line) /* } */ } do file.Close()
詳細は下記クラスリファレンスをご覧ください。
クラスリファレンス(%SYS.Journal.Record:List)
記事
Tomoko Furuzono · 2023年4月11日
これは、InterSystems FAQサイトの記事です。%Library.GlobalクラスのExport()メソッドを使用してエクスポートする際に、エクスポート形式(第4引数:OutputFormat)を 7 の「ブロックフォーマット/Cachéブロックフォーマット(%GOF)」にした場合、マッピングされたグローバルはエクスポートできない仕様となっています(対象はネームスペースのデフォルトグローバルデータベースのグローバルのみ)。マッピングされたグローバルを「ブロックフォーマット/Cachéブロックフォーマット(%GOF)」でエクスポートする為には、%Library.Global.Export()の第1パラメータにマッピング先のデータベースディレクトリを指定します。実行例は以下の通りです。
set DB = "^^c:\InterSystems\Cache\Mgr\Test\" ; "^^\<データベースフォルダーのパス>\" set sc = ##class(%Library.Global).Export(DB,"TESTGBL.gbl",FULLPATH,7,,"")
エクスポート形式を 5(既定値) の「ISM/ObjectScriptフォーマット(ISM/Cacheフォーマット)(※)」を指定した場合、マッピングされたグローバルもエクスポートできますが、エクスポート形式(第4引数:OutputFormat)を 7 の「ブロックフォーマット/Cachéブロックフォーマット(%GOF)」にした場合と比べ、出力ファイルが大きくなります。※ シーケンシャルファイル形式また、グローバルにバイナリデータが記録されている場合、そのデータは正常に出力されません。詳細については、以下ドキュメントをご覧ください。クラスリファレンス:%Library.Global.Export() 【IRIS】クラスリファレンス:%Library.Global.Export()
【注意】$LIST形式や制御文字を含むグローバルの場合は、エクスポート形式を 5(既定値) の「ISM/ObjectScriptフォーマット(ISM/Cacheフォーマット)(※)」で正常にエクスポートできません。この場合は、データベース単位に、エクスポート形式(第4引数:OutputFormat)を 7 の「ブロックフォーマット/Cachéブロックフォーマット(%GOF)」でエクスポートする必要があります。
記事
Megumi Kakechi · 2022年3月3日
これは、InterSystems FAQサイトの記事です。ある処理において、データを無期限に保存する必要がなくグローバルの強力な性能が必要になる場合に、IRISTEMP/CACHETEMP データベースに保存される一時グローバルが使用されます。IRISTEMP/CACHETEMPデータベースはジャーナルされないので、一時グローバルの使用ではジャーナルファイルは作成されません。
IRISTEMP/CACHETEMP データベースは、システムで一時ストレージ用に使用され、ユーザも同じ用途で使用することができます。
一時グローバルとIRISTEMPデータベースの詳細については、以下のドキュメントをご覧ください。一時グローバルと IRISTEMP データベース
一時グローバルとして使用されるグローバルには以下のようなものがあります。
1. システムテンポラリグローバル(^IRIS.Temp*、^%cspSession、^CacheTemp*、^mtemp* など)2. ユーザが設定したIRISTEMP/CACHETEMPへのマッピングによる一時グローバル3. プロセスプライベートグローバル (^||name、^|"^"|name、^["^"]name、^["^",""]name など)4. GLOBAL TEMPORARY テーブル ⇒テーブル定義は永続(全てのプロセスで使用可能)で、テーブルデータはプロセスプライベートグローバルに格納します(プロセスの期間中のみ存続)
1,2 のサイズは ^%GSIZE ユーティリティで確認できます。
USER>do ^%GSIZEDirectory name: c:\intersystems\iris\mgr\user\ => c:\intersystems\iris\mgr\iristemp\ // iristemp データベースフォルダを指定All Globals? No => yes // 全てのグローバルを表示する場合は Yes 34 items selected from34 available globalsShow details?? No => No // 詳細情報を表示しない場合は NoDevice:Right margin: 80 =>:
3,4 のプロセスプライベートグローバルは、^GETPPGINFOユーティリティーで確認が可能です。
^GETPPGINFOユーティリティについては、以下のドキュメントをご覧ください^GETPPGINFOユーティリティについて【IRIS】^GETPPGINFOユーティリティについて
以下の例では、すべての現在プロセスのプロセスプライベートグローバルをリストしています。
set ^||flintstones(1)="Fred"
set ^||flintstones(2)="Wilma"
znspace "%SYS"
do ^GETPPGINFO("*")
プロセスプライベートグローバルを使用するプロセスのうち、使用量が多いものを個別に内容出力する方法もあります。
以下のサンプルでは、プロセスあたりのプロセスプライベートグローバルブロック数が20以上のものを出力しています。
set ns=$namespace
znspace "%SYS"
// 全プロセスよりPPGのブロック数が多いもののみ対象とする
set st=##class(%SQL.Statement).%New()
set status=st.%PrepareClassQuery("%SYS.ProcessQuery","AllFields")
set rs=st.%Execute()
while rs.%Next() {
set pid=rs.%Get("Pid") // プロセスID
set cnt=rs.%Get("PrivateGlobalBlockCount") // PPGのブロック数
// プロセスあたりのPPGブロック数が〇以上の時中身を出力(以下の例は20ブロック以上)
if cnt > 20 {
set rs2=##class(%ResultSet).%New("%SYS.ProcessQuery:PPG")
// "N" Do not return subscripts of a PPG, just return the root name
// "B" Return the number of blocks used by the PPG (needs the "N" option)
do rs2.Execute("*",pid,"NB")
for {
quit:'rs2.Next()
write cnt_" PID:"_pid_", PPG name "_rs2.GetData(1)_" is using "_rs2.GetData(3)_" disc blocks",!
}
}
}
znspace ns
記事
Megumi Kakechi · 2022年8月8日
これは InterSystems FAQ サイトの記事です。
テーブル(クラス) のデータを削除する際に %KillExtent() というメソッドを使用すると、レコードを1ずつ削除するのではなく、データを格納しているデータグローバル、インデックス定義のグローバル(ノード) をまとめて 削除することができます。
kill ^ISJ.xxxD
kill ^ISJ.xxxI
のようにデータグローバルやインデックスグローバルをまとめて削除するのと同じような動作となります。そのため、ジャーナルレコードへの出力は最小限になります。
使用例:
write ##class(ISJ.xxx).%KillExtent()
ただし、トランザクション下で実行すると一括 Kill の場合でも保存されているレコードに応じたジャーナルレコードが生成されるのでご注意ください。
また、以下のドキュメントの注意書きにあるように、他クラス(テーブル)への参照などが含まれているクラスで実施されると整合性に問題が発生する場合がありますのでご注意ください。
%KillExtent() メソッド
こちらを必要なだけ記述したタスククラスを作成すると、タスクスケジューラから定期的に実行できます。タスククラスの作成方法は、以下のトピックをご覧ください。
【FAQ】定期的に処理を実行する事は出来ますか?
【ご参考】
IRIS 2021.2 (メジャー/EMバージョンは 2022.1) 以降のバージョンで、ジャーナルファイルの圧縮機能 が追加されました。このバージョン以降、非アクティブなジャーナルファイルを圧縮して保存することが可能となります。圧縮率はおよそ 85% です。例えば、1GBのファイルサイズの場合は、150MB程度に圧縮されます。
ジャーナルファイルの圧縮は、IRIS構成ファイル(iris.cpf)[Journal] セクションの CompressFiles オプションで設定できます。既定は「1(有効)」になっています。InterSystems IRIS 2022.1 の新機能と機能強化について
また、圧縮されたジャーナル・ファイルを任意のアーカイブ・ロケーションにコピーできる、ジャーナル・ファイル・アーカイブ機能は 2022 のCDリリースと 2023.1 メジャーリリースで提供予定です。ジャーナル・アーカイブ機能を有効にすると、ローカルのジャーナル・ファイルをより早くパージすることができるようになります。アーカイブ先には、高い書き込み性能は必要ないため、低速で安価なオブジェクトストレージを選択することが可能です。
2022年3月9日に開催しました、「InterSystems Japan Virtual Summit 2022」の「ストレージの節約手法について」 のセッションでは、ジャーナル圧縮 & アーカイブの新機能について紹介しています。是非ご覧ください。
【アーカイブ配信のお知らせ】ストレージの節約手法について(2022年3月9日開催)※16:00 ~ ジャーナリングについて 19:00 ~ ジャーナル圧縮&アーカイブについて
記事
Megumi Kakechi · 2021年2月1日
これは InterSystems FAQ サイトの記事です。
下記のWebゲートウェイのエラーメッセージ/システム応答に対して、個別のエラーページを設定することができます。
サーバエラー
サーバビジー
サーバが利用可能ではありません
サーバタイムアウト
接続が閉じられました
設定は、Webゲートウェイ管理画面( [管理ポータル] > [システム管理] > [構成] > [Webゲートウェイ管理] )で行います。
[デフォルトパラメータ] メニュー内の [エラーページ] セクションで、各エラー発生時に表示させるhtmlページのファイル名またはリダイレクトさせるURLを設定します。
※Webゲートウェイ管理画面は、下記URLからもアクセス可能です。
http://<Webサーバアドレス>:<ポート>/csp/bin/Systems/Module.cxw
詳細は、以下ドキュメントをご参照ください。カスタムエラーページについて【IRIS】
記事
Megumi Kakechi · 2020年12月15日
これはInterSystems FAQ サイトの記事です。
%SYSTEM.SQL クラスの Purge* メソッドを使用して削除することが可能です。
※各メソッドの詳細は、以下ドキュメントをご参照ください。
%SYSTEM.SQLクラスについて【IRIS】
%SYSTEM.SQLクラスについて
①システム内のすべてのクエリキャッシュを削除する場合
Do $SYSTEM.SQL.PurgeAllNamespaces()
②ネームスペース内のクエリキャッシュを削除する場合
// ネームスペース内のすべてのクエリキャッシュを削除するDo $SYSTEM.SQL.Purge()// 日付指定してクエリキャッシュを削除する場合// 以下は、過去30日間に使用されていないクエリキャッシュを削除Do $SYSTEM.SQL.Purge(30)
③クエリキャッシュを指定して削除する場合
Do $SYSTEM.SQL.PurgeCQClass("%sqlcq.USER.cls13")
④特定テーブルのクエリキャッシュを削除する場合
Do $SYSTEM.SQL.PurgeForTable("MedLab.Patient")
記事
Mihoko Iijima · 2021年3月5日
これは InterSystems FAQ サイトの記事です。
永続クラス(=テーブル)定義に提供される %BuildIndices() メソッドの引数に、インデックスを再構築したい ID の開始値と終了値を指定することにより、その範囲内のインデックスのみが再構築できます。
例えば、Sample.Person クラスにある NameIDX インデックスと ZipCode インデックスを ID=10~20 のみ再構築する場合は、以下のように実行します(ID の範囲は、第5引数、第6引数に指定してます)。
set status = ##class(Sample.Person).%BuildIndices($LB("NameIDX","ZipCode"),1,,1,10,20)
$LB() は $ListBuild() 関数で、%BuildIndices() メソッドでは、インデックス名を指定するために使用しています。
インデックスの再構築方法については、ドキュメントもご参照ください。
2018.1 以下はこちらのドキュメントをご参照ください。
記事
Tomoko Furuzono · 2021年6月15日
これは、InterSystems FAQサイトの記事です。
Windowsのコマンドプロンプトからターミナルを起動するには以下の様な操作を行います。
実行イメージの場所に移動します。
cd c:\interssytems\IRIS\bin
以下のコマンドを実行します。 ( インスタンス名のデフォルトは「IRIS」です。)
iristerm.exe /console=cn_ap:<インスタンス名>[]
コンソールターミナルは以下のように実行します。
iris console <インスタンス名>
コンソールターミナルの場合、そのままでは日本語を正しく表示できませんのでご注意ください。日本語を表示させるためには、以下の記事の内容の設定が必要です。(外部技術情報サイト)コマンドプロンプト起動時、自動的に文字コードをUTF-8にして日本語もちゃんと表示できるようにする方法
記事
Mihoko Iijima · 2021年7月20日
これは InterSystems FAQ サイトの記事です。
バージョンアップ後、ルーチンを再コンパイルする必要はありませんが、バージョンアップで %SYS が上書きされるため、%SYS 内のユーザ作成 INT 形式および OBJ 形式ルーチン(*.INT,*.OBJ)が削除されますので、注意が必要です。
MAC形式(.MAC)と以下の名前の INT 形式および OBJ 形式ルーチンについては削除されません。
%Z*.INT, %z*.INT, Z*.INT,z*.INT
%Z*.OBJ, %z*.OBJ, Z*.OBJ,z*.OBJ
なお、クラス/CSP はアップグレード後にコンパイルが必要となります。
ただし、メンテナンスリリースへのアップグレードの場合は、コンパイルは不要です。詳細は、以下ドキュメントをご参照ください。
メンテナンス・リリースのアップグレード後のタスク
Caché/Ensemble:メンテナンス・リリースのアップグレード後のタスク
記事
Mihoko Iijima · 2021年9月14日
これは InterSystems FAQ サイトの記事です。
管理ポータルの SQL 画面(管理ポータル > システムエクスプローラ > SQL)で、任意の SQL を実行した後、結果の行数などが表示されいる行の右端にある「印刷」のリンクから、CSVファイル出力を選択できます。
「クエリ印刷」画面で「ファイルにエクスポート」をチェックすると「ファイル形式」の欄が表示されます。
形式に「CSV」を指定し、出力ファイル名を指定したあと「エクスポート」ボタンをクリックすると出力できます。
注意:古いバージョンでは正しくCSV出力が行えない場合もあります。新しいバージョンをぜひご利用ください。
プログラムでCSV出力を行いたい場合は、関連記事をご参照ください。
任意のSQL文の実行結果をプログラムでCSVに出力する方法
記事
Tomoko Furuzono · 2021年12月26日
これは、InterSystems FAQサイトの記事です。
MM/DD/YY-hh:mm:ss:fff ( ) 0 [Utility.Event] Purging old application errors
こちらのメッセージは、エラーではなく、アプリケーションのエラーログを記録した古い ^ERRORSグローバルのパージ処理が実行された際に出力されるメッセージになります。ログを削除した旨のみを伝えるメッセージであり、出力されていても特に問題はありません。また、このログは、^ERRORSグローバルのパージ処理がタスク実行される毎日01:00 に出力されます。
実際にアプリケーションエラーがある場合は、管理ポータルの [システムオペレーション] > [システムログ] > [アプリケーションエラーログ] にて、詳細を確認できます。※このエラーログの内容は、各ネームスペースの ^ERRORS グローバルに格納されているものです。
記事
Mihoko Iijima · 2023年4月17日
これは InterSystems FAQ サイトの記事です。
以下の状態の時、ReadOnlyでマウントされます。
データベースの構成設定「読み込み専用でマウント」にチェックをつけている
データベースマウント時「読み込み専用」のチェックをつけている
ミラー構成を使用していないのにデータベースにミラー属性がついている
詳細は「ミラー・データベースがミラー構成削除後に読み取り専用でマウントされる」をご参照ください。
データベースファイルが存在するディレクトリを全体をコピーし、そのディレクトリに対してデータベースを作成したとき
詳細は「データベースファイルが存在するフォルダ全体をコピーしたとき、コピーしたデータベースファイルがマウントできません。」をご参照ください
記事
Tomoko Furuzono · 2022年5月6日
これは、InterSystems FAQ サイト の記事です。
1つのインスタンスで作成可能なネームスペース数の上限は、2048個になります。ただし多数のネームスペースを使用するには、それに合わせてメモリの設定が必要になります。使用するメモリの設定については下記の関連トピックご参照ください。管理ポータルのメモリ関連設定項目について
また1つのインスタンスに作成可能なデータベース数(リモートデータベースを含む)の上限は、15998個になります。なおライセンスの種類によっては、作成可能な数に制限が設けられています。
詳細については、以下ドキュメントをご参照ください。ドキュメント:ネームスペースの構成ドキュメント:ローカル・データベースの構成
記事
Hiroshi Sato · 2025年3月4日
これは InterSystems FAQ サイトの記事です。
ObjectScriptの%Netパッケージのライブラリクラスを利用して、ファイルを他のサーバーにアップロードすることができます。
以下のCurl コマンドと同じことを ObjectScript で実現する方法を紹介します。
curl -X POST "http://localhost/api/upload?a=123&b=999" -F file=@"C:/temp/a.csv"
クライアントのObjectScriptコードを以下の様に作成します。
// form-data (for CSV)
set msg= ##class(%Net.MIMEPart).%New()
set msg.ContentType = "multipart/form-data"
set inputstream=##class(%Stream.FileBinary).%New()
set sc=inputstream.LinkToFile("C:\temp\a.csv")
If $$$ISERR(sc) Do $system.OBJ.DisplayError(sc) Quit
set filePart = ##class(%Net.MIMEPart).%New(inputstream)
set filePart.ContentType = "text/csv;charset=utf-8"
do filePart.SetHeader("Content-Disposition","form-data; name=""csvfile""; filename=""upload.csv"";")
do msg.Parts.Insert(filePart)
set tempstream = ##class(%Stream.TmpCharacter).%New()
set writer = ##class(%Net.MIMEWriter).%New()
do writer.OutputToStream(.tempstream)
do writer.WriteMIMEBody(msg)
// POST with the above form-data
set req=##class(%Net.HttpRequest).%New()
set req.Server="127.0.0.1"
set req.Port=80
do req.SetParam("a","123") ;; a=123
do req.SetParam("b","999") ;; b=999
set req.EntityBody = tempstream
set req.ContentType = "multipart/form-data; boundary="_msg.Boundary
set sc = req.Post("/api/upload")
If $$$ISERR(sc) Do $system.OBJ.DisplayError(sc) Quit
set res=req.HttpResponse
write res.Data.Read(1000)
記事
Tomohiro Iwamoto · 2022年7月3日
# IRISリリース2022.1のご紹介
本稿は、[「InterSystems IRIS、IRIS for Health、HealthShare Health Connect 2022.1がリリースされました!」](https://jp.community.intersystems.com/node/519631)でご案内している内容を、補足解説する内容となります。
# 紹介ビデオ
米国本社プロダクトマネージャーによる本リリースのハイライトのご紹介ビデオ(英語)です。
https://www.intersystems.com/resources/whats-new-in-intersystems-iris-2022-1
# リリース内容
年一度のEMリリースです。
- メンテナンスアップデート提供:リリース日から2年間
- セキュリティアップデート提供:リリース日から4年間
- InterSystems IRIS, InterSystems IRIS for Health
- 同時期にリリースされるモジュール
ICM, IKO, InterSyetms Reports, InterSystems Studio
- 独立してリリースされるモジュール
IAM, SAM, 各種ドライバ類, VS Code ObjectScript 拡張
# プラットフォーム
|O/S|
|:---|
|Microsoft Windows Server 2012, Server 2016, Server 2019, Server ***2022***, 10, ***11*** for x86-64|
|Oracle Linux 7, 8 for x86–64|
|Red Hat Enterprise Linux 7.9 for x86-64|
|Red Hat Enterprise Linux 8.1–8.5 for x86-64 or ARM64|
|SUSE Linux Enterprise Server 15 SP3 for x86-64 |
|Ubuntu 18.04, 20.04 LTS for x86-64 or ARM64|
|IBM AIX® 7.2, 7.3 for Power System-64 |
|開発環境用O/S|
|:---|
|CentOS-7 x86-64|
|Apple macOS 10.15 for x86-64 AND ***M1***|
以下、2021.2,2022.1で追加された機能についてご紹介しています。
# 開発者向け
## Kafkaメッセージのサポート
Apache Kafka用のインバウンド・アウトバウンドアダプター、ビジネスサービス、ビジネスオペレーションおよび、低レベルなAPIを提供します。
これらを使用して、プロダクション環境、非プロダクション環境を問わず、kafkaの持つ、高速なデータパイプライン、ストリームに対する分析、データ投入などの機能を容易に利用できるようになります。
### プロダクション用途
インバウンドアダプタは、Kafkaのコンシューマ機能を提供します。
アウトバウンドアダプタは、Kafkaのプロデューサ機能を提供します。
### 低レベルなAPI
Kafkaのコンシューマ、プロデューサ機能を持つ、低レベルAPIを提供します。
```
Set settings = ##class(%External.Messaging.KafkaSettings).%New()
Set settings.username = "amandasmith"
Set settings.password = "234sdsge"
Set settings.servers = "100.0.70.179:9092, 100.0.70.089:7070"
Set settings.clientId = "BazcoApp"
Set client = ##class(%External.Messaging.Client).CreateClient(settings, .tSC)
Set topic = "quickstart-events"
Set value = "MyMessage", key = "OptionalTag"
Set msg = ##class(%External.Messaging.KafkaMessage).%New()
Set msg.topic = topic
Set msg.value = value
Set msg.key = key
Set tSC = client.SendMessage(msg)
```
> Kafkaとの接続に関して、開発者コミュニティに多数の寄稿がありますが、それらとは別にKafkaとの接続性を製品として提供するものになります。
## Python関連の強化
### 埋め込みPython
言語としてObjectScriptが使用できるあらゆる場面でPythonを使用可能になります。
使用例) [ePy.Test.cls](https://github.com/IRISMeister/rel-20221/blob/main/src/Sample/ePy/Test.cls)
> 実行環境としてのIRISとPythonは類似点が多く(インタプリタ、c言語実装、オブジェクトモデル)、同一プロセス空間で動作させるなど、他言語に比べて踏み込んだ統合を行っています。
Python Gateway(PEX)やPython SDKを置き換えるものではありません。
埋め込みPythonについては、開発者コミュニティに多数の寄稿がありますので、参照ください。
[【はじめてのInterSystems IRIS】Embedded Python セルフラーニングビデオシリーズ公開!](https://jp.community.intersystems.com/node/520751)
>6/28 (火)に開催した「Embedded Pythonの新設トレーニングコースのご紹介ウェビナ」の[オンデマンド配信](https://event.on24.com/wcc/r/3809492/8803F63076E114B9D660466D06F5E4A2)もあります。
### Python SDK
既存のpyODBC,IRIS Native, Python Gwatewayに加えてDB-APIを追加。
> SQLAlchemy(PythonのORマッパー)を使用できるようにするための機能追加の一環です。
### プロダクション環境でのPython使用
プロダクションで多様なプログラム言語を使用可能にする機能であるPEXにPythonが追加されました。
> これで、サポートされる言語はPython, Java, .NET, ObjectScriptになりました。
> IRIS-Python間のAPIはIRIS Nativeを使用しています。***埋め込みPythonではありません。***
PEXとは、下記のようにJavaや.NETをプロダクションで使用するための機能です。これらが持つ多彩な外部接続ライブラリの使用に加え、ビジネスロジック(ビジネスプロセス)そのものをこれらの言語で記述することも可能です。

Pythonの機能を利用して、アダプタの作成、分析や演算を実施、永続メッセージの作成、長時間実行されるビジネスプロセスへの参加が可能となります。
## Visual Studio Code ObjectScript 拡張
### ドキュメントとの統合
該当箇所にマウスをかざすだけでドキュメントを表示。クラス階層のブラウジング。ユーザ作成のクラスドキュメントのプレビュー表示が可能になりました。
### シンタックスに埋め込みPythonサポート
埋め込みPythonのシンタックスカラーリングを正しく行います。
### Studioライクな使用方法の拡充
CSPファイルの編集・コンパイルが可能になりました。
サーバ側での検索が可能になりました。
> 現在サーバサイドの検索機能は、VSCODEのProposed APIを使用しているため、それらAPIが正式リリースになるまでは[こちらの手順](https://github.com/intersystems-community/vscode-objectscript#enable-proposed-apis)でプレビュー機能を有効化する必要があります。
### デバッグ機能
オブジェクトのプロパティ値を参照可能になりました。安定性をより向上しました。
## SQLクエリ実行のローコード化
外部データソースに対してSQLを実行するための、汎用のビジネスサービス、ビジネスオペレーションを用意しました。
>今まではSQLアダプタを使用するビジネスサービス、ビジネスオペレーションを作成する必要がありました。
受信したレコードの内容を保持するためのメッセージを個別に作成する必要はありません。レコードの内容はJSON形式でEns.StreamContainerに格納されます。
詳細は[こちら](https://docs.intersystems.com/iris20221/csp/docbook/Doc.View.cls?KEY=ESQL_bs)をご覧ください。
## .NET 5
ADO.NET, Native API, Gateway(PEX)において、.NET5をサポートします。
> .NET6は時期リリースでの対応に向けて準備中です。
# 実行速度、スケーラビリティ、セキュリティ関連
## アダプティブなSQLオプティマイザ
テーブルの統計情報をより軽量に取得する手段を実現することにより、高精度なランタイム時のクエリプランの選択が可能となりクエリパフォーマンスが向上しました。
下記は、パートナ様の実データと実際に使用されているクエリを使用したベンチマーク測定の結果です。2021.1-2022.1間で、I/O量が25%減、実行時間が半分に改善されている事がわかります。

### スマートサンプリング & テーブル統計の自動化
ブロックレベルでサンプリングを行うことで、今まで行単位で行っていたサンプリング(もしくはフルスキャン)による統計処理のコストを大幅に短縮しました。
クエリ初回実行時に統計情報が存在しない場合は、自動的に統計取得を行い、より良いクエリプランの選択を試みます。
今までは、統計処理の実行を忘れてしまったり、テーブルサイズが大きいため、プロダクション環境での実行をためらったりという事態が発生し、その結果、あまり効率的ではないクエリプランが使用され続ける可能性がありました。
従来のメカニズムと新しいメカニズムとの実行時間の比較は下記のようになります。

グラフ横軸は、テーブルサイズ0.000008GB(8KB)から22GBまでの自然対数ln(x)の値です。つまり
ln(0.000008)=-11.736069016284 ~ ln(22)=3.0910424533583
> デフォルトのストレージマッピングの使用が前提になります。
[こちら](https://jp.community.intersystems.com/node/510751)に解説記事があります。
### 高度なテーブル統計
テーブル統計情報としてヒストグラムを取得するようになりました。これにより、レンジを指定するクエリに対しても選択性を計算できるようになりました。この結果をRTPCが使用することで、クエリの性能が向上する事が期待できます。
例えば、下記のようなクエリにおいて、LocationCountryに対してはRTPCの外れ値検知のメカニズムを使用可能ですが、EventDateに対しては個別の値の選択性はあまり役に立ちません。ヒストグラムを使用することで、レンジに対して、どの程度の選択性を持ちうるかを導出することが可能になりました。
```
SELECT * FROM Aviation.Event WHERE EventDate < '2004-05-01' AND LocationCountry = 'California'
```
.png)
[こちら](https://jp.community.intersystems.com/node/510611)に解説記事があります。
### ランタイム時のクエリプランの選択
ランタイム時のクエリプランの選択(RTPC, Run-Time Plan Choice)をデフォルトで有効にしました。これにより、下記のようなクエリが高速化する可能性があります。
- 外れ値
```
....FROM log WHERE level='INFO'
```
特定の値がレコードの大半を占めるようなケース。
- 範囲指定
```
....FROM Aviation.Event WHERE EventDate < '2004-05-01'
```
条件で指定した値(この場合は日付)が、Eventテーブル内で初期のものか、終盤のものかによって、対象レコード数が変動するケース。
- 常に真、偽になる条件
```
....FROM log WHERE (1=0 AND ...)
```
クエリツール、BIツールでよく見られるパターン。
[こちら](https://jp.community.intersystems.com/node/510746)に解説記事があります。
## ストレージ使用量の削減
ストリームおよびジャーナルを圧縮することにより、必要なストレージ使用量を大幅に削減しました。
> 高価なストレージ容量削減(特にクラウドでは重要な要素)のメリットは、圧縮・伸張にかかるCPUコスト上昇というデメリットを上回るとの価値判断が根底にあります。
### ストリームの圧縮について
グローバルベースのストリームを使用する際、デフォルトでその内容を圧縮します。既存の未圧縮状態のストリームは、次回の書き込み時に圧縮を行います。アプリケーションの修正は必要ありません。
> 弊社で計測したところ、モダンなH/W環境において、CPU消費は3%程度の上昇で抑えられていました。
実際の顧客データを使用した計測では、小~中サイズのテキストについては30~50%、XML/JSON形式のデータについては60~80%程度の削減効果が観測されました。

### ジャーナルの圧縮について
今までは、オプトインの機能でしたが、デフォルトで有効になりました(無効化することもできます)。
ジャーナルが切り替わった際に、非アクティブなジャーナルファイルを圧縮します。ロールバック、ロールフォワードは、圧縮済みのジャーナルファイルを使用します。
```
irisowner@637fa733ef04:/usr/irissys/mgr/journal$ ll -h
total 359M
drwxrwxr-x 1 irisowner irisowner 4.0K Jun 17 01:09 ./
drwx------ 1 irisowner irisowner 4.0K Jun 17 01:03 ../
-rw-rw---- 1 irisowner irisowner 7.0M Jun 17 01:08 20220617.001z
-rw-rw---- 1 irisowner irisowner 6.8M Jun 17 01:09 20220617.002z
-rw-rw---- 1 irisowner irisowner 6.8M Jun 17 01:09 20220617.003z
-rw-rw---- 1 irisowner irisowner 338M Jun 17 01:09 20220617.004
-rw-rw---- 1 irisowner irisowner 35 Jun 17 01:09 iris.lck
```
ミラージャーナルファイルもプライマリ、バックアップ共に同様に圧縮されます。
```
-rw-rw---- 1 irisowner irisowner 216K Jun 17 01:07 20220617.001z
-rw-rw---- 1 irisowner irisowner 1.3M Jun 17 01:16 MIRROR-MIRRORSET-20220617.001z
-rw-rw---- 1 irisowner irisowner 80K Jun 17 01:16 MIRROR-MIRRORSET-20220617.002z
-rw-rw---- 1 irisowner irisowner 1.0M Jun 17 01:19 MIRROR-MIRRORSET-20220617.003
```
実際の顧客のケースでは、ジャーナルサイズが85%縮小され、信頼性を損なうことなく、EBSストレージ代金を2,000 USドル/月削減出来ました。

> ジャーナルファイルを(AWS S3のような)安価なストレージにアーカイブする機能は今後のリリースで提供予定です。
## オンラインでのShardのリバランス
Shardのリバランスをオンライン状態(ユーザがクエリ実行やデータの追加を継続)で実行できるように強化しました。その結果、Shardクラスタのデータノード追加をオンラインのまま実施出来るようになりました。今までは、一時的にクエリ、データ追加を保留する必要がありました。
>データノードの削除のオンライン化は今後のリリースにて対応予定です。
## TLS 1.3 Support
TLS1.3(OpenSSL 1.1.1)をサポートします。
> TLS1.3は、接続確立時のハンドシェークのやり取りを減らせるなど、より高速であることが知られています。
# 分析と機械学習関連
## SQLローダ
SQLテーブルへの新しいデータローディングの仕組みを提供するために、SQLにLOADコマンドを追加しました。
データソースとしてCSVもしくはJDBCを選択できます。
INSERT文によく似た構文でソースカラム、ターゲットカラムの調整を、IntegrgatedMLのUsingとよく似た構文で、動作の調整(デリミタの指定など)を行うことが出来ます。
```
LOAD DATA FROM FILE 'C://mydata/countries.csv'
COLUMNS (
src_name VARCHAR(50),
src_continent VARCHAR(30),
src_region VARCHAR(30),
src_surface_area INTEGER)
INTO Sample.Countries (Name,SurfaceArea,Region)
VALUES (src_name,src_surface_area,src_region)
USING {"from":{"file":{"columnseparator":";"}}}
```
```
LOAD DATA FROM JDBC CONNECTION MyJDBCConnection
TABLE countries
INTO Sample.Countries
```
紹介記事がありますのでご覧ください。
- [まったく新しい LOAD DATA コマンドのコツとヒント](https://jp.community.intersystems.com/node/516096)
- [まったく新しい LOAD DATA コマンドのコツとヒント - パート II](https://jp.community.intersystems.com/node/516101)
## アダプティブアナリティクス
アダプティブアナリティクス(IRIS+AtScale)に以下の機能が追加されました。
1. アダプティブアナリティクスのクライアントとして、InterSystems Reportsが使用できるようになりました。これにより、PowerBIやTableauと同じデータモデルを使用してInterSystems Reportsを使用できるようになります。
2. InterSystems BI(DeepSee)のデータモデルを、アダプティブアナリティクスの定義としてインポートできるようになりました。
> キューブ間のRelationshipsやデータコネクタのような移行できない機能があります
InterSystems Reportsとは帳票作成エンジンであるZEN Report(既にオブソリート)の後継製品です。下記の紹介記事をご覧ください。
- [InterSystems Reportsでレポートを作成するのは難しいですか?](https://jp.community.intersystems.com/node/501576)
- [コンテナで InterSystems Reports を動かしてみる](https://jp.community.intersystems.com/node/501656)
# クラウド、運用関連
## クラウドコネクタ
クラウド上でのIRISの管理を容易にするために、新たに下記のコネクタ(アダプタ)を提供いたします。
### オブジェクトストレージ
#### プロダクション用途
S3,Azure Blob, Google Cloud Storageの読み書きのためにインバウンド、アウトバウンドアダプタを提供します。
インバウンドアダプタは、指定したパターンに合致するオブジェクト(群)を取得し、ビジネスサービスのコールバック関数に、その内容をストリームとして提供します。
アウトバウンドアダプタはUpload, Deleteを実行可能です。
> アダプタはJava PEXを使用して実装されています。
#### 低レベルなAPI
同等な機能を持つ、低レベルAPIを提供します。
```
Set bucketName = "my-bucket"
Set blobName = "test.txt"
// Cloud Storage Client作成 (クラウドプロバイダの種類は第3引数の内容で判断。この場合はAWS S3用)
Set myClient = ##class(%Net.Cloud.Storage.Client).CreateClient(,0,"C:\Users\irisowner\.aws\config", "ap-northeast-1", .tSC)
If myClient.BucketExists(bucketName){
// S3にファイルをアップロード
Do myClient.UploadBlobFromFile(bucketName, blobName, "c:\temp\test.txt")
// 指定バケット内のオブジェクトを列挙
Set blobs=myClient.ListBlobs(bucketName)
For i=1:1:blobs.Size {
Set blob=blobs.GetAt(i)
w blob.name," ",blob.size," ",blob.updateTime,!
}
}
// clientをclose
Do myClient.Close()
```
詳細は[こちら](https://docs.intersystems.com/iris20221/csp/docbook/DocBook.UI.Page.cls?KEY=ECLOUD_intro)をご覧ください。
### Cloudwatch
Cloudwatchへの出力のための、アウトバウンドアダプタおよびビジネスオペレーションを提供します。下記のaws cliコマンドに相当します。
```
>aws cloudwatch put-metric-data --namespace MyNameSpace --metric-name TestMetric \
--dimensions TestKey=TestValue --value 100
```
Cloudwatchアウトバウンドアダプタ[EnsLib.AmazonCloudWatch.OutboundAdapter](https://docs.intersystems.com/iris20221/csp/documatic/%25CSP.Documatic.cls?&LIBRARY=ENSLIB&CLASSNAME=EnsLib.AmazonCloudWatch.OutboundAdapter)はCloudwatchが公開しているPutMetricData APIを呼び出すために、下記のメソッドを提供しています。
```
Method PutMetricData(namespace As %String, metricName As %String,
metricValue As %Numeric, metricUnit As %String,
dims As %String = "") As %Status
```
ビジネスオペレーションは[EnsLib.AmazonCloudWatch.MetricDataOperation](https://docs.intersystems.com/iris20221/csp/documatic/%25CSP.Documatic.cls?&LIBRARY=ENSLIB&CLASSNAME=EnsLib.AmazonCloudWatch.MetricDataOperation)です。
詳細は[こちら](https://docs.intersystems.com/iris20221/csp/docbook/Doc.View.cls?KEY=AECW)をご覧ください。
> 2022.1ドキュメントより「現在使用できるのはPutMetricDataのみです。PutMetricAlarmは将来インターフェースが変更される可能性があります。」
### SNS(Amazon Simple Notification Service)
SNSへの出力(publish)のための、アウトバウンドアダプタおよびビジネスオペレーションを提供します。下記のaws cliコマンドに相当します。
```
aws sns publish --topic-arn arn:aws:sns:ap-northeast-1:[AWSアカウントID]:my_topic \
--subject "Test mail" --message "Hello World"
```
SNSアウトバウンドアダプタ[EnsLib.AmazonSNS.OutboundAdapter](https://docs.intersystems.com/iris20221/csp/documatic/%25CSP.Documatic.cls?LIBRARY=ENSLIB&CLASSNAME=EnsLib.AmazonSNS.OutboundAdapter)はSNSが公開しているpublish APIを呼び出すために、下記のメソッドを提供しています
```
Set tSC = ..Adapter.Publish(..ARNTopic, request.Message, ..Subject)
```
ビジネスオペレーションは[EnsLib.AmazonSNS.BusinessOperation](https://docs.intersystems.com/iris20221/csp/documatic/%25CSP.Documatic.cls?&LIBRARY=ENSLIB&CLASSNAME=EnsLib.AmazonSNS.BusinessOperation)です。
詳細は[こちら](https://docs.intersystems.com/iris20221/csp/docbook/Doc.View.cls?KEY=EMESSAGE_sns)をご覧ください。
## IKO (InterSystems Kubernetes Operator)
IRISのKubernetesへのデプロイを容易にするために、新たに下記の機能を提供します。
IKOについては[こちら](https://jp.community.intersystems.com/node/499776)をご覧ください。
### SAMおよびIAM
SAM(InterSystems System Alert and Monitoring)およびIAM(InterSystems API Manager)をデプロイ、管理できます。IRISクラスタをスケールさせる(そしてそれらの監視を行う)ことが用意になります。
SAMに関しては、[こちら](https://jp.community.intersystems.com/node/498416)の記事を、IAMに関しては、[こちら](https://jp.community.intersystems.com/node/493416)の記事をごらんください。
### ロックダウンバージョンのIRISおよびWeb Gateway
[ロックダウンバージョン](https://docs.intersystems.com/iris20221/csp/docbook/DocBook.UI.Page.cls?KEY=ADOCK#ADOCK_iris_images_password_lockeddown)のIRISおよびWeb Gatewayをデプロイできます。Web GatewayはNginxもしくはApache版を選択可能です。
ロックダウンバージョンのIRISは、通常版のirisコンテナと下記の点で異なります。
- インストール時のセキュリティレベルでロックダウンを選択してあります
- 組み込みのApacheサーバを起動しません
>ロックダウン、通常版を問わず、2021.2以降のirisコンテナは、安全性強化のために下記変更を行っています。
>インストールユーザ: root → irisowner
>所有、実行ユーザ: root, irisowner, irisuser → irisowner
### 非永続ボリュームおよび永続ボリューム
非永続ボリューム、永続ボリュームいずれへのデプロイが可能です。
# その他
新しくなったTRACEユーティリティを提供します。
実行時のパフォーマンス分析ツールであるMONLBLやPERFMONは、データ取得時に出力(利用)目的を決めておく必要がありました。
TRACEは、ジェネリックなフォーマットでデータを蓄積することで、トレースしたイベントのナビゲーションやサマライズ等の分析操作を、より対話的に行えるようになりました。
サポートされるイベントタイプには、グローバルのSET/KILL、物理書き込み、ネットワーク超えの要求、キャッシュ、ジャーナルイベントなどが含まれます。
> イベントの収集ツールです。収集・蓄積にはオーバヘッドがかかります。蓄積されたデータをExcelなどで加工する必要があります。内容の解釈には専門知識と(公開されていない)ソースコードへのアクセスが必要になる事があるため、弊社のサポートの指導の元ご利用ください。
```
Reading TRACE file C:\InterSystems\IRIS20221\trace\iristrace_16816.txt
0.000000: START
STACK [ 0] X - @ +0
0.000185: MemAlloc
0.000189: CALL
ARG [ 0] STR:app
0.000204: MemAlloc
0.000225: GloRef, ^rOBJ("app")
0.000243: GloRef, ^rOBJ("app")
0.000260: DirBlkBuf, ^rOBJ("app")
0.000273: BpntBlkBuf, ^rOBJ("app")
0.000280: DataBlkBuf, ^rOBJ("app")
0.001557: RtnFetch
0.001569: MemAlloc at ^app
0.001571: RtnLoad ^app
0.001576: RtnLine at +2^app
src: Kill ^a
0.001582: GloRef at +2^app, ^a
```
[APIを使用](https://github.com/IRISMeister/rel-20221/blob/main/src/test.mac)して独自出力を作成することも可能です。