習得する必要がある役立つスキル
この章の目的は、精通しておく必要がある Caché 固有のタスクを簡単に説明することです。この章で説明するタスクを、なぜ、いつ、どのように実行するのかを理解すると、時間と労力を節約できます。以下のトピックについて説明します。
-
クエリ・プランを表示する方法 (クエリを高速化する方法の判別に役立ちます)
-
クラスに対してインデックスを構築する方法 (レコードの作成後にインデックスを追加する場合)
コード要素の定義の検索
このセクションでは、さまざまなタイプのコード要素を定義する実際のコードの検索方法について説明します。以下の内容を取り上げます。
付録 “Caché の様々な構文” も参照してください。
スタジオでのクラス・メンバの検索
クラス・メンバが (プロパティ、メソッド、パラメータなど) がその定義を見られるようにするには、それが定義されているクラスを見つける必要があります。スタジオでクラス・メンバをすばやく検索するには、以下の手順を実行します。
-
Ctrl+Shift+f を押します。
-
[検索対象] に、メンバ名を入力します。
-
[ファイルタイプ] で .cls を選択します。
-
[検索...] を選択します。
通常、これにより、調べる対象となる少数のクラスが返されます。詳しく調べることで、どれが該当するクラスであるかを判別できます。
インターシステムズ・クラス・リファレンスでのクラス・メンバの検索
インターシステムズ・クラス・リファレンスでクラス・メンバを検索するには、以下の手順を実行します。
-
[検索] を選択します。
-
[次で検索] で、[定義しているすべてのクラス] を選択します。
-
[タイプ] で、[メソッド] または他の種類のクラス・メンバを選択します。
-
[名前] に、検索するクラス・メンバの名前を入力します。検索では大文字と小文字が区別されます。
-
[検索] を選択します。
通常、これにより、調べる対象となる少数のクラスが返されます。詳しく調べることで、どれが該当するクラスであるかを判別できます。
インターシステムズ・クラス・リファレンスでのサブクラスの検索
場合によっては、特定のクラスのサブクラスがすべて必要になることがあります (例えば、クラス間で継承を再編成している場合)。これをすばやく実行するには、インターシステムズ・クラス・リファレンスでクラスを開きます。要約領域には、クラスのすべてのサブクラスのリストが表示されます。
スタジオでのマクロの検索
マクロは、現在調べているコード内で定義されていることも (Caché で提供されるシステム・インクルード・ファイルをインクルードして) コードで使用される INC ファイル内で定義されていることもあります。INC ファイルは、他の INC ファイルをインクルードでき、クラスは、スーパークラスによって使用される INC ファイルをすべて継承します。
マクロを定義する INC ファイルを見つけるには、そのマクロを右クリックし、[macroname に移動] を選択します。
インクルード・ファイルでマクロが定義されていない場合、スタジオで以下の手順を実行します。
-
Ctrl+Shift+f を押します。
-
[検索対象] に、先頭の $$$ は付けないでマクロ名を入力します。
Cache に用意されているマクロのいくつかは、"Caché ObjectScript の使用法" の “システムにより提供されるマクロのリファレンス” に記載されています。
データベースの定義
ローカル・データベースを作成するには、以下の手順を実行します。
-
管理ポータルにアクセスします。
-
[システム管理]→[構成]→[システム構成]→[ローカルデータベース] を選択します。
-
[新規データベースの作成] を選択して、[データベースウィザード] を開きます。
-
新規データベースの以下の情報を入力します。
-
テキスト・ボックスにデータベース名を入力します。通常、これは、英数字を含む短い文字列です。ルールについては、"Caché システム管理ガイド" の “データベースの構成” を参照してください。
-
ディレクトリ名を入力するか、[参照] を選択し、データベース・ディレクトリを選択します。データベースの初回作成時は、データベースを作成する親ディレクトリを参照する必要があります。他のデータベースが既に作成されている場合、既定のデータベース・ディレクトリは、最後に作成したデータベースの親ディレクトリです。
-
-
[完了] を選択します。
リモート・データベースの作成に関する追加のオプションおよび詳細は、"Caché システム管理ガイド" の “Cache の構成” を参照してください。
ネームスペースの定義
ローカル・データベースを使用するネームスペースを作成するには、以下の手順を実行します。
-
管理ポータルにアクセスします。
-
[システム管理]→[構成]→[システム構成]→[ネームスペース] を選択します。
-
[新規ネームスペースの作成] を選択します。
-
[ネームスペースの名前] に名前を入力します。通常、これは、英数字を含む短い文字列です。ルールについては、"Caché システム管理ガイド" の “ネームスペースの構成” を参照してください。
-
[グローバルに既存のデータベースを選択] で、データベースを選択するか、または [新規データベース作成] を選択します。
[新規データベース作成] を選択した場合は、前のトピックで指定されたものと同様のオプションが表示されます。
-
[ルーチンに既存のデータベースを選択] で、データベースを選択するか、[新規データベース作成] を選択します。
[新規データベース作成] を選択した場合は、前のトピックで指定されたものと同様のオプションが表示されます。
-
[保存] を選択します。
追加のオプションについては、"Caché システム管理ガイド" の “Caché の構成” を参照してください。
グローバルのマッピング
グローバルをデータベース ABC にマップする場合、指定されたネームスペースを構成し、Caché が、ネームスペースの既定のデータベースではないデータベース ABC にこのグローバルを書き込み、およびデータベース ABC から読み取るようにする必要があります。このグローバル・マッピングを定義する場合、その指定されたデータベースにグローバルが Caché によって移動されることはなく (既に存在する場合)、代わりに、マッピングによって Caché は今後グローバルをどの場所で読み取りおよび書き込みするのかを認識するようになります。
グローバルをマップするには、以下の手順を実行します。
-
グローバルが既に存在する場合、それを目的のデータベースに移動します。この章で後述する “1 つのデータベースから別のデータベースへのデータの移動” を参照してください。
-
管理ポータルにアクセスします。
-
[システム管理]→[構成]→[システム構成]→[ネームスペース] を選択します。
-
このマッピングを定義するネームスペースの行で [グローバルマッピング] を選択します。
-
[新規グローバルマッピング] を選択します。
-
[グローバルデータベース位置] で、このグローバルを格納するデータベースを選択します。
-
[グローバル名] に入力します (名前から先頭のキャラットを削除します)。* 文字を使用すると、複数のグローバル名を選択できます。
このグローバルは、マッピングの際に存在していなくてもかまいません (つまり、作成を計画しているグローバルの名前を使用できます)。
Note:通常、マッピングは永続クラスのデータ・グローバルに対して作成します。それは、そのデータを既定以外のデータベースに格納する必要があるためです。多くの場合、データ・グローバルの名前は推測できますが、Caché では長すぎるクラス名は、自動的にハッシュされた形式になることを覚えておいてください。それらのクラスのストレージ定義を確認し、そこで使用されているグローバルの正確な名前を確認しておくと役立ちます。このドキュメントで前述した “ストレージ” を参照してください。
-
[OK] を選択します。
-
マッピングを保存するには、[変更を保存] を選択します。
詳細は、"Caché システム管理ガイド" を参照してください。
プログラムでグローバル・マッピングを定義することもできます。"インターシステムズ・プログラミング・ツールの索引" の “グローバル” エントリを参照してください。
以下は、管理ポータルに表示されるグローバル・マッピングの例です。これには、グローバル名の先頭のキャラットは表示されません。
このマッピングは、次のことを意味します。
-
ネームスペース DEMONAMESPACE 内では、グローバル ^MyTempGlobal のノードの値を設定する場合、データを CACHETEMP データベースに書き込みます。
これは、ノードを直接設定する場合でも (オブジェクト・アクセスまたは SQL を使用して) 間接的に設定する場合でも変わりません。
-
ネームスペース DEMONAMESPACE 内では、グローバル ^MyTempGlobal から値を取得する場合、データを CACHETEMP データベースから読み取ります。
これは、ノードから値を直接取得する場合でも (オブジェクト・アクセスまたは SQL を使用して) 間接的に取得する場合でも変わりません。
ルーチンのマッピング
ルーチンをデータベース ABC にマップする場合、指定されたネームスペースを構成し、Caché が、ネームスペースの既定のデータベースではないデータベース ABC でこのルーチンを見つけられるようにする必要があります。このルーチン・マッピングを定義する場合、その指定されたデータベースにルーチンが Caché によって移動されることはなく (既に存在している場合)、代わりに、マッピングによって Caché は今後ルーチンをどの場所で見つけられるのかを認識するようになります。
ルーチンをマップするには、以下の手順を実行します。
-
既にルーチンが存在している場合、このドキュメントで後述する “1 つのデータベースから別のデータベースへのコードの移動” の説明に従って、それを目的のデータベースに移動します。
-
管理ポータルにアクセスします。
-
[システム管理]→[構成]→[システム構成]→[ネームスペース] を選択します。
-
このマッピングを定義するネームスペースの行で [ルーチンマッピング] を選択します。
-
[新規ルーチンマッピング] を選択します。
-
[ルーチンデータベース位置] で、このルーチンを格納するデータベースを選択します。
-
[ルーチン名] に値を入力します。* 文字を使用すると、複数のルーチン名を選択できます。
先頭の (^) を含めずに、実際のルーチン名を使用してください。
このルーチンは、マッピングの際に存在していなくてもかまいません (つまり、作成を計画しているルーチンの名前を使用できます)。
-
[ルーチンタイプ] を選択します。
-
[OK] を選択します。
-
[OK] を選択します。
-
マッピングを保存するには、[変更を保存] を選択します。
詳細は、"Caché システム管理ガイド" を参照してください。
プログラムでこの種のマッピングを定義することもできます。プログラムでルーチン・マッピングを定義することもできます。"インターシステムズ・プログラミング・ツールの索引" の “ルーチン” エントリを参照してください。
1 つ以上のルーチンをマップするときには、それらのルーチンが必要とするすべてのコードとデータを必ず特定して、そのすべてのコードとデータがすべてのターゲット・ネームスペースで使用できることを確認します。マップされるルーチンは、以下の項目に依存している可能性があります。
-
インクルード・ファイル
-
その他のルーチン
-
クラス
-
テーブル
-
グローバル
追加のルーチン、パッケージ、およびグローバル・マッピングを必要に応じて使用して、これらの項目がターゲット・ネームスペースで使用できるようにします。
パッケージのマッピング
パッケージをデータベース ABC にマップする場合、指定されたネームスペースを構成し、Caché が、ネームスペースの既定のデータベースではないデータベース ABC でこのパッケージのクラス定義を見つけられるようにする必要があります。マッピングはクラス定義と関連付けられた、生成されたルーチンにも適用されます。これらのルーチンは同じパッケージ内にあります。このマッピングは、これらのパッケージに格納されている永続クラスのデータの場所には影響しません。
また、このパッケージ・マッピングを定義する場合、その指定されたパッケージが Caché によって移動されることはなく (既に存在している場合)、代わりに、マッピングによって Caché は今後パッケージをどの場所で見つけられるのかを認識するようになります。
パッケージをマップするには、以下の手順を実行します。
-
既にパッケージが存在している場合、このドキュメントで後述する “1 つのデータベースから別のデータベースへのコードの移動” の説明に従って、そのパッケージを目的のデータベースに移動します。
-
管理ポータルにアクセスします。
-
[システム管理]→[構成]→[システム構成]→[ネームスペース] を選択します。
-
このマッピングを定義するネームスペースの行で [パッケージマッピング] を選択します。
-
[新規パッケージマッピング] を選択します。
-
[パッケージデータベース位置] で、このパッケージを格納するデータベースを選択します。
-
[パッケージ名] に値を入力します。
このパッケージは、マッピングの際に存在していなくてもかまいません (つまり、作成を計画しているパッケージの名前を使用できます)。
-
[OK] を選択します。
-
[OK] を選択します。
-
マッピングを保存するには、[変更を保存] を選択します。
詳細は、"Caché システム管理ガイド" を参照してください。
プログラムでこの種のマッピングを定義することもできます。プログラムでパッケージ・マッピングを定義することもできます。"インターシステムズ・プログラミング・ツールの索引" の “パッケージ” エントリを参照してください。
パッケージをマップするときには、そのパッケージ内のクラスが必要とするすべてのコードとデータを必ず特定して、そのすべてのコードとデータがすべてのターゲット・ネームスペースで使用できることを確認します。マップされるクラスは、以下の項目に依存している可能性があります。
-
インクルード・ファイル
-
ルーチン
-
その他のクラス
-
テーブル
-
グローバル
追加のルーチン、パッケージ、およびグローバル・マッピングを必要に応じて使用して、これらの項目がターゲット・ネームスペースで使用できるようにします。
テスト・データの生成
Caché は、永続クラスで使用する擬似ランダム・テスト・データを作成するユーティリティを備えています。このようなデータの作成は、データ生成と呼ばれ、これを実行するユーティリティは Caché Populate ユーティリティと呼ばれます。このユーティリティは、特に、大量のデータを扱っているときに、アプリケーションのさまざまな部分がどのように機能するかをテストする場合に役立ちます。
Populate ユーティリティは、2 つのクラスで構成されています。%Library.PopulateOpens in a new tab と %Library.PopulateUtilsOpens in a new tab です。これらのクラスは、さまざまな一般的な形式のデータを生成するメソッドを提供します。例えば、あるメソッドは、以下のようにランダムな名前を生成します。
Write ##class(%Library.PopulateUtils).Name()
Populate ユーティリティは、以下の 2 つの異なる方法で使用できます。
%Populate の拡張
この方法では、以下の手順を実行します。
-
自身のクラスのスーパークラス・リストに %PopulateOpens in a new tab を追加します。
-
オプションで、そのクラスの各プロパティの POPSPEC パラメータの値を指定します。
パラメータの値には、プロパティ値として使用するために適した値を返すメソッドを指定します。
以下はその例です。
Property SSN As %String(POPSPEC = "##class(MyApp.Utils).MakeSSN()");
-
独立クラスが依存クラスの前になるように、適切な順序でデータを生成するユーティリティ・メソッドまたはルーチンを作成します。
このコードで、クラスを生成するには、そのクラスの Populate() メソッドを使用します。これは、%PopulateOpens in a new tab スーパークラスから継承します。
このメソッドは、クラスのインスタンスを生成し、%Save() メソッドを呼び出すことでそれらを保存します。これにより、保存する前に各プロパティが検証されます。
各プロパティに対して、このメソッドは以下のように値を生成します。
-
POPSPEC パラメータが、そのプロパティに指定されている場合、システムによってそのメソッドが呼び出され、それが返す値が使用されます。
-
それ以外の場合、プロパティ名が、City、State、Name などの名前、つまり他の事前に定義された値であれば、システムによってその値に適したメソッドが呼び出されます。これらの値は、ハードコードされています。
-
それ以外の場合は、システムによってランダムな文字列が生成されます。
%PopulateOpens in a new tab クラスによるシリアル・プロパティ、コレクションなどの処理方法の詳細は、"Caché オブジェクトの使用法" の “Caché Populate ユーティリティ” を参照してください。
-
-
ターミナルまたは適切な起動コードからユーティリティ・メソッドを起動します。
これは、SAMPLES データベースの Sample.PersonOpens in a new tab に使用される一般的な方法です。
メソッド %Populate と %PopulateUtils の使用法
%PopulateOpens in a new tab および %PopulateUtilsOpens in a new tab クラスは、特定の形式の値を生成するメソッドを提供します。これらのメソッドは、以下のデータを生成するための代替方法で、直接呼び出すことができます。
-
独立クラスが依存クラスの前になるように、適切な順序でデータを生成するユーティリティ・メソッドを作成します。
このコードでは、各クラスに対して目的の回数だけ繰り返し処理が実行されます。繰り返し処理ごとに、以下の手順を実行します。
-
新しいオブジェクトを作成します。
-
適切なランダム値 (または、ランダムに近い値) を使用して各プロパティを設定します。
そのためには、%PopulateOpens in a new tab または %PopulateUtilsOpens in a new tab のメソッドを使用するか、独自のメソッドを使用します。
-
オブジェクトを保存します。
-
-
ターミナルから自身のユーティリティ・メソッドを呼び出します。
これは、DeepSee および HoleFoods パッケージに含まれている SAMPLES データベースの 2 つの DeepSee サンプルに使用されている手法です。
格納されているデータの削除
場合によっては、開発プロセス中に、あるクラスの既存のテスト・データをすべて削除し、それを再生成することが必要になります (例えば、ストレージ定義を削除した場合)。
以下に、あるクラスについて格納されてるデータをすばやく削除する方法を 2 つ紹介します (他の方法も使用できます)。
-
以下のメソッドを呼び出します。
##class(%ExtentMgr.Util).DeleteExtent(classname)
classname は、完全なパッケージおよびクラス名です。
-
そのクラスのデータが格納されているグローバルおよびそのクラスのインデックスが格納されているグローバルを削除します。これは、管理ポータルを使用すると簡単に実行できます。
-
[システム・エクスプローラ]→[グローバル] を選択します。
-
[削除] を選択します。
-
左側で、作業しているネームスペースを選択します。
-
右側で、データ・グローバルとインデックス・グローバルの横にあるチェック・ボックスにチェックを付けます。
-
[削除] を選択します。
これらのグローバルを削除することを確認するプロンプトが表示されます。
-
これらのオプションによってデータは削除されますが、クラス定義は削除されません(反対に、クラス定義を削除しても、そのデータは削除されません)。
ストレージのリセット
開発中にストレージをリセットできることは重要ですが、実働システムでは実行しないでください。
クラスのストレージをリセットする操作により、そのクラスがその格納されているデータにアクセスする方法が変わります。クラスに対してデータを格納していた場合、およびプロパティ定義を削除、追加、または変更した場合に、ストレージをリセットすると、その格納されているデータに適切にアクセスできなくなることがあります。したがって、ストレージをリセットする場合、必要に応じてクラスに対するすべての既存のデータを削除し、それを再生成または再ロードすることも必要です。
スタジオでクラスのストレージをリセットするには、以下の手順を実行します。
-
スタジオで、クラスを表示します。
-
クラス定義の終わりまでスクロールします。
-
<Storage name= で始まり、</Storage> で終わるストレージ定義全体を選択します。選択範囲を削除します。
-
クラスを保存し、リコンパイルします。
または、以下の手順を実行します。
-
スタジオで、クラスを表示します。
-
インスペクタが現在表示されていない場合は、[表示]→[インスペクタ] を選択します。
-
インスペクタの左上のボックスで [ストレージ] を選択します。スタジオによって、定義済みのストレージ定義がすべて表示されます。
通常は、[デフォルト] という名前のストレージ定義が 1 つのみ表示されます。
-
ストレージ定義の行を右クリックし、[削除] を選択します。
-
[OK] を選択して確定します。
-
クラスを保存し、リコンパイルします。
テーブルの参照
テーブルを参照するには、管理ポータルで以下の手順を実行します。
-
[システム・エクスプローラ]→[SQL] を選択します。
-
必要に応じて、ヘッダ領域で [切り替え] を選択して、対象のネームスペースを選択します。
-
オプションで、[スキーマ] ドロップダウン・リストから SQL スキーマを選択します。このリストには、このネームスペースの SQL スキーマがすべて含まれています。各スキーマは、最上位レベルのクラス・パッケージに対応します。
-
[テーブル] フォルダを展開して、このスキーマのテーブルをすべて表示します。以下に例を示します。
-
テーブルの名前を選択します。右の領域に、テーブルの情報が表示されます。
-
[テーブルを開く] を選択します。
このテーブルの最初の 100 行が表示されます。以下はその例です。
以下の点に注意してください。
-
ここに表示される値は、表示値であり、ディスクに格納されている論理値ではありません。
-
最初の列 (#) は、この表示内の行番号です。
-
2 番目の列 ([ID]) は、このテーブルの行に対する一意の識別子であり、このクラスのオブジェクトを開くときは、この識別子を使用します (このクラスではこれらの識別子は整数ですが、整数ではないこともあります)。
このテーブルは、SAMPLES データベースが構築されるたびに新しく生成されるため、この場合、これらの番号は同一になっています。実際のアプリケーションでは、いくつかのレコードが削除されている可能性があるため、[ID] 値には相違があり、その数字は行番号と一致しません。
-
SQL クエリの実行
SQL クエリを実行するには、管理ポータルで以下の手順を実行します。
-
[システム・エクスプローラ]→[SQL] を選択します。
-
必要に応じて、ヘッダ領域で [切り替え] を選択して、対象のネームスペースを選択します。
-
[クエリ実行] をクリックします。
-
入力ボックスに SQL クエリを入力します。例えば、以下のようになります。
select * from sample.person
-
ドロップダウン・リストで、[表示モード]、[論理モード]、または [ODBCモード] を選択します。
これにより、ユーザ・インタフェースでの結果の表示方法が制御されます。
-
次に、[実行] を選択します。ポータルに、クエリ結果が表示されます。以下はその例です。
オブジェクト・プロパティの検証
いくつかの場合、特定のプロパティの値を表示する最も簡単な方法は、ターミナルでオブジェクトを開き、プロパティを書き込むことです。
-
ターミナル・プロンプトが目的のネームスペースの名前ではない場合、以下のように入力し、Enter キーを押します。
ZN "namespace"
namespace は目的のネームスペースです。
-
以下のようなコマンドを入力し、このクラスのインスタンスを開きます。
set object=##class(package.class).%OpenId(ID)
package.class はパッケージおよびクラスであり、ID はクラスの格納されているオブジェクトの ID です。
-
以下のようにプロパティの値が表示されます。
write object.propname
propname は、表示する値のプロパティです。
グローバルの表示
一般に、グローバルを表示するには、ObjectScript ZWRITE コマンドまたは システム, グローバル ページを使用できます。特定のクラスのデータを保存したグローバルを探している場合は、先にクラス定義をチェックして、表示するグローバルを確認すると便利です。
-
特定のクラスのデータ・グローバルを探しているとき、クラスのデータがどのグローバルに格納されているのかわからない場合は、以下の手順を実行します。
-
スタジオで、クラスを表示します。
-
クラス定義の終わりまでスクロールします。
-
<DefaultData> 要素を見つけます。<DefaultData> と </DefaultData> の間の値は、このクラスのデータを格納するグローバルの名前です。
Caché では、単純な名前付け規約を使用してこれらのグローバルの名前が決定されます。このドキュメントで前述した “永続クラスによって使用されるグローバル” を参照してください。ただし、グローバル名は 31 文字 (最初のキャレットは除く) までに制限されています。そのため、完全なクラス名が長い場合、代わりにクラス名のハッシュした形式が自動的に使用されます。
-
-
管理ポータルで、[システム・エクスプローラ]→[グローバル] を選択します。
-
必要に応じて、ヘッダ領域で [切り替え] を選択して、対象のネームスペースを選択します。
ポータルには、このネームスペースで使用可能なグローバルのリストが表示されます (この表示では、各名前の先頭のキャラットが削除されます)。以下はその例です。
通常、システム・グローバル以外のグローバルには、永続クラスのデータが格納されます。したがって、システム・グローバルを表示しない場合、大部分のグローバルは見慣れた名前になります。
-
目的のグローバルに対応する行で [表示] を選択します。
このテーブルの最初の 100 ノードが表示されます。以下はその例です。
-
目的のオブジェクトのみが表示されるように制限するには、オブジェクトの ID を使用して、[グローバル検索マスク] フィールドでグローバル名の終わりに (ID) を付加します。以下はその例です。
^Sample.PersonD(45)
次に [表示] を押します。
前述したように、ZWRITE コマンドも使用できます。この省略形の ZW も使用できます。ターミナルに以下のようなコマンドを入力します。
zw ^Sample.PersonD(45)
INT コードの表示
システムによって、コンパイルする各ルーチンおよび各クラスの INT コードが生成されます。
特定のルーチンまたはクラスの INT コードを表示するには、以下の手順を実行します。
-
コンパイラによって、INT コードが破棄されずに保持されるようにします。
-
[ツール]→[オプション] に移動します。
-
[コンパイラ]→[一般フラグ] タブを選択します。
-
[生成されたソースコードを保存] オプションを選択します。
このドキュメントで前述した “システム修飾子およびフラグ” も参照してください。
-
-
スタジオでルーチンまたはクラスを表示します。
-
[生成されたソースコードを保存] オプションを変更した場合は、そのルーチンまたはクラスをリコンパイルします。
-
[表示]→[他のコードを表示] を選択します。
生成されたルーチンが複数ある場合、スタジオには、表示するルーチンを選択するためのダイアログ・ボックスが表示されます。それ以外の場合は、生成されたルーチンが表示されます。
生成されたルーチンは、このコードを編集してはならないことを示すためにグレーの背景で表示されます(次にそのクラスをコンパイルしたときに、クラス・コンパイラによってそれは上書きされます)。以下に例を示します。
一部のメソッド、ルーチン、およびサブルーチンは、カーネルで実装されるほど十分に単純です。このような項目に対応して生成される .INT コードはありません。
このドキュメントで前述した “ドキュメント ("ファイル")” も参照してください。
クエリのテストとクエリ・プランの表示
管理ポータルで、コードで実行されるクエリをテストできます。また、クエリ・オプティマイザによるそのクエリの実行方法に関する情報を示すクエリ・プランも表示できます。この情報を使用して、クラスにインデックスを追加するのか、それとも別の方法でクエリを作成するのかを決定できます。
クエリ・プランを表示するには、管理ポータルで以下の手順を実行します。
-
[システム・エクスプローラ]→[SQL] を選択します。
-
必要に応じて、ヘッダ領域で [切り替え] を選択して、対象のネームスペースを選択します。
-
[クエリ実行] をクリックします。
-
入力ボックスに SQL クエリを入力します。例えば、以下のようになります。
select * from sample.person
-
ドロップダウン・リストで、[表示モード]、[論理モード]、または [ODBCモード] を選択します。
これにより、ユーザ・インタフェースでの結果の表示方法が制御されます。
-
クエリをテストするには、[実行] を選択します。
-
クエリ・プランを表示するには、[プラン表示] を選択します。
クエリ・キャッシュの表示
Caché SQL の場合 (埋め込み SQL として使用される場合を除く)、システムによってデータにアクセスするための再使用可能なコードが生成され、そのコードがクエリ・キャッシュに配置されます (埋め込み SQL の場合も、システムによって再使用可能なコードが生成されますが、それは、生成された INT コード内に含まれます)。
最初に SQL 文を実行するときに、Caché によってクエリが最適化され、データを取得するコードが生成され、格納されます。コードは、最適化されたクエリ・テキストと共に クエリ・キャッシュに格納されます。このキャッシュは、OBJ コードのキャッシュであり、データのキャッシュではありません。
後で SQL 文を実行すると、Caché によってそれが最適化され、そのクエリのテキストと、クエリ・キャッシュに格納されている項目が比較されます。Caché によって、格納されているクエリが、指定されたクエリと一致していると判断された場合 (空白などのわずかな相違を除く)、そのクエリに対して格納されているコードが使用されます。
管理ポータルでは、クエリ・キャッシュ内の項目がスキーマ別にグループ化されます。特定のスキーマのクエリ・キャッシュを表示するには、管理ポータルで以下の手順を実行します。
-
[システム・エクスプローラ]→[SQL] を選択します。
-
必要に応じて、ヘッダ領域で [切り替え] を選択して、対象のネームスペースを選択します。
-
[クエリキャッシュ] フォルダを展開します。
-
スキーマの行で、[テーブル] リンクを選択します。
-
ページの一番上にある [クエリキャッシュ] を選択します。
ポータルの表示は以下のようになります。
リストの各項目は OBJ コードです。
Caché では、既定で、この OBJ コードの前段階として生成するルーチンと INT コードは保存されません。この生成されたコードを保存するように Caché を設定することもできます。このドキュメントで前述した “Caché SQL の設定” を参照してください。
クエリ・キャッシュは削除できます (これにより、このコードの再生成を Caché に強制します)。クエリ・キャッシュを削除するには、[アクション]→[クエリキャッシュ削除] を使用します。
インデックスの構築
Caché クラスの場合、インデックスをメンテナンスする必要はありませんが 1 つだけ例外があります。既に格納されているレコードがあるクラスに、後でインデックスを追加する場合は、インデックスを構築する必要があります。
そのためには、以下の操作を実行します。
-
[システム・エクスプローラ]→[SQL] を選択します。
-
必要に応じて、ヘッダ領域で [切り替え] を選択して、対象のネームスペースを選択します。
-
左の領域でテーブルを選択します。
-
[アクション]→[インデックス再構築] を選択します。
テーブルのチューニング機能の使用法
クエリ・オプティマイザによって特定の SQL クエリを実行する最も効率的な方法が決定されるときには、特に以下の項目が考慮されます。
-
テーブルに含まれるレコードの数はいくつか
-
クエリによって使用される列に対して、それらの列がどのくらい一意に近いか
この情報は、指定した 1 つ以上のテーブルで、テーブルのチューニング機能を実行した場合にのみ使用できます。この機能によって、このデータが計算され、それが、クラスのストレージ定義と共に、クラスの <ExtentSize> 値および格納されているプロパティの <Selectivity> 値として格納されます。
テーブルのチューニング機能を使用するには、以下の手順を実行します。
-
[システム・エクスプローラ]→[SQL] を選択します。
-
必要に応じて、ヘッダ領域で [切り替え] を選択して、対象のネームスペースを選択します。
-
左の領域でテーブルを選択します。
-
[アクション]→[テーブルチューニング] を選択します。
<Selectivity> 値の場合、データの特性に変更がない限り、これを再度実行する必要はありません。<ExtentSize> の場合、正確な値である必要はありません。この値は、さまざまなテーブルのスキャンの相対コストを比較するときに使用します。テーブル間の ExtentSize 値の相対値が正しいものであること (小規模のテーブルは小さい値を、大規模なテーブルは大きい値を持つこと) を確認することが重要です。
テーブルのチューニング機能は、開発中に使用するツールであり、実働中のメンテナンスに使用するものではありません。つまり、管理タスクの一部としてこれを再実行する必要はありません。
1 つのデータベースから別のデータベースへのコードの移動
1 つのデータベースから別のデータベースにコードを移動する必要がある場合、以下の手順を実行できます。
-
スタジオで、そのコードを含むネームスペースに移動します。
-
新しいプロジェクトを作成し、すべてのコードをそれに追加します。
-
[ファイル]→[プロジェクトの新規作成] を選択します。
-
移動するクラス、パッケージ、またはルーチンそれぞれを右クリックし、[プロジェクトに追加] を選択します。
-
[ワークスペース] ウィンドウを開き、[プロジェクト] タブを選択して、目的の項目がすべ表示されていることを確認します。
-
-
プロジェクトをエクスポートします。
-
[ツール]→[エクスポート] を選択します。
-
プロジェクトのエクスポート先のファイルを指定します。フィールドにファイル名 (その絶対パス名または相対パス名を含む) を入力するか、[参照] を選択してそのファイルに移動します。
-
[OK] を選択します。
これにより、.xml ファイルが作成されます。ファイルの形式はドキュメント化されていませんが、比較的簡単に読めます。
-
-
スタジオで、XML ファイルを目的のネームスペースにインポートします。
-
そのネームスペースに切り替えます。
-
[ツール]→[ローカルからインポート] を選択します。
-
.xml ファイルに移動して選択します。
-
[開く] を選択します。
スタジオに、このファイル内にあるコード項目のリストが表示されます。
-
インポートする各項目を選択します。
-
[OK] を選択します。
-
-
最初のネームスペースに戻り、コードを削除します。
1 つのデータベースから別のデータベースへのデータの移動
1 つのデータベースから別のデータベースにデータを移動する必要がある場合、以下の手順を実行できます。
-
データとそのインデックスが格納されているグローバルを特定します。
クラスでどのグローバルが使用されているのかわからない場合は、そのストレージ定義を確認します。このドキュメントで前述した “ストレージ” を参照してください。
-
それらのグローバルをエクスポートします。そのためには、以下の操作を実行します。
-
管理ポータルで、[システム・エクスプローラ]→[グローバル] を選択します。
-
必要に応じて、ヘッダ領域で [切り替え] を選択して、対象のネームスペースを選択します。
-
エクスポートするグローバルを選択します。
-
[エクスポート] を選択します。
-
グローバルのエクスポート先のファイルを指定します。フィールドにファイル名 (その絶対パス名または相対パス名を含む) を入力するか、[参照] を選択してそのファイルに移動します。
-
[エクスポート] を選択します。
グローバルは、.gof という拡張子を持つファイルにエクスポートされます。
-
-
それらのグローバルを他のネームスペースにインポートします。そのためには、以下の操作を実行します。
-
管理ポータルで、[システム・エクスプローラ]→[グローバル] を選択します。
-
必要に応じて、ヘッダ領域で [切り替え] を選択して、対象のネームスペースを選択します。
-
[インポート] を選択します。
-
インポートするファイルを指定します。ファイル名を入力するか、[参照] を選択し、そのファイルにナビゲートします。
-
ファイルの内容を表示するには、[次へ] を選択します。システムにより、指定したファイルのグローバルに関する情報のテーブルが表示されます。表示される情報は、各グローバルの名前、ローカル・ネームスペースまたはデータベースに存在するかどうか、存在する場合はその最終変更日時です。
-
このテーブル内のチェック・ボックスを使用して、インポートするグローバルを選択します。
-
[インポート] を選択します。
-
-
最初のデータベースに戻り、“格納されているデータの削除” の説明に従って、グローバルを削除します。
クラス名の変更
スタジオには、クラスの名前を直接変更する方法は用意されていません。クラスの名前は、以下のどちらの方法でも変更できます。
-
クラスのコピーを作成し、元のクラスを削除します。
クラスをコピーするには、以下の手順を実行します。
-
[ツール]→[クラスをコピー] を選択します。
-
[クラス定義のコピー元] で、元のクラスを選択します。この値は、現在表示しているクラスの名前で初期化されます。
-
[コピー先] で、新しい完全なクラス名を指定します。
-
オプションで、[クラス名のインスタンスを置換] を選択します。これにより、そのクラス名のインスタンスが、コピーされたクラスのコード内で置換されます。これによって、他のクラスやコメントが変更されることはありません。
-
[OK] を選択します。
-
-
スタジオからクラスをエクスポートし、XML ファイルを編集し、それを再インポートし、その後で元のクラスを削除します。
エクスポートおよびインポートを行うには、“1 つのデータベースから別のデータベースへのコードの移動” の手順に従ってください。
エクスポートされるファイルの XML 構造はドキュメント化されていませんが、何を変更する必要があるのかは比較的簡単に特定できます。クラス名は、以下のようにファイルの先頭の近くにあります。
<Class name="MyPackage.MyClass">
クラス定義には、クラス名の追加の参照が含まれている場合があり、それも変更します。
どちらの場合でも、以下の操作も実行する必要があります。
-
クラスが永続クラスである場合、元のクラスで格納されていたデータはすべて削除または移動します。“格納されているデータの削除” を参照してください。または、“1 つのデータベースから別のデータベースへのコードの移動” の手順に従ってください。
-
古いクラスの参照を更新します。古い名前の参照を検索するには、Ctrl+Shift+f を使用します。
詳細
この章で説明したトピックの詳細は、以下を参照してください。
-
"Caché システム管理ガイド" には、管理ポータルの大部分の使用方法が記載されています。このドキュメントには、Caché サーバの構成、ネームスペースおよびデータベースの作成、マッピングの作成に関する情報が記載されています。
-
"スタジオの使用法" には、スタジオの使用方法が記載されています。
-
"ターミナルの使用法" には、ターミナルの使用方法が記載されています。
-
"Caché SQL の使用法" には、インデックスの構築、プログラムによるインデックスの構築、およびテーブルのチューニング機能の使用方法に関する詳細が記載されています。