Индексирование событий приоритета и набора строк в 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::OnRowsetEvent в перечислении 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 истек (интервал не гарантирует частоту события).
- Это событие гарантированно вызывает состояние "нулевой отскок" (ноль элементов, оставшихся для добавления, ноль изменений, оставшихся), при условии, что ненулевое событие произошло.
- Индексатор может обрабатывать элементы без отправки этого события, если очередь очищается до частоты события статистики.
Дополнительные ресурсы
Ознакомьтесь со следующими ресурсами, связанными с приоритизацией и наборами строк:
- Интерфейсы:
- Перечисления:
Связанные разделы