1

大規模なグローバル配列のキー レベルをスキャンする 2 つの方法から選択でき、一方の方法が他方よりも効率的かどうかを判断しようとしています。

これは、Intersystems Caché データベース プラットフォーム上のベンダー提供のアプリケーションおよびデータベースです。これは、古い MUMPS スタイルで記述されており、Caché のオブジェクト永続化機能を使用していません。すべてのデータはグローバルに直接格納され、インデックスはアプリケーションで維持されます。

最初のレコードに子レコードの数が含まれ、次に各子レコードに次のキー レベルで順番に番号が付けられる、エンティティに関連付けられたデータ要素を繰り返すための一般的な規則があります。例えば:

^GBDATA(12345,100)="3"
^GBDATA(12345,100,1)="A^Record"
^GBDATA(12345,100,2)="B^Record"
^GBDATA(12345,100,3)="C^Record"

「12345」はエンティティ キーで、「100」は添付された詳細タイプの 1 つです。他のキーがない最初の「100」レコードには、サブレコードの数があることに注意してください。0 から数百のサブレコードがアタッチされている可能性があります。多くの場合、エンティティは非常に広く、このサブレコード タイプ以外にも多くのデータがあります (例には示されていません)。

エンティティ キーを指定して、1 つの型のすべてのサブレコードをスキャンしたいと考えています。$ORDER を使用してサブキーを調べたり、FOR ループを使用してキーの値を予測したりする方が速いでしょうか? それは問題ですか?

$ORDER メソッド:

SET EKEY=12345
SET SEQ=""

FOR
{
 SET SEQ=$ORDER(^GBDATA(EKEY,100,SEQ), 1, ROWDATA)
 QUIT:SEQ=""

 WRITE ROWDATA,!
}

FOR カウント方法:

SET EKEY=12345
SET LIM=^GBDATA(EKEY,100)

FOR SEQ=1:1:LIM
{
 WRITE ^GBDATA(EKEY,100,SEQ),!
}

$ORDER と $GET が Caché の内部でどのように実装されているか知っている人はいますか?

適切なデータを持つ実稼働インスタンスが 1 つしかないため、これを経験的にテストするのに問題があり、キャッシュをクリアするためにオフラインにすることはできません。キャッシュからのパフォーマンスではなく、ディスクからのパフォーマンスに最も関心があります。

4

2 に答える 2

1

%SYS.MONLBL を使用して、明確に把握できます。私の推測では、$ORDER の方がわずかに優れていると思います。

http://docs.intersystems.com/cache20122/csp/docbook/DocBook.UI.Page.cls?KEY=GCM_monlbl

于 2012-11-20T20:48:17.650 に答える
0

あなたの質問に関して、「$ORDER と $GET が Caché の内部でどのように実装されているか知っている人はいますか?」両者はまったく別の機能です。$Order は、^Global を確認するときに進む方向に使用されます。$Get は、^Global 内のデータをプルするために使用されます。以下はその使用例です。私は Cache ObjectScript を使用しています。ただし、これで一般的なアイデアが得られるはずです

グローバル構造

^People(LastName,FirstName)="Phone"

グローバルデータ

^People(Doe,John)="1035001234"
^People(Smith,Jane)="7405241305"
^People(Wood,Edgar)="7555127598"

コードサンプル

SET LASTNAME=0
FOR QUIT:LASTNAME?." "  DO
.SET LASTNAME=$ORDER(^People(LASTNAME)) QUIT:LASTNAME?." "
.SET FIRSTNAME=0
.FOR QUIT:FIRSTNAME?." "  DO
..SET FIRSTNAME=$ORDER(^People(LASTNAME,FIRSTNAME)) QUIT:FIRSTNAME?." "
..SET PHONE=$GET(^People(LASTNAME,FIRSTNAME))

上記のサンプルでは、​​^People グローバル内の最初のレコードから開始し、$Order を使用して姓内の最初のレコードから開始します。次に、電話番号である ^People(LASTNAME,FIRSTNAME) ノードのデータを $Get します。

いくつかのサンプルと参照領域については、次のリンクを確認してください。

$情報を取得

$注文情報

于 2013-08-21T20:05:47.957 に答える