为 Windows 7 中的优先顺序和行集事件编制索引
本主题概述了针对 Windows 7 的索引优先顺序和行集事件的介绍。
本主题的组织方式如下:
索引优先级和行集事件
在 Windows 7 及更高版本中,有一个优先级堆栈,在该堆栈中,任何特定查询的上下文,客户端都可以请求该查询中使用的范围的优先级高于正常项的范围。
此优先顺序堆栈具有以下特征:
- 堆栈中的项可以具有前台优先级、高优先级或低优先级:
- 前台:跳过回退逻辑,并按计算机允许的速度进行索引编制。
- 高:已请求退避优先级。
- 低:已请求优先级,不以牺牲堆栈上其他范围为代价,而是高于非优先级索引。
- 任何对高优先级或前台优先级的请求都会自动将请求查询提升到堆栈顶部。
- 只有堆栈顶部的项才能具有前台优先级。
- 优先级下降的具有前台优先级的查询会收到一个事件,通知它已丢失前台优先级,并且已变为具有退避的高优先级。
优先级堆栈设置索引器中处理的项的总体优先级,如下所示:
高优先级通知没有退避,通常仅为少量项目发送通知。 例如,Windows 资源管理器将此优先级用于小型复制引擎操作。
优先级堆栈是堆栈的顶部,具有退避,并且是最后一个请求的优先级查询。
堆栈中的第二个查询。
堆栈中的第三个查询。
堆栈中的第四个查询,依此类推。
普通优先级项。
已删除的项目。
注意
通过较旧的按项语义在内部确定每个组中的项的优先级。
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 事件
ROWSETEVENT_TYPE枚举中的 IRowsetEvents::OnRowsetEvent 中有三个行集事件:
// 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 已用于请求非默认优先级级别和非零统计信息事件频率,则会发生该事件。
- 仅当统计信息实际更改,并且 IRowsetPrioritization 中指定的间隔已过 (该间隔不保证事件) 的频率时,才会发生该事件。
- 如果已引发非零事件,则此事件保证引发“反弹零”状态 (零个待添加项,零修改剩余) 。
- 如果队列清空在统计信息事件频率之前,索引器可能会处理项而不发送此事件。
其他资源
请参阅以下与优先级和行集相关的资源:
- 接口:
- 枚举:
相关主题