Windows 7 での優先順位付けイベントと行セット イベントのインデックス作成
このトピックでは、Windows 7 のインデックス作成の優先順位付けイベントと行セット イベントの概要について説明します。
このトピックは次のように整理されています。
優先度設定イベントと行セット イベントのインデックス作成
Windows 7 以降では、特定のクエリのコンテキスト内に優先度スタックがあり、クライアントは、そのクエリで使用されるスコープが通常の項目よりも優先されるように要求できます。
この優先順位付けスタックには、次の特性があります。
- スタック内の項目には、フォアグラウンド、高、または低の優先度を設定できます。
- フォアグラウンド: バックオフ ロジックはスキップされ、マシンが許可する速度でインデックス作成が続行されます。
- 高: 優先度設定はバックオフで要求されました。
- 低: 優先順位付けが要求されました。スタック上の他のスコープを犠牲にするのではなく、優先順位付けされていないインデックス作成を上回っています。
- 高優先度またはフォアグラウンド優先度に対する要求は、要求するクエリをスタックの先頭に自動的に移動します。
- 前景の優先度を設定できるのは、スタックの上部にある項目だけです。
- 優先度が高いフォアグラウンド優先度のクエリは、フォアグラウンド優先度が失われ、バックオフで優先度が高くなったことを通知するイベントを受け取ります。
優先度スタックは、インデクサーで処理される項目の全体的な優先度を次のように設定します。
優先度の高い通知にはバックオフがなく、通常は少数のアイテムに対してのみ送信されます。 たとえば、Windows エクスプローラーでは、小さなコピー エンジン操作にこの優先度が使用されます。
優先度スタックはスタックの最上位であり、バックオフがあり、最後に要求された優先度クエリです。
スタック内の 2 番目のクエリ。
スタック内の 3 番目のクエリ。
スタック内の 4 番目のクエリなど。
通常の優先度の項目。
削除済みアイテム。
Note
各グループ内の項目は、古い項目ごとのセマンティクスによって内部的に優先順位が付きます。
IRowsetPriorization の例
優先度設定作業のプライマリ API は、次のインターフェイスを使用して使用できます。これは、返された行セットに対してクエリを実行することで呼び出すことができます。
typedef [v1_enum] enum
{
PRIORITY_LEVEL_FOREGROUND = 0, // process items in the scope first as quickly as possible
PRIORITY_LEVEL_HIGH = 1, // process items in the scope first at the normal rate
PRIORITY_LEVEL_LOW = 2, // process items in this scope before those at the normal rate, but after any other prioritization requests
PRIORITY_LEVEL_DEFAULT = 3 // process items at the normal indexer rate
} PRIORITY_LEVEL;
[
object,
uuid(IRowsetPrioritization_GUID),
pointer_default(unique)
]
interface IRowsetPrioritization : IUnknown
{
// Sets or retrieves the current indexer prioritization level for the scope specified by
// this query.
HRESULT SetScopePriority( [in] PRIORITY_LEVEL priority, [in] DWORD scopeStatisticsEventFrequency );
HRESULT GetScopePriority( [out] PRIORITY_LEVEL * priority, [out] DWORD * scopeStatisticsEventFrequency );
// Gets information describing the scope specified by this query:
// indexedDocumentCount - The total number of documents currently indexed in the scope
// oustandingAddCount - The total number of documents yet to be indexed in the scope (those not yet included in indexedDocumentCount)
// oustandingModifyCount - The total number of documents indexed in the scope that need to be re-indexed (included in indexedDocumentCount)
HRESULT GetScopeStatistics( [out] DWORD * indexedDocumentCount, [out] DWORD * oustandingAddCount, [out] DWORD * oustandingModifyCount );
};
行セットの優先順位付けは、次のように機能します。
- IRowsetPrioritization は、インデクサー行セットの IUnknown::QueryInterface メソッド を使用して取得されます。 行セットの優先順位付けを使用するには、クエリを実行する前に、OLE DB ICommandProperties::SetProperties メソッドを使用して、DBPROP_ENABLEROWSETEVENTSを TRUE に設定する必要があります。
- IRowsetPrioritization::SetScopePriority は、クエリに属するスコープの優先順位付けを設定し、クエリ スコープ内にインデックスを作成する未処理のドキュメントがある場合にスコープ統計イベントが発生する間隔を設定します。 このイベントは、優先度レベルが既定に設定されている場合に発生します。
- IRowsetPrioritization::GetScopeStatistics を使用すると、スコープ内のインデックス付きアイテムの数、スコープに追加する未処理のドキュメントの数、およびこのスコープ内でインデックスを再作成する必要があるドキュメントの数を取得できます。
IRowsetPrioritization イベント
IRowsetEvents::OnRowsetEvent には、ROWSETEVENT_TYPE列挙に 3 つの行セット イベントがあります。
// This method allows for future notifications of various actions about your rowset or items within
// eventType: - An identifier of the particular event being sent
// pVarEventData: - The expected value of the EventData for each event type
// ROWSETEVENT_TYPE_DATAEXPIRED - VT_EMPTY
// ROWSETEVENT_TYPE_FOREGROUNDLOST - VT_EMPTY
// ROWSETEVENT_TYPE_SCOPESTATISTICS - VT_VECTOR | VT_UI4 - 3 elements (0 = indexed items, 1 = outstanding adds, 2 = oustanding modifies)
HRESULT OnRowsetEvent( [in] ROWSETEVENT_TYPE eventType, [in] REFPROPVARIANT eventData );
行セット イベントは次のとおりです。
- ROWSETEVENT_TYPE_DATAEXPIRED イベントは、行セットをバックアップするデータの有効期限が切れ、新しい行セットを要求する必要があることを示します。
- ROWSET_TYPE_FOREGROUNDLOST イベントは、優先順位付けスタックでフォアグラウンド優先度を持っていたアイテムが降格されたことを示します。これは、他のユーザーがこのクエリよりも優先したためです。
-
ROWSETEVENT_TYPE_SCOPESTATISTICS イベントは、IRowsetPrioritization::GetScopeStatistics メソッド呼び出しから入手できるのと同じ情報を提供しますが、プッシュ メカニズムを使用すると次のようになります。
- このイベントは、優先度設定 API が既定以外の優先度設定レベルと 0 以外の統計イベント頻度を要求するために使用されている場合に発生します。
- このイベントは、統計が実際に変更され、 IRowsetPrioritization で指定された間隔が経過した場合にのみ発生します (間隔によってイベントの頻度は保証されません)。
- このイベントは、0 以外のイベントが発生した場合、"バウンス ゼロ" 状態 (追加する残りの項目が 0、残りが 0 の変更) を発生することが保証されます。
- 統計イベントの頻度の前にキューが空になった場合、インデクサーは、このイベントを送信せずにアイテムを処理できます。
その他のリソース
優先順位付けと行セットに関連する次のリソースを参照してください。
- インターフェイス:
- 列挙型:
関連トピック