0 フォロワー · 156 投稿

SQLは、リレーショナルデータベースにデータを格納、操作、および取得するための標準言語です。

InterSystems公式 Seisuke Nakahashi · 7月 3, 2023

InterSystems IRIS Cloud SQL は、何千ものエンタープライズのお客様に利用いただいている InterSystems IRIS の優れたリレーショナルデータベース機能を実感いただける、幅広いアプリケーション開発者やデータ専門家のみなさまのためのフルマネージドサービスです。また InterSystems IRIS Cloud IntegratedML は、この DBaaS (Database-as-a-Service) のオプションであり、SQL ネイティブを通じて強力な自動機械学習機能を簡単にご利用いただけるサービスを提供します。シンプルな一連の SQL コマンドは簡単にアプリケーションコードに組み込むことができるため、データに近いところで動作する ML モデルにより、お客様のアプリケーションを拡張することができます。

本日は、これら2製品に関する 開発者アクセスプログラム を発表いたします。アプリケーション開発者は本サービスにみなさまご自身で登録いただくことで、デプロイメントの作成、構成可能なアプリケーションのビルド、そして本サービスによってプロビジョン、構成、システム管理が実行されるスマートデータべースを体験いただけます。

0
0 84
記事 Mihoko Iijima · 6月 29, 2023 3m read

これは InterSystems FAQ サイトの記事です。

LOAD DATAは、バージョン2022.1から追加されたSQLコマンドで、CSVファイルやJDBCソースからデータをテーブルにロードするコマンドです。
データが存在するテーブルにLOAD DATAを実行した場合、データは追記されます。

※ バージョン2022.1をご利用いただく場合は、バージョン2022.1.3 をご利用ください。(2022.1.0~2022.1.2は、使用するJARファイルの不備により動作しません。)

LOAD DATAを利用する際、Javaの外部サーバ(Javaゲートウェイ)を使用するため、IRISをインストールした環境にJavaのインストールが必要です。
サポート対象のJavaバージョンについては、ドキュメントの「サポート対象Javaテクノロジ」をご参照ください。

LOAD DATAを利用するためには、Javaインストール済、かつ外部言語サーバで %Java_Server 設定済の環境である必要があります。

※ 環境変数JAVA_HOMEの設定がある場合は以下 %Java_Serverの設定は不要です。

%Java_Server 設定詳細は以下の通りです。

  • Javaホームディレクトリ:インストールしたJavaのホームディレクトリを指定します。

 

利用手順は以下の通りです。

以下のCSVを読み込む場合の手順を説明します。

0
0 1150
お知らせ Toshihiko Minamoto · 6月 20, 2023

先週の InterSystems Global Summit にて、今年の初めにリリースしました2023.1のエクスペリメンタル機能として、新たな 外部テーブル を発表しました。現在、 外部テーブルの Early Access Program にご参加いただきご評価いただくことで、この機能がお客さまのニーズに合っているか、次に向けてどの機能を優先するべきか、お知らせいただきたいと考えています。

外部テーブルって何なの?
この素晴らしい概要ビデオを見る時間やポップコーンがない場合に備えて、外部テーブルは、ファイルやリモートデータベースなど、物理的に別の場所に保存されているデータをIRIS SQLとしてアクセスするのに役立つ機能です。外部テーブルは、通常のIRISテーブルとしてSQLに表示され、他の通常テーブルや外部テーブルとのJOINなど、あらゆるSQLステートメントで使用することができます。クエリを実行する際、外部テーブルから何を検索する必要があるのかを理解し、そのサーバーがリレーショナルデータベースの場合は、ネットワーク経由で取得するデータを最小限に抑えるようなクエリを出力しています。

0
0 146
質問 Yuji Ohata · 6月 1, 2023

こんにちは、皆さま。
業務でIRISを用いて開発を行っている者です。

IRISにSQLを投げるときの動作について教えてください。

■適当なテーブルを作成
CREATE TABLE Mst.Test (id int, name varchar(10))

■データをINSERT
INSERT INTO Mst.Test VALUES (2, 'bbb ')
※文字列の末尾にスペースを追加。

■SELECT
SELECT * FROM Mst.Test WHERE name = 'bbb'
※whereの条件には末尾のスペースを入れない。

⇒上記の結果、INSERTされたデータがヒットしている。

[疑問点]
SQLの実行において、=を使って完全一致検索をしているつもりなのですが、
末尾のスペースはその条件を無視してヒットしてしまうものなのでしょうか?

何か情報をお持ちの方がいらっしゃれば、フォローいただけますと幸いです。

3
0 244
記事 Toshihiko Minamoto · 5月 2, 2023 5m read

InterSystems 2022.2 では、IRIS SQL テーブルを永続化する新しいオプションとして、分析クエリを桁違いに向上させられるカラムナーストレージを導入しました。 2022.2 と 2022.3 ではこの機能は実験的としてマークされていますが、次の 2023.1 リリースでは、完全にサポートされた本番機能に「卒業」する予定です。 

製品ドキュメントとこの紹介動画では、IRIS では現在でもデフォルトであり、全顧客ベースで使用されている行ストレージと、このカラムナーストレージの違いがすでに説明されており、ユースケースに適切なストレージレイアウトの選択方法に関する大まかなガイダンスが提供されています。 この記事では、このテーマについて詳しく説明し、業界で実践されているモデリング原則、内部テスト、および早期アクセスプログラム参加者からのフィードバックに基づく推奨事項をいくつか紹介します。 

全般的に、IRIS SQL スキーマに適したテーブルレイアウトを選択するためのガイダンスは以下のとおりです。

  1. **EHR、ERP、またはトランザクション処理アプリケーションなど、IRIS SQL またはオブジェクトを利用するアプリケーションをデプロイしている場合は、現在の行ストレージレイアウトをカラムナーストレージレイアウトに変更する必要はありません。**エンドユーザーやプログラムトランザクションに対して発行されるほとんどの SQL クエリは、限られた数の行のみを取得または更新し、結果行は通常テーブルの行に対応しており、集計関数の使用もほんのわずかです。 カラムナーストレージとベクトル化されたクエリ処理から得られるメリットはこのような場合に適用されません。  
  2. **そのようなアプリケーションに運用分析も組み込まれおり、対応する分析クエリの現在のパフォーマンスが満足いくものでなければ、列インデックスの追加を検討してください。**これには、現在のインベントリを表示するダッシュボードやライブデータに関する基本的な財務レポートなどが含まれます。 集計に使用される数値フィールド(数量、通貨など)または範囲条件で使用されるカーディナリティの高いフィールド(タイムスタンプなど)を探します。 そのような可能性を示すのに適した指標は、通常カーディナリティの低いフィールド(カテゴリカルフィールドや順序フィールドなど)で大量の行のフィルタリングを高速化するビットマップインデックスの現在の使用状況です。 これらのビットマップインデックスを置き換える必要はありません。追加の列インデックスはそれらと連携して十分に動作し、マスターマップまたは通常のインデックスマップ(行あたり 1 つの gref)からの過剰な読み取りを回避することが目的です。  
  3. **IRIS SQL テーブルに含まれる行数が 100 万行未満である場合、カラムナーストレージを検討する必要はありません。**具体的な数に固執したくはありませんが、ベクトル化されたクエリ処理のメリットが、これらの低い範囲に影響を及ぼす可能性はありません。  
  4. **IRIS SQL スキーマをデータウェアハウス、ビジネスインテリジェンス、または同様の分析ユースケースにでデプロイしている場合は、カラムナーストレージがデフォルトとなるように変更することを検討してください。**スタースキーマ、スノーフレークスキーマ、またはその他の非正規化されたテーブル構造、およびビットマップインデックスとバッチインジェストの広範な使用は、これらのユースケースが該当することを示しています。 カラムナーストレージのメリットがある分析クエリは、大量の行をスキャンし、それらの値を集計するクエリです。 「カラムナーテーブル」を定義する場合、IRIS は、ストリーム、ロング文字列、またはシリアルフィールドなど、カラムナーストレージに適していないテーブル内の列に行レイアウトを透過的に使用します。 IRIS SQL はこのような混合テーブルレイアウトを完全にサポートしており、クエリプランの適切な部分にベクトル化されたクエリ処理を使用します。 カラムナーテーブルに対するビットマップインデックスの付加価値は限られているため、省略できます。

**環境とデータ関連のパラメーターによって、向上の程度は異なります。 したがって、代表的なセットアップで様々なレイアウトをテストすることを強くお勧めします。**列インデックスは、通常の行編成テーブルに簡単に追加でき、クエリパフォーマンスのメリットについて現実的な見通しを素早く生成することができます。 これは、混合テーブルレイアウトの柔軟性とともに、InterSystems IRIS の重要な差別化要因であり、桁違いのパフォーマンス改善を達成するのに役立ちます。

完全な本番リリースで実際のエクスペリエンスをさらに得るにつれ、これらの推奨事項をより具体化していく予定です。 もちろん、早期アクセスプログラムと POC エンゲージメントでは、お客様の実際のスキーマとワークロードに基づくより具体的なアドバイスを提供できます。お客様とコミュニティメンバーからのフィードバックを楽しみにお待ちしています。 カラムナーストレージは、InterSystems IRIS Advanced Server ライセンスの一部であり、InterSystems IRIS と IRIS for Health の Community Edition でも有効になっています。 完全にスクリプト化されたデモ環境については、こちらの GitHub リポジトリをご覧ください。

1
0 202
記事 Megumi Kakechi · 5月 1, 2023 6m read

IRISTEMPというデータベースをご存じでしょうか?

特定の処理に対してデータを無期限に保存する必要がなく、「同一プロセス内でのみ使用したい場合」や「IRISが起動中のみ使用したい場合」に、IRISTEMPデータベースに保存されるグローバルを使用できます。
IRISTEMPデータベースに保存されるグローバルに対する操作は ”一切ジャーナルされない” ため、効率性を最大限にしたい作業に使用できます。

IRISTEMPデータベースに保存されるグローバル(データ)には、以下の種類があります。

0
1 302
記事 Toshihiko Minamoto · 4月 26, 2023 6m read

Global Summit 2022 または 2022.2 ローンチウェビナーの内容からよく覚えていると思いますが、InterSystems IRIS の分析ソリューションに組み込むための目覚ましい新機能をリリースしようとしています。 分析クエリを桁違いに高速化する、代替の SQL テーブルデータ格納手法であるカラムナー(列指向)ストレージです。 もともと 2022.2 の実験的機能としてリリースされましたが、最新の 2022.3 開発者プレビューには多数の更新が含まれているため、別途ここで簡単に説明したいと思います。

簡単な要約

カラムナーストレージにあまり詳しくない方は、こちらの簡単な紹介動画かこの件に関する GS2022 セッションをご覧ください。 手短に言うと、新しい $vector データ型を用いて、列ごとに 64k チャンクでテーブルデータをエンコーディングしています。 $vector は、疎データと密データの両方を効率的に格納できるように、アダプティブエンコーディングスキームを利用する(現時点では)内部専用のデータ型です。 エンコーディングは、一度に 64k チャンク全体の集計、グループ化、およびフィルタを計算し、可能な場合は SIMD 命令を利用するなどの、一連の専用の $vector 演算にも最適化されています。 

SQL クエリ時に、これらのチャンクに対しても動作するクエリプランを作成して、これらの演算を利用します。想像できるように、従来の行単位での処理に比べ、これによってクエリを実行するための IO の量と ObjectScript 命令の数が大幅に削減されます。 もちろん、行指向における単一値演算に比べれば、個別の IO はより大きく、$vector 演算は多少重くなりますが、非常に大きなメリットがあります。 $vector データを処理し、チャンク全体を一連の高速な個々の演算にプッシュする実行戦略を「ベクトル化された」クエリプランと呼んでいます

とにかく速い

最も重要なのは、すべてが高速化されたことです。 列インデックスに関するオプティマイザの理解が深まったことで、リクエストされたフィールドの一部が列インデックスまたはデータマップに格納されていない場合であっても、より多くのクエリが列インデックスを使用するようになります。 また、多くのケースで列インデックスとビットマップインデックスが組み合わせられるようになります。これは、列インデックスを既存のスキーマに追加することから始める場合に役立ちます。

新しいキットには、いくつかのクエリ処理の機能強化に対する低レベルの $vector 演算の最適化から並列化できるより広範な一連のベクトル化されたクエリプランまで、パフォーマンスを改善する多数の変更がスタック全体に含められています。 INSERT .. SELECT ステートメントなどによる特定のデータ読み込み方法も インデックスの構築にすでに使用しているバッファリングされたモデルを採用し、テーブル全体を非常に高いパフォーマンスで構築できるようになっています。

ベクトル化された JOIN

このリリースで追加された最も注目すべき機能は、ベクトル化の方法による列データの JOIN のサポートです。 2022.2 では、クエリ内で 2 つのテーブルからデータを結合する場合、列編成のデータでも行編成のデータでも機能する堅牢な行単位の JOIN 戦略に頼っていました。 今回は、JOIN の両端が列形式で格納されている場合、新しいカーネル API を使用して、メモリ内で JOIN し、$vector 形式を保持することができるようになっています。 これは最も複雑なクエリであっても完全にベクトル化されたクエリプランにするもう 1 つの重要なステップです。

以下に、新しい関数を利用するクエリの例を示します。前のデモで使用した New York Taxi データセットの自己結合を行っています。

SELECT 
   COUNT(*), 
   MAX(r1.total_amount - r2.total_amount) 
FROM
   NYTaxi.Rides r1, 
   NYTaxi.Rides r2
WHERE 
   r1.DOLocationID = r2.PULocationID 
   AND r1.tpep_dropoff_datetime = r2.tpep_pickup_datetime 
   AND r2.DOLocationID = r1.PULocationID 
   AND r1.passenger_count > 2 
   AND r2.passenger_count > 2

このクエリは、乗客が 2 人を超えるルートのペアを検索します。2 番目のルートが最初のルートが終了する時点で同時刻に開始し、2 番目のルートが最初の開始地点に戻るルートペアです。 非常に有用な分析ではありませんが、このスキーマには実際のテーブルが 1 つしかなく、複合 JOIN キーのお陰で味気なさが少し緩和されています。 このステートメントのクエリプランには、Apply vector operation %VHASH(複合 JOIN キーの作成用)と Read vector-join temp-file A などのスニペットが含まれており、新しいベクトル化された結合が機能していることを示しています。 これは、長めのクエリプランにある小さく些細なもののように聞こえるかもしれませんが、内部では多くのスマートエンジニアリングが伴っています。このようなことをただ許可せず、スキーマレイアウトに厳しい制約を課す一般的なカラムナーデータベースベンダーがかなりの数存在しますので、ぜひ一緒にこれを楽しみましょう! :-)

クエリプランがその一時ファイルの読み取りを続けると、Join 後の作業にまだ行単位の処理が残っていることに気づくかもしれません。そこで...

今後の予定

カラムナーストレージは 2022.3 でも「実験的」となっていますが、本番対応に近づいており、間もなくマルチテーブルクエリ用の完全なエンドツーエンドベクトル化が可能になります(訳注:2023.1では本番用としてリリースされています)。 これには、先ほど述べた JOIN 後の作業、クエリオプティマイザのより幅広いサポート、カラムナーテーブルの読み込みのさらなる高速化、共有メモリサポートなどの JOIN のさらなる機能強化などが含まれます。 要するに、今こそ、2022.3 Community Edition を使用して New York Taxi データセットを試してみる絶好の機会です(現時点では IPM で、または Docker スクリプトを使用)。そうすれば、2023.1 がリリースされる頃には「Run」を押すだけで済みます!

カラムナーストレージを独自のデータとクエリで使用する方法について、より具体的なアドバイスに興味のある方は、私かアカウントチームに直接ご連絡ください。Global Summit 2023 でお会いできるかもしれません ;-)

0
0 199
記事 Megumi Kakechi · 4月 11, 2023 4m read

これは InterSystems FAQ サイトの記事です。
 

Question:

TIMESTAMP型の項目に対して、TO_CHAR() や TO_DATE() を用いた SELECT を実行すると以下のエラーになります。

実行SQL:

select 
  TO_CHAR(xxxDateTime,'YYYY-MM-DD')
from
  Test

エラー:
  [SQLCODE: <-400>:<深刻なエラーが発生しました>]
  [%msg: <Unexpected error occurred: <ZCHAR>IllegalValuePassedToTOCHAR^%qarfunc>]

エラーの原因を教えてください。


Answer:

こちらは、IRIS2022.1以降のバージョンで CREATE TABLE (DDL) の TIMESTAMP 型が IRIS側クラスで %Library.PosixTime にマッピングするように変更されているためです。
(アップグレードした環境の場合は、従来のままの %Library.TimeStamp にマッピングされています)

0
0 1527
記事 Tomoko Furuzono · 4月 11, 2023 3m read

これは、InterSystems FAQサイトの記事です。
データの登録/更新/削除を実行中でも、インデックスを再構築することは可能です。
ただし、再構築中は更新途中の状態で参照されますので、専用ユーティリティを使用することをお勧めします。
手順は以下の通りです。

  1. 追加予定のインデックス名をクエリオプティマイザから隠します。
  2. インデックス定義を追加し、再構築を実施します。
  3. 再構築が完了したら、追加したインデックスをオプティマイザに公開します。

実行例は以下の通りです。
Sample.Person の Home_State(連絡先住所の州情報)カラムに対して標準インデックス HomeStateIdx を定義する目的での例で記載します。 

1、追加予定のインデックス名を Caché のクエリオプティマイザから隠します。

>write $system.SQL.SetMapSelectability("Sample.Person","HomeStateIdx",0)
1

 2、インデックス定義を追加した後、再構築を実施します。
  定義例)Index HomeStateIdx On Home.State;

>do ##class(Sample.Person).%BuildIndices($LB("HomeStateIdx"))


 3、再構築が完了したら、追加したインデックスをオプティマイザに公開します

0
0 514
記事 Mihoko Iijima · 4月 10, 2023 4m read

これは InterSystems FAQ サイトの記事です。

バージョン2017.2以降から、CREATE TABLE文で作成したテーブル定義のデータを格納するグローバル変数の命名ルールが変わり ^EPgS.D8T6.1 のようなハッシュ化したグローバル変数名が設定されます。(この変更はパフォーマンス向上のために追加されました。)

※ バージョン2017.1以前については、永続クラス定義のルールと同一です。詳細は関連記事「永続クラス定義のデータが格納されるグローバル変数名について」をご参照ください。

以下のテーブル定義を作成すると、同名の永続クラス定義が作成されます。

CREATETABLE Test.Product(
    ProductID VARCHAR(10) PRIMARY KEY,
    ProductName VARCHAR(50),
    Price INTEGER
)

 永続クラス:Test.Productの定義は以下の通りです。(パラメータ:USEEXTENTSETに1が設定されます) 

0
0 309
記事 Mihoko Iijima · 4月 4, 2023 7m read

開発者の皆さん、こんにちは。

Python Native APIを利用すると、IRISにあるグローバル変数の参照/更新をPythonから行えたり、メソッドやルーチンをPythonから実行することができます。

この記事では「AWS Lambda の IRIS Python Native API IRIS」の記事を参考に、NativeAPIを利用してPythonからIRISに接続するAWS Lambda関数を作成する流れで必要となる、レイヤー作成と関数用コードの作成例をご紹介します。

※ 事前にAWSのEC2インスタンス(Ubuntu 20.04を選択)にIRISをインストールした環境を用意した状態からの例でご紹介します。

0
0 388
お知らせ Mihoko Iijima · 4月 4, 2023

開発者の皆さん、こんにちは。

技術文書ライティングコンテストの受賞者が発表されたばかりですが、次のコンテスト:InterSystems IRIS Cloud SQL and IntegratedML コンテスト 2023 のテクノロジーボーナス詳細が決定しましたのでお知らせします📣

  • IntegratedML の利用
  • オンラインデモ
  • コミュニティに記事を投稿する
  • コミュニティに2つ目の記事を投稿する
  • YouTubeにビデオを公開する
  • はじめてチャレンジされた方
  • InterSystems Idea 内 Community Opportunityの実装

獲得ポイントについて詳細は、以下ご参照ください。

0
0 115
記事 Megumi Kakechi · 3月 28, 2023 3m read

これは InterSystems FAQ サイトの記事です。
 

テーブル名/カラム名/インデックス名を変更したい場合、以下のケース別に変更方法をご案内します。

A. テーブル名・カラム名の変更
B. インデックス名の変更
 

-------------------------------------------------------------------------
A. テーブル名・カラム名の変更する方法
-------------------------------------------------------------------------

テーブル(クラス)名とカラム(プロパティ)名は基本的には変えないようにしてください。

もし「SQLアクセス時の名前だけ変更したい」場合は、以下のように新しい名前を SqlTableName(テーブル名)、SqlFieldName(カラム名) として指定することができます。

Class User.test Extends%Persistent [ SqlTableName = test2 ] {
    Property p1 As%Integer [ SqlFieldName = xx ];
    ....
0
1 233
お知らせ Mihoko Iijima · 3月 27, 2023

開発者の皆さん、こんにちは!

次のプログラミングコンテストの詳細が決定し「IRIS Cloud SQLのデータを利用してAI/MLソリューションを作成する」がテーマとなりました。

🏆 InterSystems IRIS Cloud SQL and IntegratedML コンテスト 🏆

期間: 2023年4月3日~23日

賞金総額: $13,500

 

0
0 109
記事 Megumi Kakechi · 2月 23, 2023 3m read

弊社サポートセンターに、「IRIS SQLに Oracle の RANK() 関数のようものはありませんか?」というお問い合わせいただくことがあります。

IRIS2021.1以降のバージョンであれば、RANK() や ROW_NUMBER() などの ウィンドウ関数 がサポートされるようになりましたので、以下のように使用することができます。

// RANK() 関数
SELECTRANK() OVER (ORDERBY Age) as Ranking,Name,Age 
FROM Sample.Person 
WHERE Age > 60orderby Age
Ranking Name Age
1 Townsend,Neil W. 61
1 Murray,Terry J. 61
3 Huff,Patrick B. 67
4 Rotterman,Umberto A. 72
5 Quine,Imelda D. 75
6 McCormick,Imelda S. 80
7 Roentgen,Vincent Q. 81
8 Ueckert,Terry Q. 85
9 Perez,Ted P. 97
0
0 285
記事 Mihoko Iijima · 2月 21, 2023 3m read

開発者の皆さん、こんにちは!

開発者向け情報を集めた「Developer Hub」ページが新たに登場しました!

(2025/10/9更新: 新たなチュートリアルが加わりましたので情報更新しました。)

このページには、5種類のチュートリアルが用意されています。チュートリアはブラウザ上で動作し、VSCodeやIRISターミナル、管理ポータルなどチュートリアルで使用するすべての画面が1つのタブ内で開くようになっています。

チュートリアルを試すための事前準備は不要で、クリック1回ですぐにお試しいただけます!(ユーザ登録も不要です)(チュートリアル開始方法は、ページ末尾をご覧ください。)

0
0 335
記事 Mihoko Iijima · 2月 14, 2023 4m read

開発者の皆さん、こんにちは!

InterSystems デベロッパーツールコンテスト2023が開催され、21の応募作品の中から勝者が発表されました🏆

この記事では、世界のIRIS開発者の皆さんから注目を集めた作品をご紹介します。

最初は、Experts Nomination 第1位に輝いた @Dmitry Maslennikov さんの作品をご紹介します!

@Dmitry Maslennikov さんが解説されている記事(Welcome irissqlcli - advanced terminal for IRIS SQL)もあります。ぜひこちらもご覧ください。

@Dmitry Maslennikov さんは、IRIS SQL用の高度なターミナル irissqlcli を開発されました。

irissqlcli を使用すると、SQL記述時にSQL構文、関数、型、IRIS内テーブル名、カラム名に対する候補が表示されるため、SQL文がとても書きやすくなります。

ヘルプも充実しています。(\n でヘルプが表示されます)

接続先のテーブル一覧を取得する場合は「.tables」で取得できました。

また、以下のように記入時に入力候補が表示されます。Pygments を利用されているようで、シンタックスがハイライトされてきれいです。

0
0 193
記事 Megumi Kakechi · 2月 12, 2023 3m read

これは InterSystems FAQ サイトの記事です。
 

日時検索で、TimeStamp型のクエリのパフォーマンスが出ない場合の対処法をご紹介します。

%TimeStamp データ型形式 (yyyy-mm-dd hh:mm:ss.ffff)は、人が読めることを目的とした ODBC 日付形式の文字列として格納されます。
そのため、どうしてもデータサイズが大きくなりクエリの実行に時間がかかってしまいます。
%TimeStamp型のプロパティにインデックスを作成している場合にも、クエリオプティマイザはそのインデックスを優先して最適化するようにはなっておりません。

IRISでは、POSIX 時刻(※)をサポートしているため、TimeStamp値を表すのに %Library.PosixTime データ型形式を使用できます。
こちらは、Integer型で保存され、%Timestampの高性能な代替法となります。

※POSIX 時間は、協定世界時 (UTC) 1970年1月1日 00:00:00(UNIXエポック)からの経過秒数として表されます。
 1970-01-01 00:00:00より前の日付は、負の論理値で表されます。

0
1 442
記事 Toshihiko Minamoto · 2月 8, 2023 7m read

InterSystems IRIS 2020.1 には、重要なアプリケーションの構築を支援する新機能と機能改善が多数盛り込まれています。 2019.1 から 2020.1 までに行われた多数の大幅なパフォーマンス改善のほかに、最近の SQL の歴史において最も大きな変更点の 1 つであるユニバーサルクエリキャッシュ(UQC)が導入されています。 この記事では、SQL ベースのアプリケーションに対するそのインパクトについて、技術的な観点で詳しく説明しています。

UQC とは?

スクラブルで頭字語として使用されればゲームチェンジャーとなる可能性もあるでしょうが、ユニバーサルクエリキャッシュは、あらゆる種類の SQL ステートメントを単一のキャッシュで管理することで、ボード全体の SQL 操作を単純化することを目的としています。 これまでは、動的 SQL%SQL.Statementインフラストラクチャを使用)や JDBC 、 ODBC にて発行されるステートメントは、Prepare 時に キャッシュドクエリとして最適化されたコードにコンパイルされていました。 一方、埋め込み SQL を使用する場合(&SQL() 構文を使用)、クエリを実行するコードはインラインで生成され、アプリケーションの一部となっていました。 このため、埋め込み SQL は、IRIS がサポートする他のすべての形態の SQL クエリとは非常に異なって処理されていました。

キャッシュドクエリクラスは、ステートメントを発行したコードから独立しており、新しいインデックスの追加やアップグレードの後に、更新されたテーブルの統計に基づいてより効率的なアクセスパスを得るなどのために、必要に応じてパージしたり生成し直したりすることが可能です(アップグレード時に凍結されたクエリプランの注意事項もご覧ください)。 一方、埋め込み SQL は静的であり、新しいテーブル統計とインデックスを自動的に利用することができませんでした。

2020.1 では、ユニバーサルクエリキャッシュの導入により、埋め込み SQL にもキャッシュ済みクエリクラスを生成できるようになり、このコードをアプリケーションロジックを保持するクラスに混在させることがなくなりました。 最も重要なメリットは、埋め込み SQL では、より新しいテーブル統計または新しいインデックスを利用するために、ソースクラスを再コンパイルする必要がなくなったことです。 UQC で参照されているテーブルが更新されると、新しいキャッシュ済みクエリクラスが自動的に生成されるため、生成可能な最も効率の良いコードが確実に実行されます。 埋め込み SQL をクラスに生成すると、他のすべてのクエリが既に使用しているより高速なカーソル変数ストレージを利用できます。 つまり、膨大な作業を行うクエリが以前よりも速く実行されるということです。 また、UQC によって、クラスのコンパイル順の管理において管理者を悩ませることの多かったクラス間の SQL 依存関係がすべて取り除かれます。

これによって作業が大きく変わります。多大な労力をつぎ込んで、「想像力に溢れる」セットアップに対応するために大規模なテストを行ってはいるものの(デプロイ済みのコード、アプリケーションコード内でのネームスペースの切り替えなど)、その想像を超えるセットアップがまだまだ存在するかもしれません。 そのため、埋め込み SQL を大量に(そして創造性豊かに)使用しているアプリケーションを 2020.1 にアップグレードする際には、特に注意してください。また、通常と異なることに気づいた場合は、WRC までご連絡ください。

埋め込み SQL と動的 SQL は 1 つに統一されたのですか?

動的 SQL と埋め込み SQL の使用方法については、現在でもセマンティックがある程度異なっています。 埋め込み SQL は名前付きカーソルを操作しますが、これは動的 SQL のクエリに対する実際のオブジェクトハンドルを操作するよりも少し扱いにくいものです。 ただし、これは個人の好みに大きく左右される問題であるため、明らかに、楽しむためだけに、あるフレーバーから別のフレーバーにアプリケーションを書き直す理由はありません。

パフォーマンスについては、埋め込み SQL には動的 SQL よりも高速だという評判がありましたが、ここ数年におけるコード生成とオブジェクト処理の改善により、その差はほとんどなくなっています。 とは言え、埋め込み SQL のカーソルの値は変数に直接取得することが可能であるため、動的 SQL の相当するオブジェクトプロパティを通じて値にアクセスするよりも、わずかに高速ではあります。 したがって、確かにより高速ではありますが、その差はほんのわずかであるため、多くの場合、(主観的に!)開発の利便性を上回ることはありません。

但し書き

UQC の導入により、2020.1 の埋め込み SQL に、同じルーチンまたはクラスのコンテキストにとどまるのではなく、キャッシュ済みクエリオブジェクト内の別のクラスメソッドをバックグラウンドで呼び出してクエリを実行するという、以前にはなかった非常に小さくも固定されたオーバーヘッドが存在するようになりました。 キャッシュ済みのクエリコードの生成とコンパイルにおける作業は、以前は、&SQL() コンストラクトを含むクラスまたはルーチンのコンパイルの一環でしたが、現在は、動的 SQL と同様に、またより現実的なテーブル統計を利用して、クエリが初めて呼び出されるときに行われるようになっています。 開発者は、新しい /compileembedded=1 コンパイルフラグを使って埋め込み SQL を強制的にコンパイルできます。

これとは別に、生成されたキャッシュ済みのクエリコードで高速な i%var アクセスを使用してカーソルの状態情報を保持するのには様々なメリットがあり、ほとんどの重要なクエリで固定オーバーヘッドが相殺され、実際に埋め込み SQL が以前のバージョンよりも高速になります。 パフォーマンスが低下する可能性があるのは、2019.4 に比べれば、ほんの少数のステートメント(非常に単純な INSERT など)です。 独自に行った実験では、そのような単純なクエリでは約 6%、複雑なクエリでは 3% のパフォーマンスの_増加_が見られました。

一方で、2019.4 より前のバージョンからアップグレードするユーザーは、パフォーマンスの_改善_以外は、何も感じられない可能性があります。 2019.1 から 2019.4 までは、SQL とカーネルレイヤーにおいて、UQC で導入される小さな固定オーバーヘッドをはるかに上回る他のパフォーマンス改善が多数行われているためです。 これらの多数の変更点の概要については、こちらの GS セッション録画をご覧ください。

まとめ

簡単に言えば、ユニバーサルクエリキャッシュによって、最新の統計と利用可能なインデックスを考慮するようにクエリプランが素早く確実に更新されるため、DBA の業務がより楽になります。 特に、SQL アプリケーションを別のお客様環境にデプロイする場合には、一番ピッタリな SQLを開発者が自由に選択できる重要な機能強化と言えます。

この記事は、@Mark.Hansonと@ Tom.Woodfin からいただいた貴重な貢献に基づいています

0
0 144
記事 Megumi Kakechi · 2月 2, 2023 2m read

これは InterSystems FAQ サイトの記事です。
 

クエリパフォーマンスを最適化するための方法の一つとして、クエリ単位またはシステム全体でクエリの並列処理を使用することができます(標準機能)。

こちらは、特定のクエリに対しマルチプロセッサシステムでクエリの実行をプロセッサ間で分割して行うものです。
並列処理の効果が得られる可能性がある場合のみ、クエリオプティマイザは並列処理を実行します。
並列処理の対象はSELECT文のみとなります。

なお、並列プロセスの数は、CPUの数に応じて自動で調整するため、数の指定は行えません。
現在のシステムのプロセッサ数は以下のコマンドで確認することができます。

USER>write$SYSTEM.Util.NumberOfCPUs()
8

以前は、クエリに %PARALLEL キーワードを付与することで並列処理が有効となっておりましたが、IRIS2019.1以降のバージョンより既定で「常時有効」となりました。

管理ポータル:
  システム管理 > 構成 > SQLとオブジェクトの設定 > SQL
    単一プロセス内でクエリを実行
    ※チェックを入れると並列処理は行わない(既定はチェックなし)


クエリ単位で並列処理を行わないようにする場合は、%NOPARALLEL キーワードを指定します。

0
0 269
記事 Toshihiko Minamoto · 12月 8, 2022 5m read

一意のインデックスにまつわる興味深いパターンが最近持ちあがったので(isc.rest に関する内部ディスカッション)、コミュニティ向けに強調したいと思います。

動機付けのユースケースとして: ツリーを表すクラスがあるとします。各ノードには名前があるため、名前と親ノードでノードを一意にしたいと考えています。 各ルートノードにも一意の名前を持たせます。 この場合の自然な実装は以下のようになります。

Class DC.Demo.Node Extends%Persistent
{

Property Parent As DC.Demo.Node;Property Name As%String [ Required ];
Index ParentAndName On (Parent, Name) [ Unique ];
Storage Default
{
<Data name="NodeDefaultData">
<Value name="1">
<Value>%%CLASSNAME</Value>
</Value>
<Value name="2">
<Value>Parent
</Value>
<Value name="3">
<Value>Name
</Value>
</Data>
<DataLocation>^DC.Demo.NodeD</DataLocation>
<DefaultData>NodeDefaultData</DefaultData>
<IdLocation>^DC.Demo.NodeD</IdLocation>
<IndexLocation>^DC.Demo.NodeI</IndexLocation>
<StreamLocation>^DC.Demo.NodeS</StreamLocation>
<Type>%Storage.Persistent</Type>
}

}

以上です!

ただし、落とし穴があります。現状のこの実装では、複数のルートノードに同じ名前を付けることができます。 なぜでしょうか? Parent は必須プロパティでない(また、そうすべきではない)ため、IRIS は null を一意のインデックスの個別の値として処理しないからです。 一部のデータベース(SQL Server など)はそうしていますが、SQL 標準では、それらが誤っていると述べています(出典が必要です。このことについては StackOverflow のどこかで見かけましたが、それは出典になりません。以下にある、これについてとインデックスと制約の違いについての @Dan Pasco のコメントをご覧ください)。

これを回避する方法は、参照されたプロパティが null である場合に、非 null 値に設定される計算プロパティを定義し、そのプロパティに一意のインデックスを設定することです。 以下に、例を示します。

Property Parent As DC.Demo.Node;Property Name As%String [ Required ];Property ParentOrNUL As%String [ Calculated, Required, SqlComputeCode = {Set {*} = $Case({Parent},"":$c(0),:{Parent})}, SqlComputed ];
Index ParentAndName On (ParentOrNUL, Name) [ Unique ];

これにより、$c(0) を ParentAndNameOpen/Delete/Exists に渡して、親(存在しない)と名前でルートノードを一意に識別することもできます。

この動作が非常に役立つ動機付けの例として、https://github.com/intersystems/isc-rest/blob/main/cls/_pkg/isc/rest/resourceMap.cls をご覧ください。 多くの行は、2 つのフィールド(DispatchOrResourceClass と ResourceName)に対して同じセットの値を持つことができますが、最大でもその内 1 つを「デフォルト」として扱いたいと考えており、一意のインデックスはこれを行う上で最適です。「デフォルト」フラグを 1 または null に設定できると言う場合は、フラグと他の 2 つのフィールドに一意のインデックスを付けることができます。


@Dan Pasco さんのコメント

Nullや一意制約について、私の意見と、可能性のあるいくつかの事実を記載します。

IRISユニークインデックス - これは単なるインデックスだけでなく、インデックスキーに一意性制約を定義する構文的なショートカットです。多くのSQLの実装は、この2つの概念を融合せず、SQL標準はインデックスを定義していません。標準SQLは一意制約を定義しています。IDKEYとPRIMARYKEYの両方が一意制約の修飾子であることに留意してください(そして、我々の世界では、IDKEYとして定義されたインデックスもまた特別なものである)。IDKEYとしてフラグが立てられたインデックスとPRIMARYKEYとしてフラグが立てられたインデックスは、最大で1つずつ存在することができます。インデックスはPRIMARYKEYとIDKEYの両方になることができます。

かつて、"ユニークインデックス "と "ユニーク制約 "の構文を異なる規則で定義したSQL実装がありました。両者の違いは単純で、インデックスが完全に入力されていない場合(テーブルのすべての行がインデックスに表示されていない場合、これを条件付きインデックスと呼びます)、一意インデックスはインデックスで表される行の一意性をチェックするだけです。一意制約はすべての行に適用されます。

また、インデックスは、クエリのサブセットのパフォーマンスを向上させるという、唯一の目的のために存在することに留意してください。どのようなSQL制約もクエリとして表現することができます。

標準SQLは、NULLの動作に関して、少し一貫性がありません。フレームワークのドキュメントでは、次のように定義されています。

一意制約とは、テーブルの1つまたは複数の列を一意列として指定するものです。一意制約は、テーブル内の2つの行が一意列の同じ非NULL値を持たない場合にのみ満たされます。

基本文書では、F291とF292という2つのオプション機能があります。これらの機能は、ユニークな述語(291)とユニークなNULL処理(292)を定義しています。これらの機能は、ユーザがNULLの "区別性 "を定義できる構文を提供するように見えます。どちらもオプションの機能で、比較的最近(2003年?2008年?)のものです。これらの機能がサポートされていない場合のルールは、実装者に委ねられています。

IRISは、フレームワーク文書ステートメントと一致しており、すべての制約は、NULLでないキーにのみ適用されます。「NULL」キーは、すべてのキーカラム値がNULLであるキーと認識されます。

0
0 314
記事 Megumi Kakechi · 11月 28, 2022 2m read

Question:

IRISでは、PostgreSQLやMySQLで使うことができる、開始位置や取得件数を指定する LIMIT句やOFFSET句をサポートしているでしょうか?


Answer:

※2025/4/17更新:IRIS2025.1 以降のバージョンでは、LIMIT/OFFSET句をサポートするようになりました。ご参考

残念ながらサポートしていません。
ただ、代わりに使える同様の方法がありますのでご紹介します。

以下のようなSQLクエリをIRIS SQLで行うとします。

SELECT *
  FROM Sample.Person
ORDER BY Name
 LIMIT 3 OFFSET 5


---------------------------------------------------------------------------------
1. サブクエリとビュー ID (%VID)を使用する方法
---------------------------------------------------------------------------------

IRISでは、ビューまたは FROM 節のサブクエリで返される各行に整数のビュー ID (%VID) を割り当てることができます。
%VIDを使用すると、以下のサンプルのようにして同様のことが実現できます。
※%vidについて

0
0 363
質問 Yuji Ohata · 10月 24, 2022

こんにちは、皆さま。
業務でIRISを用いて開発を行っている者です。

SQLの実行結果について、意図せぬ結果になるものが二点ありますので、
利用方法等に誤りがないかを確認させてください。


CREATE TABLE Tmp.AAA AS SELECT * FROM Mst.AAA WHERE column = ?
⇒管理ポータルで実行しても、?パラメータを置換するダイアログが表示されず、
 オンコードで%Execute()しても実行エラーになる。

★この構文では?パラメータは利用できないのでしょうか?


SELECT * FROM Mst.AAA WHERE column IS NULL
⇒IS NULLではヒットせず、= NULLだとヒットする。
 
 

 ★IRISとして、IS NULLと= NULLに動作差異があるのは何故でしょうか?

すいませんが、情報をお持ちの方がいらっしゃればご教示いただけますと幸いです。

8
1 355
記事 Megumi Kakechi · 9月 21, 2022 2m read

SQL ゲートウェイ接続を使用した、外部データベースへのアクセス方法についてご説明します。

手順は以下になります。
 

1. 外部ソースへの SQL ゲートウェイ接続の作成を行います

※こちらの例では、IRISの別インスタンスへの接続を試しています。 
※ODBCを使用される場合は、事前に
システムDSN(64bit)の準備が必要です。
管理ポータルより
 [システム管理] > [構成] > [接続性] > [SQLゲートウェイ接続] の 新規接続作成 ボタンをクリックします。

接続の種類を選択し、必要項目を設定します。以下のサンプルは、ODBC接続(別IRISインスタンスのDSN設定)を行っています。

     

※ODBC/JDBC 各接続定義の作成の詳細は、以下のドキュメントをご覧ください。
 JDBC 経由での SQL ゲートウェイへの接続
 ODBC 経由での SQL ゲートウェイへの接続

2. リンクテーブルウィザードを使用して、1で作成したSQLゲートウェイ接続に対してリンクテーブルを作成します

管理ポータルより
 [システムエクスプローラ] > [SQL] ページより、
  [ウィザード] > [リンクテーブル] をクリックしリンクテーブルウィザードを開きます。

 手順に従ってリンクテーブルを作成します。

0
0 616
記事 Toshihiko Minamoto · 8月 25, 2022 2m read

その昔、クラス/テーブルのデータ、ストリーム、インデックスのサイズを判断するのは簡単なことでした。%GSIZE を実行して、D、S、I グローバルをそれぞれ確認するだけで済みました。

ところが最近では、シャーディングや、最適化されたグローバル名、分離されたグローバルのインデックスでは以下のような %GSIZE 出力が生成されます。

            Global Size Display of /irissys/data/IRIS/mgr/irisshard/
                              1:35 PM  Dec 02 2020

          IRIS.Msg       1     IRIS.MsgNames       1     IRIS.SM.Shard       1
       IS.DGoWeK.1   24359       IS.DGoWeK.2       3       IS.DGoWeK.3    2810
       IS.DGoWeK.4    2542        IS.V0Zli.1     373        IS.V0Zli.2       2
        IS.k22Ht.1  238028        IS.k22Ht.2       3        IS.k22Ht.3   25819
        IS.k22Ht.4    7426       ISC.Src.Jrn       1           ROUTINE       1
           oddBIND       1            oddCOM       1            oddDEF       1
            oddDEP       1            oddEXT       1           oddEXTR       1
            oddMAP       1           oddMETA       1            oddPKG       1
           oddPROC       1        oddPROJECT       1            oddSQL       1
 oddStudioDocument       1     oddStudioMenu       1           oddTSQL       1
            oddXML       1           rBACKUP       1              rINC       1
          rINCSAVE       1            rINDEX       1       rINDEXCLASS       1
         rINDEXEXT       7         rINDEXSQL       1              rMAC       1
          rMACSAVE       1              rMAP       1              rOBJ       1

      TOTAL:  301403

もちろん、ストレージ定義を追ってこれをデコードすれば、容量がなくなっていることを理解することは可能ですが、以前ほど明確ではなくなっています。

クラス、そのサイズ、および関数に関連するグローバルを示すカスタム tvf を ClassSize クエリしましょう。

これは以下の 2 つの引数で呼び出します。

  • package - 永続クラスを検索する場所
  • fast - true の場合は割り当てられた空間のみを返します。

シャーディングされたクラスとシャーディングされてないクラスが組み合わされている場合には、以下のように表示されます。

現在のところ、シャードクラスでは、現在のシャードに関する情報のみが返されるという制限があります。

0
0 302
記事 Megumi Kakechi · 6月 29, 2022 1m read

これは InterSystems FAQ サイトの記事です。

デフォルトではテーブルのカラムの順番はシステムが自動的に決定します。

順番を変更するにはクラス定義を行う際にプロパティ・キーワード SqlColumnNumber でプロパティ毎に明示的に順番を設定してください。

例:

Property Name As %String [SqlColumnNumber = 2];


ドキュメントは以下をご参照ください。

SqlColumnNumber


なお、SQLテーブル名を変えたい場合は SqlTableName 、カラム名(フィールド名)を変えたい場合は SqlFieldName を指定します。

ともに、永続クラスのみに適用されます。

0
0 165
記事 Mihoko Iijima · 6月 28, 2022 5m read

開発者の皆さん、こんにちは!

この記事では、Embedded Pythonをご自身の好きなタイミングで学習できる📚セルフラーニングビデオ📚の YouTube プレイリストをご紹介します!

👆こんな具合に👆学習内容別 Embedded Python セルフラーニングビデオを公開しています!

この記事では、これから Embedded Python でプログラミングを開始してみたい方向けに最適なビデオをご紹介します!
​​​​​​

◆ Embedded Python概要から学習を始めたい方はこちら👇

以下の内容を確認できるプレイリスト:1-Embedded Python概要編 - YouTube をご用意しています。

  • Embedded Pythonとは?
  • Python開発者から見た使い道(解説&実演)
  • IRIS開発者からみた使い道(解説&実演)

この後、実際の操作を試されたい場合は、次のプレイリスト:2-Embedded Python利用前の準備 - YouTube が最適です。

◆ Embedded Python利用前の準備 を知りたい方はこちら👇

操作を開始する前に、必要な利用前の準備についてご紹介しているプレイリスト:2-Embedded Python利用前の準備 - YouTube をご用意しています。

0
0 803
記事 Toshihiko Minamoto · 6月 21, 2022 3m read

@Yuri Marx のお陰で、非常に優れた Postgres から IRIS へのデータベース移行の例を確認できました。
私の個人的な問題は、DBeaver を移行ツールとして使用することです。
特に、以前の IRIS(それから Caché)の強みの 1 つは、JBDC または ODBC でアクセスできる限り任意の外部 Db にアクセスできる SQLgateways を利用できることであったためです。 そこで、これを実演するために、パッケージを拡張しました。

完全な Docker を含む従来型の OEX パッケージです。
SQLgateway は Docker ビルド中にインストールされ、必要な Linux 用の jdvcdriver はこのリポジトリに含まれています。このデモを高速化するために、移行するテーブルのサイズは少しばかり縮小されています。 

テスト方法

すべての移行アクションは、SMP から直接実行可能です。

1.   
以下の場所でゲートウェイ接続を確認します。 SMP > 管理 > 構成 > 接続 > SqlGateway_Configuration

接続をテストするには[編集]をクリックします。

 

そして[接続テスト]をクリックします。

 

  • 接続成功」を確認します。
  • ここでは、しばらくお待ちください。 Postgres コンテナが応答するまでに、かなり時間がかかることがあります。    
    • しばらくしてから、ブラウザのページを再読み込みし、もう一度テストしてください。     
  1. ソーステーブルを識別します。 SMP でネームスペースを USER に変更し、 SMP > エクスプローラー > SQL > ウィザード > データ移行 に進みます。

3.     
必要なインポートパラメーターを設定します。
 

  • 指定ネームスペース
    • Type = TABLE
    • Gateway = postgres >>> 最初の接続が確定されたら、以下のように選択します。
    • Schema = public
    • Tables to migrate = all         

4.      
ターゲットを特定しますが、スキーマが OEX 互換となるように、public から dc_public に変更します。
-
すべて変更を忘れずにクリックしてください。

  • 両サイドが選択されるように Definitions と Data を移行します。       

5.        
特殊設定を省略し、デフォルトを使用します。タスクをバックグラウンドで起動します。
    

6.     
結果を確認し、エラーなくすべてが機能していることを確認します。

  • テーブルが、まだ移行されていないコンテンツに依存している場合は、エラーが表示される場合があります。       
    • ステータスに完了が表示されるまで待ちます。     

7.     
移行ウィザードを終了し、*dc **でフィルタリングした通常のテーブルビューに戻ります。
- 全 8 つのテーブルが表示され、意味のある列が表示されます。
 

8.             
テーブルを選択して OpenTable をクリックすると、合理的なコンテンツが表示されます。

       

9.    
生成された関連する Class Definitions を見ると、結果と、正常に完了したことを確認できます。          

0
0 343
お知らせ Mihoko Iijima · 5月 29, 2022

開発者のみなさん、こんにちは!

2022年3月9日開催「InterSystems Japan Virtual Summit 2022」のセッション「SQLでどこまでできる? ~データロードから機械学習まで~」のアーカイブを YouTube に公開いたしました。

(プレイリストはこちら


データベースのテーブルにアクセスするためにSQLを利用するのは「ご飯を食べるときは箸を使います」と同じぐらい開発者にとって当たり前のことだと思いますが、SQLで分析や機械学習まで行えたらどうでしょうか。

便利ですよね?

本セッションではInterSystems IRISのSQLを使って、どこまでの操作ができるのかについて、デモを交えながらご紹介します。

ぜひ、動画をご参照ください。

<iframe width="521" height="293" src="https://www.youtube.com/embed/H4D4tUNQSnw" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

【目次】

00:44 貯めたデータの使い道

02:39 分析(Window)関数を新たに追加された便利な SQL コマンドについて

03:59 分析(Window)関数のデモ

11:07 SQL に似た文法で機械学習ができる機能のご紹介

14:58 モデル作成・学習・検証・予測の構文紹介

16:31 Integrated ML のデモ

19:40 Interoperability(相互運用性機能)を利用した検証結果の通知例ご紹介

23:24 検証結果の通知例 デモ

27:37 まとめ
 ご参考:Embedded Python で広がる InterSystems IRIS の世界(2022年3月9日開催)

0
0 157
記事 Toshihiko Minamoto · 5月 10, 2022 4m read

最近、LOAD DATA という素晴らしい新機能を使用することがありました。この記事では、初めて使用した際の体験についてお話しします。 以下の箇条書きには優先順がなく、他の評価も含まれません。 これらは、LOAD DATA コマンドを使用したときに私が気付いたことを記したものです。 また、プレビューリリースである IRIS バージョン 2021.2.0.617 を使用していることも記しておきたいと思います。 そのため、ここに記録されたことは、それ以降の IRIS バージョンに適用しない可能性があります。 それでも誰かのお役に立てるかもしれません。

1)ファイルパスはサーバー側

JDBC 経由で最初のテストを行いました。 最初に躓いたのは、ファイルとファイルパスが、当然 (^-)_ サーバー側でなければならないということです! JDBC ドライバーはクライアント側でこれを処理しません。 おそらく明確なことかもしれませんが、最初にこのことを考慮していませんでした。

2)ファイル接尾辞は関係なし

ドキュメントには、以下のように書かれています。

ファイル名には .txt または .csv(カンマ区切り値)の接尾辞が含まれていること。

私の観察では、この動作は書かれていることと異なりました。 接尾辞は無関係です。

3)ドキュメントを読もう! エラー行はどこへ?

データファイルを読み込む際に、行を間違ってしまいました。 行に問題がある場合、その行は無視されます。 これは、バックグラウンドでサイレントに処理されるため、手放しではクライアントには通知されません。 https://https//youtu.be/jm7bDK0FoiI を見た後に、問題の詳細を表示するには、%SQL_Diag.Result and %SQL_Diag.Message を確認しなければならないことに気づきました。 また、この動作は、次のページにもすでに説明されていたことに気づきました。https://docs.intersystems.com/iris20212/csp/docbook/DocBook.UI.Page.cls?KEY=RSQL_loaddata ... つまり、マニュアルを読めということですね (^_-)

表示例を以下に示します。

SELECT * FROM %SQL_Diag.Result ORDER BY createTime DESC

読み込みの errorCount 列を確認しましょう。

%SQL_Diag.Message で(行の)詳細を確認できます。

SELECT * FROM %SQL_Diag.Message ORDER BY messageTime DESC

特定の diagResult に絞り込むことができます(%SQL_Diag.Result.ID = %SQL_Diag.Message.diagResult)。

SELECT * FROM %SQL_Diag.Message
WHERE diagResult=4
ORDER BY messageTime DESC

 

4)$SYSTEM.SQL.Schema.ImportDDL は LOAD DATA 未対応

私の Openflights Dataset サンプルアプリでは、LOAD DATA ですべての外部ファイルの読み込みを試してみました。 ステートメントは、私も以前にテーブルを作成したことのあるテキスト(sql)ファイル内にバンドルされています。

$SYSTEM.SQL.Schema.ImportDDL では、読み込めないことがわかりました。

ちなみに、ImportDDL のドキュメントには、すべての SQL ステートメントに対応しているわけではないことが書かれています。 このページには、ほんの一部の SQL ステートメントが記載されています。
残念ながら、LOAD DATA はこのリストに含まれていません。ちなみに USE DATABASE についても残念ながら未対応です。

5)Unicode 処理には設定を変更

読み込み中のデータエンコードの問題を回避するには、%Java Server を次のように設定してください。-Dfile.encoding=UTF-8
詳細については、こちらの記事をご覧ください。 この問題は、次の IRIS リリースでは解消されているでしょう。

6)読み込みがエラーで停止。でもデータは読み込み済み

JDBC でデータを読み込むと、%qparsets エラーで停止します。 エラーは次のように表示されます。

Error: [SQLCODE: <-400>:<Fatal error occurred>]
[Error: <<UNDEFINED>zExecute+83^%sqlcq.OPENFLIGHTS.cls10.1 *%qparsets>]
[Location: <ServerLoop>]

でも心配はいりません。それでもデータは読み込まれています (^-^)  詳細については、こちらの記事をご覧ください。
この問題は、次の IRIS リリースでは解消されているでしょう。

Andreas

0
0 353