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?

$PREFETCHON

指定されたグローバルの事前フェッチを確立します。

Synopsis

$PREFETCHON(gref,gref2)

パラメータ

gref グローバル参照。
gref2 オプション — 範囲の指定に使用するグローバル参照。

説明

$PREFETCHON は、グローバルまたはグローバルの範囲に対して事前フェッチを有効にすることでパフォーマンスを高めます。$PREFETCHON は、正常に終了する (事前フェッチが有効になる) と 1 を返します。$PREFETCHON は、指定された事前フェッチを確立できなかった場合は 0 を返します。指定された範囲に 2 つの異なるグローバル名が含まれているか、事前フェッチを妨げる他の問題がある場合は、0 が返されることがあります。返り値 0 はエラーではありません。これによってプログラムの実行に割り込みが発生することはなく、指定された範囲内のグローバル参照の処理に障害が生じることもありません。それは、単に、それらのグローバル操作で事前フェッチによってパフォーマンスが向上することはないことを意味します。

Note:

グローバルの事前フェッチは、リモート・データベースではサポートされていません。

$PREFETCHOFF は事前フェッチを無効にします。

$PREFETCHON には、以下の 2 つの形式があります。

  • $PREFETCHON(gref) は、gref ノードとそのすべての下位ノードを事前フェッチします。例えば、$PREFETCHON(^abc(4)) は、^abc(4) のすべての下位ノードである、^abc(4,1)、^abc(4,2,2) などを事前フェッチします。この場合、^abc(5) は事前フェッチされません。

  • $PREFETCHON(gref,gref2) は、gref から gref2 までの範囲のノードを事前フェッチします。これには、gref2 の下位ノードは含まれません。gref および gref2 は同じグローバルのノードである必要があります。例えば、$PREFETCHON(^abc(4),^abc(7,5)) は、^abc(4) から ^abc(7,5) の範囲のグローバル・ノードをすべて事前フェッチします。これには、^abc(4,2,2)、^abc(5)、および ^abc(7,1,2) が含まれます。ただし、この場合、^abc(7,5,1) は事前フェッチされません。

事前フェッチは、読み取りアクセスのみに制限されているわけではなく、多数の SET 操作が実行されている場合も正常に機能します。

事前フェッチとパフォーマンス

$PREFETCHON を呼び出すと、1 つ以上の事前フェッチ・バックグラウンド・プロセス (デーモン) が必要に応じて開始されます。これらの事前フェッチ・デーモンは、すべてのプロセスによってシステム全体で共有されます。それぞれの事前フェッチ・デーモンは事前フェッチ要求を 1 つずつしか処理できないため、通常は、システム上で複数の事前フェッチ・デーモンを実行しておくことをお勧めします。ただし、多数の並列事前フェッチ・デーモンは、インタラクティブ・システム・アクセスに影響を与える可能性があります。

同じグローバル・ツリーのノードを含む多数のディスク・ブロックを読み取るアプリケーションを実行している場合、事前フェッチにより、パフォーマンスを向上させることができます。事前フェッチが最も効率的なのは、以下の場合です。

  • データに通常は昇順でアクセスする場合。つまり、グローバル・ツリーのデータ・ブロックに、通常は左から右へ順にアクセスする場合。ただし、必ずしも昇順でなければならないというわけではありません。事前フェッチが最適に動作するのは、グローバル・ツリーのデータ・ブロックに、通常は左から右へ順にアクセスする場合、または範囲内の少なくとも 1 つのデータ・ブロックに、論理ツリー内でその右横にあるほとんどのデータ・ブロックよりも先にアクセスする可能性が高い場合です。

  • 指定された範囲のほとんどのデータ・ブロックにアクセスする場合。ただし、ユーザが、データのごく一部にアクセスした後で操作をキャンセルすると、初期の事前フェッチで以降のフェッチと同じ数のブロックはフェッチされません。

  • 一度にアクティブにする事前フェッチの数が 100 未満の場合。

パラメータ

gref

グローバル参照は、グローバルまたはプロセス・プライベート・グローバルのいずれかです。グローバルは、事前フェッチを確立する時点では、定義の必要はありません。

このグローバルは @ 間接演算を使用して指定できます。"Caché ObjectScript の使用法" の "間接演算" を参照してください。

このパラメータには、構造化システム変数名 (SSVN) を指定することはできません。

gref2

gref で範囲の指定に使用するグローバル参照。したがって、gref2gref と同じグローバル・ツリーの下位のグローバル・ノードである必要があります。

このグローバルは @ 間接演算を使用して指定できます。"Caché ObjectScript の使用法" の "間接演算" を参照してください。

以下の例は、グローバル ^a に対する事前フェッチを確立します。

  SET ^a="myglobal"
  SET x=^a
  SET ret=$PREFETCHON(^a)
  IF ret=1 { WRITE !,"prefetch established" }
  ELSE { WRITE !,"prefetch not established" }
  SET ret=$PREFETCHOFF()

以下の例は、グローバル ^||a(1) から ^a||(50) の範囲に対する事前フェッチを確立します。

  SET ret=$PREFETCHON(^||a(1),^||a(50))
  IF ret=1 { WRITE !,"prefetch established" }
  ELSE { WRITE !,"prefetch not established" }

関連項目

FeedbackOpens in a new tab