Indexando eventos de priorização e conjunto de linhas no Windows 7
Este tópico descreve a introdução da priorização de indexação e eventos de conjunto de linhas para o Windows 7.
Este tópico é organizado da seguinte maneira:
Indexando eventos de priorização e conjunto de linhas
No Windows 7?e posteriores, há uma pilha de prioridades na qual o contexto de qualquer consulta específica, o cliente pode solicitar que os escopos usados nessa consulta sejam priorizados acima do de itens normais.
Essa pilha de priorização tem as seguintes características:
- Os itens na pilha podem ter primeiro plano, alta ou baixa prioridade:
- Primeiro plano: a lógica de backoff é ignorada e a indexação prossegue tão rápido quanto o computador permite.
- Alta: a priorização foi solicitada com retirada.
- Baixa: a priorização foi solicitada, não às custas de outros escopos na pilha, mas acima da indexação não priorizada.
- Qualquer solicitação de prioridade alta ou em primeiro plano aumenta a consulta de solicitação para a parte superior da pilha automaticamente.
- Somente o item na parte superior da pilha pode ter prioridade em primeiro plano.
- Uma consulta com prioridade em primeiro plano que é pressionada em prioridade recebe um evento notificando-a de que perdeu a prioridade de primeiro plano e se tornou uma prioridade alta com retirada.
A pilha de prioridade define uma prioridade geral dos itens que são processados no indexador da seguinte maneira:
As notificações de Alta Prioridade não têm retirada e normalmente são enviadas apenas para um pequeno número de itens. Por exemplo, o Windows Explorer usa essa prioridade para pequenas operações do mecanismo de cópia.
Priority Stack é superior à pilha, tem retirada e é a última consulta de prioridade solicitada.
Segunda consulta na pilha.
Terceira consulta na pilha.
Quarta consulta na pilha e assim por diante.
Itens de Prioridade Normal.
Itens excluídos.
Observação
Os itens dentro de cada grupo são priorizados internamente por meio da semântica por item mais antiga.
Exemplos de IRowsetPriorization
A API primária para o trabalho de priorização está disponível por meio da seguinte interface, que pode ser chamada consultando o conjunto de linhas retornado:
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 );
};
A priorização do conjunto de linhas funciona da seguinte maneira:
- IRowsetPrioritization é adquirido com o Método IUnknown::QueryInterface em um conjunto de linhas do indexador. DBPROP_ENABLEROWSETEVENTS deve ser definido como TRUE com o método OLE DB ICommandProperties::SetProperties antes de executar a consulta para usar a priorização do conjunto de linhas.
- IRowsetPrioritization::SetScopePriority define a priorização para os escopos pertencentes à consulta e o intervalo em que o evento de estatísticas de escopo é gerado quando há documentos pendentes a serem indexados dentro dos escopos de consulta. Esse evento será gerado se o nível de prioridade for definido como padrão.
- IRowsetPrioritization::GetScopeStatistics pode ser usado para obter o número de itens indexados no escopo, o número de documentos pendentes a serem adicionados no escopo e o número de documentos que precisam ser indexados novamente dentro desse escopo.
Eventos IRowsetPrioritization
Há três eventos de conjunto de linhas em IRowsetEvents::OnRowsetEvent na enumeração 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 );
Os eventos de conjunto de linhas são os seguintes:
- O evento ROWSETEVENT_TYPE_DATAEXPIRED indica que os dados que fazem backup do conjunto de linhas expiraram e que um novo conjunto de linhas deve ser solicitado.
- O evento ROWSET_TYPE_FOREGROUNDLOST indica que um item que tinha prioridade em primeiro plano na pilha de priorização foi rebaixado, porque outra pessoa se priorizou antes dessa consulta.
- O evento ROWSETEVENT_TYPE_SCOPESTATISTICS fornece as mesmas informações disponíveis na chamada do método IRowsetPrioritization::GetScopeStatistics , mas por meio de um mecânico de push, da seguinte maneira:
- O evento surgirá se a API de priorização tiver sido usada para solicitar um nível de priorização não padrão e uma frequência de evento de estatísticas não zero.
- O evento surge somente quando as estatísticas são realmente alteradas e o intervalo especificado no IRowsetPrioritization decorrido (o intervalo não garante a frequência do evento).
- Esse evento é garantido para gerar um estado de "salto zero" (zero itens restantes a serem adicionados, zero modificações restantes), desde que um evento diferente de zero tenha sido gerado.
- O indexador poderá processar itens sem enviar esse evento, se a fila esvaziar antes da frequência do evento de estatísticas.
Recursos adicionais
Consulte os seguintes recursos relacionados à priorização e conjuntos de linhas:
- Interfaces:
- Enumerações:
Tópicos relacionados