Индексирование приоритетов и событий набора строк в 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 в наборе строк индексатора. DBPROP_ENABLEROWSETEVENTS необходимо задать значение TRUE с помощью метода OLE DB ICommandProperties::SetProperties перед выполнением запроса, чтобы использовать определение приоритетов набора строк.
- IRowsetPrioritization::SetScopePriority задает приоритеты для областей, относящихся к запросу, и интервал, который вызывается событие статистики область при наличии незавершенных документов для индексирования в областях запроса. Это событие возникает, если для уровня приоритета задано значение по умолчанию.
- IRowsetPrioritization::GetScopeStatistics можно использовать для получения количества индексированных элементов в область, количества незавершенных документов, добавляемых в область, и количества документов, которые необходимо переиндексировать в рамках этого область.
События IRowsetPrioritization
В IRowsetEvents::OnRowsetEvents в перечислении ROWSETEVENT_TYPE есть три события набора строк:
// 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 , истек (интервал не гарантирует частоту события).
- Это событие гарантированно вызовет состояние "нулевой отказ" (ноль элементов, оставшихся для добавления, ноль изменяет оставшиеся) при условии, что возникло событие, отличное от нуля.
- Индексатор может обрабатывать элементы без отправки этого события, если очередь очищается до частоты события статистики.
Дополнительные ресурсы
Ознакомьтесь со следующими ресурсами, связанными с определением приоритетов и наборами строк:
- Интерфейсы:
- Перечисления:
Связанные темы