大規模なグローバル配列のキー レベルをスキャンする 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 つしかないため、これを経験的にテストするのに問題があり、キャッシュをクリアするためにオフラインにすることはできません。キャッシュからのパフォーマンスではなく、ディスクからのパフォーマンスに最も関心があります。