Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

クエリ・キャッシュ

準備されたダイナミック SQL 文 (クエリ) のキャッシュがシステムに自動的に保持されます。これにより、クエリの最適化とクエリ・プランの作成のオーバーヘッドを繰り返すことなく、SQL クエリを再実行できます。クエリ・キャッシュは、特定の SQL 文がダイナミック SQL、ODBC、JDBC、または $SYSTEM.SQL.DDLImport() メソッドを使用して準備されたときに作成されます (管理ポータルの SQL 実行インタフェースInterSystems SQL シェル、および %SYSTEM.SQL.Execute()Opens in a new tab メソッドはダイナミック SQL を使用するため、クエリ・キャッシュを作成します)。非カーソルの埋め込み SQL 文では、クエリ・キャッシュは作成されません。

自動的にキャッシュされる SQL 文は、以下のとおりです。

  • SELECTSELECT クエリ・キャッシュは、そのテーブルの [カタログの詳細] に表示されます。クエリが複数のテーブルを参照する場合、参照先のテーブルごとに同じクエリ・キャッシュがリストされます。これらのテーブルのいずれか 1 つからクエリ・キャッシュを削除すると、そのクエリ・キャッシュは、すべてのテーブルから削除されます。テーブルの [カタログの詳細] から、クエリ・キャッシュの名前を選択すると、クエリ・キャッシュの詳細を表示できます。この詳細には、[実行] および [プラン表示] のオプションがあります。SELECT クエリ・キャッシュが DDLImport("CACHE")Opens in a new tab メソッドで作成された場合は、[実行] および [プラン表示] のオプションは使用できません。

    DECLARE name CURSOR FOR SELECT: クエリ・キャッシュを作成します。ただし、クエリ・キャッシュの詳細には、[実行] オプションと [プラン表示] オプションが含まれません。

  • INSERTUPDATEINSERT OR UPDATEDELETE:そのテーブルの [カタログの詳細] に表示されるクエリ・キャッシュを作成します。

  • TRUNCATE TABLE:ダイナミック SQL から発行されると、そのテーブルの [カタログの詳細] に表示されるクエリ・キャッシュを作成します。DDLImport("CACHE")Opens in a new tab は、TRUNCATE TABLE をサポートしていません。

  • CALL:そのスキーマの [クエリキャッシュ] リストに表示されるクエリ・キャッシュを作成します。

  • SET TRANSACTIONSTART TRANSACTION%INTRANSACTIONCOMMITROLLBACK:ネームスペース内のすべてのスキーマの [クエリキャッシュ] リストに表示されるクエリ・キャッシュを作成します。

クエリを準備すると、クエリ・キャッシュが作成されます。このため、ループ構造内では %Prepare() メソッドを使用しないことが重要です。同じクエリの (指定されたリテラル値のみが異なる) 次の %Prepare() は、新しいクエリ・キャッシュを作成する代わりに、既存のクエリ・キャッシュを使用します。列名エイリアスの変更や ORDER BY 節の変更など、クエリの最適化に影響しないような変更がクエリに加えられた場合は、異なるクエリ・キャッシュが作成されます。

クエリ・キャッシュを削除すると、キャッシュのクエリが削除されます。テーブル定義に変更を加えると、そのテーブルを参照するクエリは自動的に削除されます。Prepare または Purge を発行すると、システム全体の排他的なロックが自動的に要求され、同時にクエリ・キャッシュのメタデータが更新されます。システム管理者は、クエリ・キャッシュのロック・タイムアウト値を変更できます。

クエリ・キャッシュの作成はトランザクションの一部ではありません。クエリ・キャッシュの作成はジャーナルされません。

クエリ・キャッシュによるパフォーマンスの改善

最初にダイナミック SQL クエリを準備するときに、SQL エンジンはこれを最適化し、クエリを実行するプログラム (1 つ以上の Caché ルーチンのセット) を生成します。最適化されたクエリ・テキストは、その後、キャッシュ・クエリ・クラスとして格納されます。その後で同じ (または同様の) クエリを実行しようとすると、SQL エンジンは、そのクエリ・キャッシュを見つけて、そのコードを直接実行します。これにより、最適化とコード生成の必要がなくなります。

クエリ・キャッシュには、以下の利点があります。

  • その後、頻繁に使用されるクエリをより速く実行できます。さらに重要なこととして、このようなパフォーマンスの向上は自動的に実行でき、煩わしいストアド・プロシージャをコードする必要がありません。ほとんどのリレーショナル・データベース製品では、データベース・アクセスにストアド・プロシージャのみを使用することが推奨されていますが、Caché では、これは必要ありません。

  • 単一のクエリ・キャッシュが、複数の類似したクエリ、つまり、リテラル値のみが異なる複数のクエリのために使用されます。例えば、SELECT TOP 5 Name FROM Sample.Person WHERE Name %STARTSWITH 'A'SELECT TOP 1000 Name FROM Sample.Person WHERE Name %STARTSWITH 'Mc' は、TOP および %STARTSWITH 条件のリテラル値が異なるだけです。1 つ目のクエリ用に準備されたクエリ・キャッシュは、自動的に 2 つ目のクエリにも使用されます。

  • クエリ・キャッシュは、すべてのデータベース・ユーザの間で共有されます。したがって、ユーザ 1 がクエリを作成すれば、ユーザ 1023 がこれを使用できます。

  • クエリ・オプティマイザでは、最初にクエリが作成されたときにのみコストが発生するため、任意のクエリの最善の実行方法を自由に時間をかけて見つけることができます。

Caché SQL は、すべてのクエリ・キャッシュを CACHE データベースという 1 つの場所に格納します。ただし、クエリ・キャッシュはネームスペース固有のものです。各クエリ・キャッシュは、それが準備された (生成された) ネームスペースで識別されます。クエリ・キャッシュは、それが準備されたネームスペース内からのみ表示および実行できます。クエリ・キャッシュの削除は、現在のネームスペースまたはすべてのネームスペースに対して可能です。

クエリ・キャッシュには、コメントは含まれません。

埋め込み SQL 文はコンパイル時にインライン・コードで置換されるため、埋め込み SQL をキャッシュする必要はありません。

テーブル定義を使用する際のクエリ・キャッシュの使用については、このドキュメントの “SQL 文と凍結プラン” を参照してください。

クエリ・キャッシュの作成

Caché で Prepare を実行してクエリを準備する際には、以下のことが判断されます。

  1. 準備しているクエリが、クエリ・キャッシュ内に既に存在するクエリと一致しているか。一致していない場合、クエリにインクリメント・カウントが割り当てられます。

  2. クエリが正常に準備されているか。そうではない場合、クエリ・キャッシュ名にインクリメント・カウントは割り当てられません。

  3. 正常に準備されている場合、クエリ・キャッシュ名にインクリメント・カウントが割り当てられ、クエリがキャッシュされます。

クエリ・キャッシュの名前

SQL エンジンは、以下に示す形式で、各クエリ・キャッシュに一意のクラス名を割り当てます。

%sqlcq.namespace.clsnnn

この namespace は、現在のネームスペースです (大文字表記)。nnn は、連続する整数です。例えば、%sqlcq.USER.cls16 のようになります。

クエリ・キャッシュには、ネームスペース単位で 1 から始まる連続番号が付けられます。次に使用可能な nnn 連続番号は、既に予約または解除されている番号によって異なります。

  • クエリの準備を開始するときに、そのクエリが既存のクエリ・キャッシュに一致しない場合に、番号が予約されます。既存のクエリ・キャッシュとの違いがリテラル値だけの場合は、一致すると見なされます。ただし、リテラル置換の抑制や “個別のクエリ・キャッシュ” で説明されている状況など、その他の事項も考慮されます。

  • クエリが正常に準備されていない場合、番号は予約されますが、割り当てられることはありません。Prepare が成功したクエリのみがキャッシュされます。

  • クエリが正常に準備されると、番号が予約されてクエリ・キャッシュに割り当てられます。このクエリ・キャッシュは、クエリで参照されるテーブルごとにリストされます。これは、そのテーブルからデータ・アクセスがあるかどうかに関係ありません。いずれのテーブルも参照しないクエリの場合、クエリ・キャッシュは作成されますが、テーブルでクエリ・キャッシュをリストすることも削除することもできません。

  • クエリ・キャッシュが削除された場合、番号が解除されます。この番号は、次の nnn 連続番号として使用可能になります。テーブルに関連付けられている個々のクエリ・キャッシュの削除、または 1 つのテーブルのすべてのクエリ・キャッシュの削除により、これらのクエリ・キャッシュに割り当てられていた番号が解除されます。ネームスペース内のすべてのクエリ・キャッシュの削除によって、テーブルを参照しないクエリ・キャッシュを含め、クエリ・キャッシュに割り当てられていたすべての番号と、割り当てられていないが予約されていたすべての番号が解除されます。

    クエリ・キャッシュを削除すると、整数 nnn はリセットされます。整数は再使用されますが、残されているクエリ・キャッシュが再番号付けされることはありません。例えば、クエリ・キャッシュの部分的な削除により、cls1cls3cls4、および cls7 が残されているとします。その後のクエリ・キャッシュに付けられる番号は、cls2cls5cls6、および cls8 になります。

CALL 文を使用すると、複数のクエリ・キャッシュが生成される場合があります。例えば、SQL 文 CALL Sample.PersonSets('A','MA') では、以下のクエリ・キャッシュが生成されます。

%sqlcq.USER.cls1: CALL Sample . PersonSets ( ? , ? )
%sqlcq.USER.cls2: SELECT name , dob , spouse FROM sample . person 
                     WHERE name %STARTSWITH ? ORDER BY 1
%sqlcq.USER.cls3: SELECT name , age , home_city , home_state 
                     FROM sample . person WHERE home_state = ? ORDER BY 4 , 1

ダイナミック SQL では、SQL クエリを準備 (%Prepare() インスタンス・メソッドまたは %PrepareClassQuery() インスタンス・メソッドを使用) した後で、%Display()Opens in a new tab インスタンス・メソッドまたは %GetImplementationDetails()Opens in a new tab インスタンス・メソッドを使用すると、クエリ・キャッシュ名を返せるようになります。"作成が成功した場合の結果" を参照してください。

クエリ・キャッシュ名は、%SQL.StatementOpens in a new tab クラス (および %CurrentResultOpens in a new tab プロパティ) の %Execute()Opens in a new tab インスタンス・メソッドによって返される結果セット oref のコンポーネントでもあります。以下のサンプルでは、クエリ・キャッシュ名を判断する上記の両方のメソッドを示しています。

  SET randtop=$RANDOM(10)+1
  SET randage=$RANDOM(40)+1
  SET myquery = "SELECT TOP ? Name,Age FROM Sample.Person WHERE Age < ?"
  SET tStatement = ##class(%SQL.Statement).%New()
  SET qStatus = tStatement.%Prepare(myquery)
   IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
  SET x = tStatement.%GetImplementationDetails(.class,.text,.args)
  IF x=1 { WRITE "cached query name is: ",class,! }
  SET rset = tStatement.%Execute(randtop,randage)
  WRITE "result set oref: ",rset.%CurrentResult,!
  DO rset.%Display()
  WRITE !,"A sample of ",randtop," rows, with age < ",randage

この例では、選択された行の数 (TOP 節) および WHERE 節の述語の値は、クエリが呼び出されるたびに変更されますが、クエリ・キャッシュ名は変更されません。

個別のクエリ・キャッシュ

2 つのクエリ間で次のような相違がある場合は、クエリの最適化に影響を与えることはないにもかかわらず、個別のクエリ・キャッシュが生成されます。

  • 同一の関数の異なる構文形式では、個別のクエリ・キャッシュが生成されます。つまり、ASCII('x'){fn ASCII('x')} では、個別のクエリ・キャッシュが生成され、{fn CURDATE()}{fn CURDATE} では、個別のクエリ・キャッシュが生成されることになります。

  • 大文字と小文字を区別するテーブル・エイリアスまたは列エイリアスの値、およびオプションの AS キーワードの有無によって、個別のクエリ・キャッシュが生成されます。つまり、ASCII('x')ASCII('x') AChar、および ASCII('x') AS AChar では、個別のクエリ・キャッシュが生成されることになります。

  • 使用している ORDER BY 節が異なる場合。

  • TOP と整数値ではなく、TOP ALL を使用している場合。

リテラル置換

SQL エンジンは、ダイナミック SQL クエリをキャッシュするときに、リテラル置換を実行します。クエリ・キャッシュ内のクエリは、入力パラメータを表す “?” 文字で各リテラルを表現します。そのため、リテラル値のみが異なるクエリは、単一のクエリ・キャッシュで表現されることになります。例えば、以下の 2 つのクエリがあるとします。

SELECT TOP 11 Name FROM Sample.Person WHERE Name %STARTSWITH 'A'
SELECT TOP 5 Name FROM Sample.Person WHERE Name %STARTSWITH 'Mc'

これらは、以下の単一のクエリ・キャッシュで表現されます。

SELECT TOP ? Name FROM Sample.Person WHERE Name %STARTSWITH ?

これにより、クエリ・キャッシュのサイズが最小化され、リテラル値のみが異なるクエリに対してクエリの最適化を実行する必要がなくなります。

入力ホスト変数 (例えば、:myvar) と ? 入力パラメータを使用して指定するリテラル値も、対応するクエリ・キャッシュ内では “?” 文字で表現されます。このため、クエリ SELECT Name FROM t1 WHERE Name='Adam'SELECT Name FROM t1 WHERE Name=?、および SELECT Name FROM t1 WHERE Name=:namevar はすべて、一致クエリとなり、単一のクエリ・キャッシュが生成されます。

%GetImplementationDetails() メソッドを使用すると、特定の準備の各 “?” 文字が、どのエンティティを表しているかについて判断できます。

リテラル置換に適用される考慮事項は以下のとおりです。

  • リテラルの一部として指定されるプラス符号とマイナス符号によって、個別のクエリ・キャッシュが生成されます。つまり、ABS(7)ABS(-7)、および ABS(+7) では、それぞれ個別のクエリ・キャッシュが生成されます。ABS(+?)ABS(++?) など、複数の記号でも個別のクエリ・キャッシュが生成されます。このため、個別のクエリ・キャッシュが生成されることなく符号ありと符号なしの数値を指定できる符号なしの変数 ABS(?) または ABS(:num) を使用することをお勧めします。

  • 有効桁数と小数桁数の値には、通常、リテラル置換が行われません。つまり、ROUND(567.89,2) は、ROUND(?,2) としてキャッシュされることになります。ただし、CURRENT_TIME(n)CURRENT_TIMESTAMP(n)GETDATE(n)、および GETUTCDATE(n) におけるオプションの有効桁数の値には、リテラル置換が行われます。

  • ブーリアン・フラグには、リテラル置換が行われません。つまり、ROUND(567.89,2,0) は、ROUND(?,2,0) としてキャッシュされ、ROUND(567.89,2,1) は、ROUND(?,2,1) としてキャッシュされることになります。

  • IS NULL または IS NOT NULL 条件で使用されるリテラルには、リテラル置換が行われません。

  • ORDER BY 節で使用されるリテラルには、リテラル置換が行われません。これは、ORDER BY は整数を使用して列の位置を指定できるためです。この整数が変わると、クエリはまったく異なる結果になります。

  • アルファベット・リテラルは、一重引用符で囲む必要があります。一部の関数では、引用符の有無にかかわらずアルファベット形式のコードの指定を許可しています。リテラル置換は、引用符で囲まれたアルファベット形式のコードにのみ行われます。つまり、DATENAME(MONTH,63120)DATENAME('MONTH',63120) には、機能的な違いはありませんが、それらに対応するクエリ・キャッシュは DATENAME(MONTH,?)DATENAME(?,?) になるということです。

  • 可変個数の引数を受け取る関数は、引数の個数ごとに個別のクエリ・キャッシュを生成します。つまり、COALESCE(1,2)COALESCE(1,2,3) には、個別のクエリ・キャッシュが生成されることになります。

リテラル置換とパフォーマンス

SQL エンジンは、IN 述語の各値のリテラル置換を実行します。IN 述語の値が多数あると、クエリ・キャッシュのパフォーマンスに悪影響を及ぼすことがあります。IN 述語の値が可変個数の場合は、クエリ・キャッシュが複数になることがあります。IN 述語を %INLIST 述語に変換すると、リストされた値の数にかかわらず、1 つのリテラル置換のみを伴う述語になります。%INLIST には、桁数を表す SIZE 引数も指定します。SQL は、この引数を使用してパフォーマンスを最適化します。

リテラル置換の抑制

このリテラル置換は、抑制できます。リテラル値に対して最適化を行い、そのリテラル値を持つクエリの個別クエリ・キャッシュを作成することが必要となる状況があります。リテラル置換を抑制するには、リテラル値を二重の括弧で囲みます。詳細は、以下の例を参照してください。

SELECT TOP 11 Name FROM Sample.Person WHERE Name %STARTSWITH (('A'))

異なる %STARTSWITH の値を指定すると、個別のクエリ・キャッシュが生成されます。リテラル置換の抑制が、リテラルごとに個別に指定されていることに注意してください。上記の例では、異なる TOP の値を指定しても、個別のクエリ・キャッシュは生成されません。

符号付き数値のリテラル置換を抑制するには、ABS(-((7))) などの構文を指定します。

Note:

別の数の括弧で囲っていても、状況によっては、リテラル置換を抑制できることがあります。インターシステムズでは、これを目的とした最も明確で一貫性のある構文として、常に二重の括弧を使用することをお勧めします。

キャッシュ・クエリの結果セット

キャッシュ・クエリを実行すると、結果セットが作成されます。キャッシュ・クエリの結果セットはオブジェクト・インスタンスです。つまり、リテラル置換の入力パラメータに指定した値はオブジェクト・プロパティとして格納されます。これらのオブジェクト・プロパティは i%PropName 構文を使用して参照されます。

既存のクエリ・キャッシュ

既存のクエリ・キャッシュをカウントおよび表示できます。現在のネームスペースのクエリ・キャッシュを参照するには、次の 2 つの方法があります。

  • Caché 管理ポータルを使用して表示する

  • ExportSQL^%qarDDLExport ユーティリティを使用してファイルにリストする

クエリ・キャッシュのカウント

%Library.SQLCatalogOpens in a new tab クラスの GetCachedQueryTableCount()Opens in a new tab メソッドを呼び出すことで、テーブルの現在のクエリ・キャッシュ数を特定できます。詳細は、以下の例を参照してください。

  ZNSPACE "Samples"
  SET tbl="Sample.Person"
  SET num=##class(%Library.SQLCatalog).GetCachedQueryTableCount(tbl)
  IF num=0 {WRITE "There are no cached queries for ",tbl }
  ELSE {WRITE tbl," is associated with ",num," cached queries" }

クエリ・キャッシュを表示する

Caché 管理ポータルから、クエリ・キャッシュの内容を確認して管理できます。[システム・エクスプローラ] から [SQL] (システム, SQL) を選択します。ページ上部の [切り替え] オプションを使ってネームスペースを選択します。利用可能なネームスペースのリストが表示されます。画面の左側で、[クエリキャッシュ] フォルダを開きます。いずれかのクエリ・キャッシュを選択すると、その詳細が表示されます。

[クエリタイプ] は、以下の値のいずれかとなります。

  • %SQL.Statement or %ResultSet.SQL Dynamic SQL%SQL.Statement または %ResultSet.SQL を使用するダイナミック SQL クエリ。

  • %Library.ResultSet Dynamic SQL%Library.ResultSet を使用するダイナミック SQL クエリ。

  • ODBC/JDBC Statement:ODBC または JDBC のどちらかからのダイナミック・クエリ。

SQL 文を正常に準備すると、その文を実装する新しいクラスが生成されます。[クエリキャッシュ - ソースの保存] 構成オプションを設定している場合、この生成されたクラスのソース・コードが維持され、スタジオを使用してソース・コードを開いて調べることができます。そのためには、Caché 管理ポータルに移動します。[システム管理] から、[構成][SQL およびオブジェクトの設定][一般SQL設定] (システム, 構成, 一般SQL設定) を選択します。この画面で、[クエリキャッシュ - ソースの保存] オプションを設定できます。このオプションが設定されていない場合 (既定)、そのクラスが生成されて配置されますが、ソース・コードは保存されません。

クエリ・キャッシュをファイルにリストする

次のユーティリティは、現在のネームスペースのすべてのクエリ・キャッシュをテキスト・ファイルにリストします。

ExportSQL^%qarDDLExport(file,fileOpenParam,eos,cachedQueries,classQueries,classMethods,routines,display)
file クエリ・キャッシュをリストするファイルのパス名。引用符で囲んだ文字列で指定します。ファイルが存在しない場合は、作成されます。ファイルが既に存在する場合は、Caché によりファイルが上書きされます。
fileOpenParam オプション — ファイルの OPEN モード・パラメータ。引用符で囲んだ文字列で指定します。既定は “WNS” です。“W” は、ファイルを書き込み用に開くように指定します。“N” は、ファイルが存在しない場合に、この名前を持つ新規のシーケンシャル・ファイルを作成するように指定します。“S” は、既定ターミネータとしてキャリッジ・リターン、改行、または改ページを使用するストリーム形式を指定します。OPEN モード・パラメータの完全なリストは、"Caché 入出力デバイス・ガイド" の “シーケンシャル・ファイルの入出力” の章を参照してください。
eos オプション — リスト内の個々のクエリ・キャッシュを分離するために使用される文末区切り文字。引用符で囲んだ文字列で指定します。既定は “GO” です。
cachedQueries オプション — クエリ・キャッシュのすべての SQL クエリを file にエクスポートします。ブーリアン・フラグです。既定値は 1 です。
classQueries オプション — SQL クラス・クエリのすべての SQL クエリを file にエクスポートします。ブーリアン・フラグです。既定値は 1 です。
classMethods オプション — クラス・メソッドの埋め込み SQL クエリを file にエクスポートします。ブーリアン・フラグです。既定値は 1 です。
routines オプション — MAC ルーチンの埋め込み SQL クエリを file にエクスポートします。このリストには、システム・ルーチン、クエリ・キャッシュ、および生成されたルーチンは含まれません。ブーリアン・フラグです。既定値は 1 です。
display オプション — ターミナル画面にエクスポートの進行状況を表示します。ブーリアン・フラグです。既定値は 0 です。

以下は、このクエリ・キャッシュ・エクスポート・ユーティリティを呼び出す例です。

  DO ExportSQL^%qarDDLExport("C:\temp\test\qcache.txt","WNS","GO",1,1,1,1,1)

ターミナルのコマンド行で display=1 を指定して実行すると、次の例のようにエクスポートの進行状況がターミナル画面に表示されます。

Export SQL Text for Cached Query: %sqlcq.SAMPLES.cls14..                Done
Export SQL Text for Cached Query: %sqlcq.SAMPLES.cls16..                Done
Export SQL Text for Cached Query: %sqlcq.SAMPLES.cls17..                Done
Export SQL Text for Cached Query: %sqlcq.SAMPLES.cls18..                Done
Export SQL Text for Cached Query: %sqlcq.SAMPLES.cls19..                Done
Export SQL statement for Class Query: Cinema.Film.TopCategory...        Done
Export SQL statement for Class Query: Cinema.Film.TopFilms...           Done
Export SQL statement for Class Query: Cinema.FilmCategory.CategoryName...Done
Export SQL statement for Class Query: Cinema.Show.ShowTimes...          Done
Export SQL statement for Class Query: Cinema.TicketItem.ShowItem...     Done
Export SQL statement from Class Method: Aviation.EventCube.Fact.%BuildAllFacts...Done
Export SQL statement from Class Method: Aviation.EventCube.Fact.%BuildTempFile...Done
Export SQL statement from Class Method: Aviation.EventCube.Fact.%Count...Done
Export SQL statement from Class Method: Aviation.EventCube.Fact.%DeleteFact...Done
Export SQL statement from Class Method: Aviation.EventCube.Fact.%ProcessFact...Done
Export SQL statement from Class Method: Aviation.EventCube.Fact.%UpdateFacts...Done
Export SQL statement from Class Method: Aviation.EventCube.Star1032357136.%Count...Done
Export SQL statement from Class Method: Aviation.EventCube.Star1032357136.%GetDimensionProperty...Done
Export SQL statement from Class Method: Aviation.EventCube.Star1035531339.%Count...Done
Export SQL statement from Class Method: Aviation.EventCube.Star1035531339.%GetDimensionProperty...Done

20 SQL statements exported to script file C:\temp\test\qcache.txt

作成されたエクスポート・ファイルには、次のようなエントリが含まれています。

  -- SQL statement from Cached Query %sqlcq.SAMPLES.cls30
  SELECT TOP ? Name , Home_State , Age , AVG ( Age ) AS AvgAge FROM Sample . Person ORDER BY Home_State
GO

  -- SQL statement from Class Query Cinema.Film.TopCategory
#import Cinema
SELECT TOP 3 ID, Description, Length, Rating, Title, Category->CategoryName
  FROM Film
  WHERE (PlayingNow = 1) AND (Category = :P1)
  ORDER BY TicketsSold DESC
GO
  -- SQL statement(s) from Class Method Aviation.EventCube.Fact.%Count
#import Aviation.EventCube
SELECT COUNT(*) INTO :tCount FROM Aviation_EventCube.Fact
GO

このクエリ・キャッシュのリストは、クエリ最適化プラン・ユーティリティへの入力として使用できます。

クエリ・キャッシュの実行

  • ダイナミック SQL からの場合 : %SQL.StatementOpens in a new tab Prepare 操作 (%Prepare()%PrepareClassQuery()、または %ExecDirect()) によってクエリ・キャッシュが作成されます。同じインスタンスを使用するダイナミック SQL %Execute() メソッドが、最後に準備されたクエリ・キャッシュを実行します。

  • ターミナルからの場合 : $SYSTEM.SQL クラスの ExecuteCachedQuery()Opens in a new tab メソッドを使用して、クエリ・キャッシュを直接実行できます。このメソッドでは、入力パラメータ値を指定したり、出力する行数を制限したりできます。ターミナルのコマンド行からダイナミック SQL %SQL.StatementOpens in a new tab クエリ・キャッシュまたは xDBC クエリ・キャッシュを実行できます。この方法は、主に、データの限定されたサブセットを使って既存のクエリ・キャッシュをテストするときに役立ちます。

  • 管理ポータルの SQL インタフェースからの場合 :前述の “クエリ・キャッシュを表示する” の手順に従います。選択したクエリ・キャッシュの [カタログの詳細] タブから、[実行] リンクをクリックします。

クエリ・キャッシュのロック

Prepare 文または Purge 文を発行すると、システム全体の排他的なロックが自動的に要求され、同時にクエリ・キャッシュのメタデータが更新されます。SQL は、SetCachedQueryLockTimeout()Opens in a new tab メソッドをサポートしています。このメソッドは、クエリ・キャッシュのメタデータに対するロックの取得を試行するときに、ロック・タイムアウトを制御します。既定値は 120 秒です。これは、標準の SQL のロック・タイムアウト (既定値は 10 秒) よりも、大幅に長い時間になります。大量の Prepare 操作と Purge 操作が同時に行われるシステムでは、システム管理者は、このクエリ・キャッシュのロック・タイムアウトを変更することが必要になる可能性があります。特に、大量の (数千の) クエリ・キャッシュが関与する一括削除を実行するシステムでは、この必要性が高くなります。

次に示す SetCachedQueryLockTimeout() メソッドは、システム全体のタイムアウト値を設定して、直前の値を返します。

SetCQTimeout
   DO $SYSTEM.SQL.SetCachedQueryLockTimeout(150,.oldval)
   WRITE oldval," prior value cached query seconds",!!
SetCQTimeoutAgain
   DO $SYSTEM.SQL.SetCachedQueryLockTimeout(180,.oldval2)
   WRITE oldval2," prior value cached query seconds",!!
ResetCQTimeoutToDefault
   DO $SYSTEM.SQL.SetCachedQueryLockTimeout(,.oldval3)
   WRITE oldval3," prior value cached query seconds"

SetCachedQueryLockTimeout() は、システム全体のすべての新しいプロセスに対するクエリ・キャッシュのロック・タイムアウトを設定します。既存のプロセスに対するクエリ・キャッシュのロック・タイムアウトは変更されません。

クエリ・キャッシュの削除

テーブル定義を変更 (または削除) すると、このテーブルを基にしたクエリは、自動的にローカル・システム上のクエリ・キャッシュから削除されます。永続クラスをリコンパイルすると、そのクラスを使用するすべてのクエリは、自動的にローカル・システム上のクエリ・キャッシュから削除されます。

$SYSTEM.SQL.Purge(n)Opens in a new tab メソッドを使用して、最近使用されていないクエリ・キャッシュを明示的に削除できます。日数 n を指定することで、現在のネームスペース内のクエリ・キャッシュの中で、過去 n 日以内に使用 (準備) されていないものをすべて削除できます。n の値に 0 または "" を指定すると、現在のネームスペースのすべてのクエリ・キャッシュを削除します。例えば、2014 年 5 月 11 日に $SYSTEM.SQL.Purge(30) メソッドを発行した場合は、このメソッドによって、最終使用日が 2014 年 4 月 11 日より前のクエリ・キャッシュのみが削除されます。最終使用日が正確に 30 日前 (この例では、4 月 11 日) のクエリ・キャッシュは削除されません。

また、以下のメソッドを使用してもクエリ・キャッシュを削除できます。

  • $SYSTEM.SQL.PurgeCQClass()Opens in a new tab は、現在のネームスペース内の 1 つまたは複数のクエリ・キャッシュを名前で削除します。クエリ・キャッシュ名は、コンマ区切りのリストで指定できます。指定したクエリ・キャッシュ名またはクエリ・キャッシュ名リストは、引用符で囲む必要があります。

  • $SYSTEM.SQL.PurgeForTable()Opens in a new tab は、指定されたテーブルを参照する、現在のネームスペース内のクエリ・キャッシュをすべて削除します。

  • $SYSTEM.SQL.PurgeAllNamespaces()Opens in a new tab は、現在のシステム上にあるすべてのネームスペース内のすべてのクエリ・キャッシュを削除します。ネームスペースを削除しても、そのネームスペースに関連付けられたクエリ・キャッシュは削除されません。PurgeAllNamespaces() を実行して、既に存在していないネームスペースに関連付けられたクエリ・キャッシュがあるかどうかを確認します。該当するクエリ・キャッシュは削除されます。

クエリ・キャッシュを削除すると、関連するクエリ・パフォーマンス統計 (SQLStats) も削除されます。

Caution:

システム全体のデフォルト・スキーマ名を変更すると、システム上のすべてのネームスペースのすべてのクエリ・キャッシュが自動的に削除されます。

リモート・システム

ローカル・システム上のクエリ・キャッシュを削除しても、そのクエリ・キャッシュのシャドウ・システム上のコピーやミラー・システム上のコピーは削除されません。削除されたクエリ・キャッシュのリモート・システム上のコピーは、手動で削除する必要があります。

永続クラスに変更を加えてリコンパイルすると、そのクラスに基づいたローカルのクエリ・キャッシュは自動的に削除されます。Caché は、これに該当するクエリ・キャッシュのリモート・システム上のコピーを自動的に削除することはありません。そのため、リモート・システム上のいくつかのクエリ・キャッシュは「期限切れ」(既に無効) になっている可能性があります。ただし、リモート・システムは、クエリ・キャッシュを使用しようとするときに、クエリが参照する永続クラスのいずれかがリコンパイルされているかどうかを確認します。ローカル・システム上の永続クラスがリコンパイルされている場合、リモート・システムは、期限切れのクエリ・キャッシュを使用しようとする前に、そのクエリ・キャッシュを削除して再作成します。

キャッシュされない SQL 文

以下の非クエリ SQL 文はキャッシュされません。これらは使用した直後に削除されます。

  • データ定義言語 (DDL) 文:CREATE TABLE、ALTER TABLE、DROP TABLE、CREATE VIEW、ALTER VIEW、DROP VIEW、CREATE INDEX、DROP INDEX、CREATE FUNCTION、CREATE METHOD、CREATE PROCEDURE、CREATE QUERY、DROP FUNCTION、DROP METHOD、DROP PROCEDURE、DROP QUERY、CREATE TRIGGER、DROP TRIGGER、CREATE DATABASE、USE DATABASE、DROP DATABASE

  • ユーザ、ロール、および特権の文:CREATE USER、ALTER USER、DROP USER、CREATE ROLE、DROP ROLE、GRANT、REVOKE、%CHECKPRIV

  • ロックの文:LOCK TABLE、UNLOCK TABLE

  • その他:SAVEPOINT、SET OPTION

管理ポータルの [クエリ実行] インタフェースからこれらの SQL 文のいずれかを発行する場合は、[パフォーマンス] 情報に Class: %sqlcq.SAMPLES.cls16 のようなテキストが含まれます。これは、クエリ・キャッシュ名が割り当てられたことを示すために表示されます。ただし、クエリ・キャッシュは作成されず、クエリ・キャッシュの増分番号 .cls16 は確保されません。Caché SQL は、次に発行するクエリの Prepare を実行する SQL 文に、この番号を割り当てます。

FeedbackOpens in a new tab