6

バックグラウンド

eselinqというGoogleCodeプロジェクトで、ESEから.NETおよびLINQへのアダプターを作成しています。私が理解できない重要な関数の1つは、テーブルに定義されているインデックスのリストを取得する方法です。LINQ部分がインデックスを使用できる時期を自動的に判断できるように、使用可能なインデックスを一覧表示できるようにする必要があります。これにより、適切なインデックスが見つかった場合に、ユーザークエリの計画がはるかに効率的になります。

インデックス情報をクエリするための2つの関連する関数があります。

これらは、関連するテーブルの指定方法(名前またはテーブルID)のみが異なります。これらは私が望む機能をサポートするように思えますが、すべての情報レベルでは、情報を照会するための特定のインデックスがすでにある必要があるようです。唯一の例外はですがJET_IdxInfoCount、それは存在するインデックスの数だけをカウントします。

JET_IdxInfoそのJET_INDEXLIST音はもっともらしいですが、特定のインデックスの列のみをリストします。

代替案

データベーステーブルに対応する.NETタイプの注釈など、別の方法でインデックス情報を取得したり、事前にインデックスマッピングを提供するように要求したりできることを認識しています。この1つの関数を除いて、ユーザーが追加情報を提供しなくても、他のすべてをすぐに機能させるのに十分なイントロスペクションが実装されていると思います。

別のオプションは、システムテーブルを調べて、関連するインデックスオブジェクトを見つけることですが、これは、文書化されていないインターフェイスに依存することを意味します。

この質問を満たすために、テーブルのインデックス(名前だけで十分です)を列挙するサポートされた方法が必要です。

4

1 に答える 1

6

JetGetTableIndexInfoとJetGetIndexInfoおよびJET_IdxInfoについては正しいです。ツイストは、データがやや複雑に返されることです。インデックスの行と、テーブルの各列の行を含む一時テーブルが返されます。インデックス名を取得するには、列の行をスキップする必要があります(列の数は、最初の行のcolumnidcColumn列の値で示されます)。

これを解読する方法の.NETの例については、ManagedEsentプロジェクトを参照してください。MetaDataHelpers.csファイルには、一時テーブルからすべてのデータを抽出するGetIndexInfoFromIndexlistというメソッドがあります。

于 2010-02-27T00:42:38.533 に答える