0 フォロワー · 163 投稿

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

記事 Toshihiko Minamoto · 5月 18, 2021 12m read

第2部: インデックス処理

クラスにどのようなインデックスが必要であるのか、それをどのように定義するのかについて理解できたので、 次に、どのように処理するのかについて確認しましょう。

クエリプラン

注意: クラスに変更を適用する場合と同様に、ライブシステムにインデックスを追加する場合にもリスクが伴います。インデックスが入力されているときに、ユーザーがデータにアクセスしたり更新したりすると、クエリ結果が空になったり誤った結果が生じることがあります。また、構築中のインデックスが破損する場合もあります。 ライブシステムでインデックスを定義したり使用したりするには追加の手順があり、それについてはこのセクションで触れていますが、詳細はドキュメントに記載されています。)

新しいインデックスの準備ができたら、SQLオプティマイザが、クエリを実行する上で最も効率的に読み取れるインデックスであると判断するかどうかを確認できます。 プランを確認するために実際にクエリを実行する必要はありません。 クエリがあれば、プランをプログラムで確認することができます。

            Set query = 1

     Set query(1) = “SELECT SSN,Name FROM Sample.Person WHERE Office_State = 'MA'”

0
0 385
記事 Toshihiko Minamoto · 5月 12, 2021 12m read

これは、SQLインデックスに関する2部構成の記事の前半です。

第1部 - インデックスを理解する

インデックスとは?

最後に図書館に行った時のことを思い出してください。 通常そこには、分野別(そして作者順と題名順)に整理された本が並び、それぞれの棚には、本の分野を説明したコードが記載された本立てがあります。 特定の分野の本を収集する場合、すべての通路を歩いて一冊ずつ本の表紙を読む代わりに、目的の分野の本棚に直接向かって選ぶことができるでしょう。

SQLインデックスにもこれと同じ機能があります。テーブルの各行にフィールドの値へのクイック参照を提供することで、パフォーマンスを向上させています。

インデックスの設定は、最適なSQLパフォーマンスを得られるようにクラスを準備する際の主なステップの1つです。

この記事では、次のことについて説明します。

  1. インデックスとは何か。いつ、なぜそれを使用するか。
  2. どのようなインデックスが存在するか、どのようなシナリオに適しているのか。
  3. インデックスの例
  4. 作成方法
  • インデックスが存在する場合、どのように扱うのか。
  • この記事では、Sampleスキーマのクラスを参照します。 このスキーマは以下に示すGitHubリポジトリにあります。また、CachéとEnsembleでインストールされるSamplesネームスペースでも提供されています。

    0
    0 612
    記事 Mihoko Iijima · 4月 15, 2021 2m read

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

    このエラーが発生する原因としては、アプリケーションの中で既に他のプロセスからロック対象リソースがロックされていて、何らかの理由でそのロックが解放されていないケースが考えられます。

    他のプロセスがロックしている兆候がない場合は、ロックテーブルの空き領域が不足しているケースが想定されます。
    その場合は、メッセージログ(コンソールログ)に LOCK TABLE FULL のメッセージが出力されます。

    トランザクション処理を行なっている場合には、ロック解放の延期が影響しているケースも考えられます。
    トランザクションとロック解放の延期については、以下のドキュメントをご参照下さい。

    ドランザクション処理について【IRIS】

    ドランザクション処理について

    また、トランザクション中に、同一テーブルに対する大量レコードのSQL 文による更新がある場合、ロックしきい値(既定値は1000)に到達してロックエスカレーションが発生し、その結果として、テーブルロック状態になっている可能性もあります。

    このように、ロックタイムアウトエラーの原因は幾つか考えられますので、まずは、管理ポータル(バージョン2010.2以前では、[システム管理ポータル])の、ロックメニューにて、現在のロックの状態をご確認下さい。

    0
    0 881
    記事 Tomoko Furuzono · 4月 13, 2021 1m read

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

    SQLクエリーの文字列を監査ログに残すことができます。

    詳細は、以下のドキュメントをご参照下さい。

    システム監査イベントについて

    ※%SQLで始まるイベントをご覧ください。 

    InterSystems SQL の使用法

    ※監査関連ページをご覧ください。

    0
    0 241
    記事 Toshihiko Minamoto · 4月 12, 2021 24m read

    (1NF/2NF/3NF) からの引用

    行と列で特定される位置には、それぞれアプリケーションドメインの値が 1 つだけあります (それ以外は何もない)。 その目的によって、同じ値がアトミックであったり、なかったりします。 例えば、「4286」という値は、
    • 「クレジットカードの PIN コード」を意味するのであれば、アトミックとなります (破損している場合や並び替えられている場合は、使用できません)。
    • 単に「連続する番号」であれば、非アトミックとなります (いくつかに分割されていたり、並び替えられていても、値は意味を成します)。

    この記事では、文字列や日付、($LB 形式の) 単純なリスト、「list of <...>」、「array of <...>」といったフィールドの型を伴う SQL クエリのパフォーマンスを向上させる標準的な方法にして検証します。

    1
    0 183
    記事 Mihoko Iijima · 4月 9, 2021 1m read

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

    INFORMATION_SCHEMA スキーマを使用して取得できます。

    INFORMATION_SCHEMA はシステム用スキーマのため、デフォルトでは管理ポータルのSQLメニューに表示されません。
    表示させる方法は以下の通りです。

    1. 管理ポータル→システムエクスプローラ→SQL メニューを開きます。
    2. スキーマのプルダウン左にある「システム」をチェックします。
    3. スキーマのプルダウンから INFORMATION_SCHEMA を選択します。

    指定のテーブル(ISJ.Class1)に対するID、フィールド名(COLUMN_NAME)、データタイプ(DATA_TYPE)、説明(DESCRIPTION)を取得するSQLは以下の通りです。

    SELECT ID,COLUMN_NAME,DATA_TYPE,DESCRIPTION
    FROM INFORMATION_SCHEMA.COLUMNS
    where TABLE_SCHEMA='ISJ' AND TABLE_NAME='Class1'
    0
    0 622
    記事 Toshihiko Minamoto · 3月 22, 2021 5m read

    Caché 2013.1 より、InterSystems は特殊な値を持つフィールドが使われるクエリプランのセレクションを改善する目的で Outlier Selectivity (外れ値の選択性) を導入しました。

    この記事では、「Project」テーブルを例に使い、Outlier Selectivity の概要やそれが SQL のパフォーマンスを向上させる仕組み、またクエリを書く際の注意点などについて解説したいと思います。

    Selectivity (選択性)

    まずは、Selectivity についてさっと説明します。 Selectivity とは、テーブル内の 1 つの列の中にある値に関するメタ情報のことです。 データが典型的なかたちで分布されていると想定した場合、「このテーブル内のこの列に特定の値を持つすべての行を要求するとしたら、通常取得できるのはテーブル内のどの程度の割合であろうか?」という疑問の答えとなる情報です。

    0
    0 186
    記事 Mihoko Iijima · 3月 19, 2021 3m read

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

    複数の SQL 文を実行する GUI はありませんが、複数の SQL 文を含むファイルを作成しファイルをインポートしながら SQL を実行する方法で対応できます。

    ご利用バージョンによって使用するユーティリティメソッドが異なります。

    2020.3以降をご利用の場合は %SYSTEM.SQL.Schema クラスの ImportDDL() メソッドを使用します。

    2020.2以前をご利用の場合は %SYSTEM.SQL クラスの DDLImport() メソッドを使用します。 

    1)バージョン 2020.3 以降での方法:%SYSTEM.SQL.Schema クラスの ImportDDL() メソッドの利用

    インポート用ファイルに記述するSQL文が複数行ある場合は、記述する SQL の後ろに GO 文を記述する必要があります。

    インポートファイル例は以下の通りです。

    INSERT INTO Test2.Person (Name) values('test1')
    go
    INSERT INTO Test2.Person (Name) values('test2')
    go
    INSERT INTO Test2.Person (Name) values('test3')
    go
    0
    0 10845
    記事 Mihoko Iijima · 3月 9, 2021 1m read

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

    INFORMATION_SCHEMA スキーマを使用して取得できます。

    INFORMATION_SCHEMA はシステム用スキーマのため、デフォルトでは管理ポータルの SQL メニューに表示されません。

    表示させる方法は以下の通りです。

    1. 管理ポータル→システムエクスプローラ→SQL メニューを開きます。
    2. スキーマのプルダウン左にある「システム」をチェックします。
    3. スキーマのプルダウンから INFORMATION_SCHEMA を選択します。

    指定のテーブル(Test.Person)に対するID、フィールド名(COLUMN_NAME)、データタイプ(DATA_TYPE)、説明(DESCRIPTION)を取得するSQLは以下の通りです。

    SELECT ID,COLUMN_NAME,DATA_TYPE,DESCRIPTION
    FROM INFORMATION_SCHEMA.COLUMNS
    where TABLE_SCHEMA='Test' AND TABLE_NAME='Person'

     

    関連するFAQトピックもご参照ください:「プログラムから、クラス定義に記述されたプロパティ定義を取得する方法はありますか?」

    0
    0 357
    記事 Mihoko Iijima · 3月 5, 2021 1m read

    これは 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 以下はこちらのドキュメントをご参照ください。

    0
    0 483
    記事 Toshihiko Minamoto · 3月 4, 2021 10m read

    マッピングの例

    三連載で 4 記事目を書いてしまったら、これまでのハイライトとして 5 記事目を書かないわけにはいかないでしょう!

    注意:  何年か前に Dan Shusman 氏が私に「グローパルのマッピングは芸術だ」と言いました。  そのやり方に正解も不正解もありません。  どのようなマッピングを行うかは、データをどう解釈するかで決まります。  例のごとく、最終的な結論を出す方法は 1 つに限られません。  ここでご紹介する例の中には、同じ型のデータを異なる方法でマッピングする例がいくつかあります。

    この記事の最後には、私が長年お客様のために書いてきたマッピングの例をまとめた zip ファイルをご用意しています。  過去 4 つの記事で触れた内容をまとめたハイライトとして、いくつか例を挙げていきたいと思います。  この記事は単なるハイライトですので、過去 4 記事ほどの詳細はカバーいたしません。  不明な点があれば、遠慮なくご連絡ください。もっと詳しく説明させていただきます。

    Row ID Spec: クラス例:  Mapping.RowIdSpec.xml

    0
    0 216
    記事 Hiroshi Sato · 3月 3, 2021 3m read

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

    通常SQLCODE -110(Locking conflict in filing)のエラーはロックが競合した場合に発生します。

    大量レコードが一度に更新された場合、その件数がロック閾値を超えてロックエスカレーションを起こしてテーブルロックとなる可能性があり、そのためにロックの競合が起きやすくなっていることが考えられます。

    このロック閾値を上げることにより、この競合を回避できる可能性もあります。

    しかしこの閾値を上げることにより、システムが必要とするロック管理用のメモリが増えるという副作用がありますので、慎重な検討が必要です。

    あるいはテーブルロックになる可能性を排除できずに、更新タイミング等アプリケーションの仕様を見直す必要があるかもしれません。

    またSQLCODE -110はロックテーブルの空き容量が不足した場合にも発生する可能性があります。

    コンソールログファイル(※)をご確認いただき、「LOCK TABLE FULL!!!」のエラーが記録されているようであれば、ロックテーブルの容量不足が原因です。

    ※ InterSystems IRIS のコンソールログファイル名は messages.log、Caché/Ensemble/HealthShare コンソールログファイル名は cconsole.log

    この場合は、

    0
    0 1452
    記事 Toshihiko Minamoto · 3月 1, 2021 11m read

    グローバルをクラスにマッピングする技術 (4/3)

    三連載のはずが 4 記事目に突入してしまいました。『銀河ヒッチハイク・ガイド』のファンという方はいませんか?

    古くなった MUMPS アプリケーションに新たな生命を吹き込みたいとお考えですか? 以下にご紹介するステップを実行すれば、グローバルをクラスにマッピングし、美しいデータを Object や SQL に公開できます。

    上の内容に馴染みが無い方は、以下の記事を初めからお読みください。

    グローバルをクラスにマッピングする技術 (1/3)

    グローバルをクラスにマッピングする技術 (2/3)

    グローバルをクラスにマッピングする技術 (3/3)

    この記事は Joel、あなたのために書きます!  前回の例で定義した親子関係を土台に、今度は孫クラスを作成し、^ParentChild グローバルに追加された季節情報を処理したいと思います。

    前回と同じ免責事項:  これらの記事を読んでもグローバルがよく理解できないという方は、WRC (Support@InterSystems.com) までメールでお問い合わせください。喜んでサポートさせていただきます。

    グローバルをクラスにマッピングするステップ。

    0
    0 232
    記事 Toshihiko Minamoto · 2月 25, 2021 9m read

    古くなった MUMPS アプリケーションに新たな生命を吹き込みたいとお考えですか? 以下にご紹介するステップを実行すれば、グローバルをクラスにマッピングし、美しいデータを Object や SQL に公開できます。

    上の内容に馴染みが無い方は、以下の記事を初めからお読みください。

    グローバルをマッピングする技術 1

    グローバルをマッピングする技術 2

    この記事の例では、典型的な親子構造をマッピングする方法をお見せします。

    前回と同じ免責事項:  これらの記事を読んでもグローバルがよく理解できないという方は、WRC (Support@InterSystems.com) までメールでお問い合わせください。喜んでサポートさせていただきます。

    グローバルをクラスにマッピングするステップ。

    0
    0 251
    記事 Mihoko Iijima · 2月 21, 2021 3m read

    皆さんこんにちは!

    VSCode の SQLTools エクステンションを使うと、VSCode から SQLTools に対応しているデータベースへ接続/クエリ実行が行えるようです。

    1 つの IDE で 各種言語を操作でき、さらにクエリも発行できるなんて VSCode って便利ですね!👏👏

    実は、まだプレビュー機能ではありますが、InterSystems IRIS も接続できます!🎊🎊

    正式リリース前なのですが、どんな感じでご利用いただけるかをご紹介したいと思います。

    解説ビデオ(4分ちょっと)もあります。ぜひご参照ください。

    ※ ObjectScript エクステンションの基本的な操作方法については、こちらの記事をぜひご参照ください。

    手順1:SQLTools エクステンションをインストール

    (ビデオでは、0:00~0:32 で解説しています)

    図の手順でインストールします(右画面の SQLTools の説明文下の方に対応データベースリストがあり、「InterSystems IRIS」の文字も見えます!)。

    手順2:SQLTools に対応するドライバをインストール(ここでは IRIS 用ドライバのインストール)

    (ビデオでは、0:32~1:09 で解説しています)

    SQLTools のインストールが終わると、VSCode の左端の黒いバーのところに   アイコンが見えるのでクリックします。

    2
    0 1514
    記事 Toshihiko Minamoto · 2月 18, 2021 9m read

     古くなった MUMPS アプリケーションの新たな生命を吹き込みたいとお考えでしたら、以下にご紹介するステップを実行すれば、グローバルをクラスにマッピングし、美しいデータを Object や SQL に公開できます。

    今回ご紹介する例には、パート 1 ではカバーしなかった内容を 4 つないし 5 つ程度盛り込んでいます。 

    その後は親子マッピングの例を紹介して完結となります。それを修得したらマッピングはもう完璧でしょう。

    前回と同じ免責事項:  これらの記事を読んでもグローバルがよく理解できないという方は、WRC (Support@InterSystems.com) までメールでお問い合わせください。喜んでサポートさせていただきます。 

    グローバルをクラスにマッピングするステップ。

    0
    0 312
    記事 Mihoko Iijima · 2月 12, 2021 3m read

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

    以下例のクラスメソッド getLatestID() のように ObjectScript のクラスメソッドを用意します。
    返したい値を戻り値に指定し、SQLストアドプロシージャ(SqlProc)キーワードを指定するだけで値が返せます。

    ClassMethod getLatestID() As %Integer [ SqlName = getLatestID, SqlProc ]
    {
        set latestID=$Order(^ISJ.TestClass1D(""),-1)
        quit latestID
    }

     

    操作を試す場合は、以下のクラス定義をご準備ください。

    Class ISJ.TestClass1 Extends (%Persistent, %Populate)
    {
    Property name As %String;
    
    ClassMethod getLatestID() As %Integer [ SqlName = getLatestID, SqlProc ]
    {
        set latestID=$Order(^ISJ.TestClass1D(""),-1)
        quit latestID
    }
    }
    0
    0 441
    記事 Toshihiko Minamoto · 1月 26, 2021 7m read

    2019年 10月 17日

    Anton Umnikov
    InterSystems シニアクラウドソリューションアーキテクト
    AWS CSAA、GCP CACE

    AWS Glue は、完全に管理された ETL (抽出、変換、読み込み) サービスです。データの分類、クリーンアップ、強化、そして様々なデータストア間でデータを確実に移動させるという作業を簡単にかつコスト効率の良いかたちで行えるようにするものです。

    InterSystems IRIS の場合、AWS Glue を使用すれば、大規模なデータをクラウドとオンプレミスのデータソースの両方から IRIS に移動させることができます。 ここで考えられるデータソースは、オンプレミスのデータベース、CSV、JSON、S3 バケットに保管されている Parquet ファイルならびに Avro ファイル、AWS Redshift や Aurora といったクラウドネイティブのデータベースを含みますが、これらに限定されません。

    0
    0 748
    お知らせ Mihoko Iijima · 1月 11, 2021

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

    第9回のマルチモデルコンテストの 続報 📣 の「テクノロジーボーナス」についてご紹介します。

    • InterSystems Globals (key-value)
    • InterSystems SQL
    • InterSystems Objects 
    • Your data model
    • ZPM Package deployment
    • Docker container usage

    詳細は以下ご参照ください。<--break->

    InterSystems Globals (key-value) - 2 points

    InterSystems グローバルは、InterSystems IRIS に任意のデータを格納するために使用される多次元スパース配列です。
    各グローバル・ノードはキーとみなされ、値(バリュー)を設定することができます。InterSystems IRIS は、グローバルを管理するための ObjectScript のコマンドや Native API を含む一連の API を提供しています。

    ObjectScript または Native API を介してグローバルを使用すると、2 ポイント獲得できます。

    ツール:

    ドキュメント:

    記事:

    0
    0 130
    記事 Toshihiko Minamoto · 12月 23, 2020 3m read

    新しい動的 SQL クラス(%SQL.Statement および %StatementResult)のパフォーマンスは %ResultSet より優れてはいますが、%ResultSet の使用方法をせっかく学習したので、しばらくの間新しい方を使用せずにいましたが、 やっとチートシートを作ったので、新しいコードを書いたり古いコードを書き直す際に役立てています。 皆さんのお役に立てればいいなと思っています。

    次に示すのは、私のチートシートの詳細版です。

    0
    0 237
    記事 Mihoko Iijima · 12月 20, 2020 3m read

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

    揮発性テーブル(多数のINSERT、DELETEが行われるテーブル)では、ビットマップ・インデックス用ストレージは徐々に効率が低下する可能性があります。

    例えば、以下の定義からなるデータが数千件あり、一定期間保持した後 TRUNCATE TABLE で一括削除を行うオペレーションが繰り返し行われているとします。

    Class MyWork.MonthData Extends (%Persistent, %Populate)
    {
    /// 満足度
    Property Satisfaction As %String(VALUELIST = ",満足,やや満足,やや不満,不満,");
    /// 年齢
    Property Age As %Integer(MAXVAL = 70, MINVAL = 20);
    Index AgeIdx On Age [ Type = bitmap ];
    }

     

    INSERT によってできたビットマップ・インデックスのストレージのイメージ(一部)は以下の通りです。

    0
    0 314
    記事 Megumi Kakechi · 12月 17, 2020 1m read

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

    選択性(または Selectivity)の数値とは、カラムに対するユニークデータの割合を示す数値です。

    例) Person テーブルの個別値である PID カラム、住所のうち都道府県名が入る Pref カラム
     Pref カラムの選択性 = 約 2%
     PID カラム(ユニーク属性のカラム)の選択性 = 1

    InterSystems製品のクエリオプティマイザは、クエリ実行経路(プラン)とインデックスの選択を決定するため、エクステントサイズ(テーブル内のレコード数)と選択性の数値を使用します。

    詳細は下記ドキュメントページをご参照ください。

    テーブルの最適化【IRIS】

    テーブルの最適化

    なお、選択性の数値は、テーブル単位に計算するまで設定されていません。

    計算方法については関連トピックをご参照ください。

    【関連情報】(コミュニティ/FAQトピックをリンクしています)

    0
    0 400
    記事 Hiroshi Sato · 12月 16, 2020 2m read

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

    SQLインジェクションに関しては、様々なWebサイトで対策等が公開されていますが、InterSystems SQLを使ったアプリケーションでも、他のRDBMSと同様にそれらの対策を適切に実施することで、SQLインジェクションは防げると考えられます。

    さらに、InterSystems Data Platform(以下IRIS)の場合、一般的なRDBMSに比較して、SQLインジェクションを実行しづらい、幾つかの施策が組み込まれています。

    0
    0 255
    記事 Megumi Kakechi · 12月 15, 2020 1m read

    これは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")
    0
    0 553
    記事 Minoru Horita · 12月 14, 2020 14m read

    優れた執筆者は、題名で読者を引き込み、答えを記事のどこかに隠すべきだと考えられています。  だとすると、私は出来の悪い執筆者ということになってしまいます。私の自尊心は見知らぬインターネットユーザーの皆さんのご意見にかかっていますので、お手柔らかにお願いします。

    0
    0 334
    記事 Hiroshi Sato · 12月 8, 2020 1m read

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

    連番を生成する関数($INCREMENT)を使用してユニークな番号を自動付番することができます。

    SQLのSELECT文で使用する場合には OracleのSequence相当の機能を実装したクラスを利用する方法があります。

    サンプルを以下のGitHubリポジトリより取得することができます。

    OracleのSequence機能を実装するサンプル

    0
    0 500
    記事 Mihoko Iijima · 12月 7, 2020 2m read

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

    SELECT ... FOR UPDATE は明示的な行ロック取得の方法として多くの RDBMS で実装されているため、この機能を使われているケースも多いと思います。

    このシンタックスは InterSystems 製品ではエラーにはなりませんが、期待されるような行ロックの取得は行われません。

    この記事では同等の機能を実現する方法をご紹介します。

    DECLARE CURSOR C1 IS
    SELECT Name FROM Person WHERE Name LIKE 'A%' FOR UPDATE
    OPEN C1
    LOOP FETCH C1 INTO name 
    ... name を表示
    ... 終了ならLOOPをEXIT
    END LOOP
    CLOSE C1

     

    上記のようなSQL文は、下記のSQL文で代替可能です。

    ※下記2行目のUPDATE文の実行により対象行に対して排他ロックがかかるため、他DBの動作と異なる点ご注意ください。
     

    0
    0 504
    記事 Toshihiko Minamoto · 11月 18, 2020 5m read

    クラス、テーブル、グローバルとその仕組み

    InterSystems IRIS を技術的知識を持つ人々に説明する際、私はいつもコアとしてマルチモデル DBMSであることから始めます。

    個人的には、それが(DBMSとして)メインの長所であると考えています。 また、データが格納されるのは一度だけです。 ユーザーは単に使用するアクセス API を選択するだけです。

    • データのサマリをソートしたいですか?SQL を使用してください!
    • 1 つのレコードを手広く操作したいですか?オブジェクトを使用してください!
    • あなたが知っているキーに対して、1 つの値にアクセスしたりセットしたいですか? グローバルを使用してください!

    これは短く簡潔なメッセージで、一見すると素晴らしく聞こえます。しかし、実際には intersystems IRIS を使い始めるたユーザーには クラス、テーブル、グローバルはそれぞれどのように関連しているのだろうか? 互いにどのような存在なのだろうか? データは実際にどのように格納されているのだろうか?といった疑問が生じます。

    この記事では、これらの疑問に答えながら実際の動きを説明するつもりです。

    パート 1. モデルに対する偏見。

    データを処理するユーザーは多くの場合、処理対象のモデルに偏見を持っています。

    0
    0 570
    記事 Mihoko Iijima · 11月 10, 2020 4m read

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

    インデックスが複数定義されているクラス/テーブルへ csv 形式等のシーケンシャルファイルから大量データをデータベースに登録する際、推奨される登録方法として、データ登録時インデックスを生成させず、登録完了後に一括でインデックスを生成する 方法があります。

    この方法は、新規に大量のレコードを一括登録する際に最も有効な手段となります。

    <メモ>
    大量のデータを追加登録する際には、既存のデータ量と新規データ量のバランスにより、この手法が有効でないケースもあります。その場合は、インデックスの再構築を範囲指定で行うこともできます。

    説明に使用するクラス定義例は以下の通りです。

    0
    0 541