Prioriteits- en rijset-gebeurtenissen indexeren in Windows 7
De introductie van prioritering van indexeren en rijsetevenementen voor Windows 7 wordt in dit onderwerp toegelicht.
Dit onderwerp is als volgt ingedeeld:
Prioriteitsaanduidingen en rijenset-gebeurtenissen indexeren
In Windows 7 en hoger is er een prioriteitsstack waarin de context van elke specifieke query kan worden vastgesteld. De client kan verzoeken dat de bereiken die in die query worden gebruikt, hoger worden gerangschikt dan normale items.
Deze prioriteitsaanduidingsstack heeft de volgende kenmerken:
- Items in de stack kunnen voorrang, hoge of lage prioriteit hebben.
- Voorgrond: Backoff-logica wordt overgeslagen en indexering gaat zo snel als de machine toestaat.
- Hoge: Prioriteitstelling is aangevraagd met uitstel.
- Lage: Prioriteitstelling is aangevraagd, niet ten koste van andere gebieden op de stack, maar boven niet-geprioriteerde indexering.
- Elke aanvraag voor een hoge of voorgrondprioriteit verplaatst de query automatisch naar de bovenkant van de lijst.
- Alleen het item boven op de stapel kan prioriteit op de voorgrond hebben.
- Een query met voorgrondprioriteit die in prioriteit wordt verlaagd, ontvangt een melding die aangeeft dat de voorgrondprioriteit is verloren en is veranderd in een hoge prioriteit met een vertraging.
De prioriteitsstack stelt als volgt een algemene prioriteit in van items die in de indexeerfunctie worden verwerkt:
Meldingen met hoge prioriteit hebben geen uitstel en worden doorgaans alleen verzonden voor een klein aantal items. In Windows Verkenner wordt deze prioriteit bijvoorbeeld gebruikt voor kleine kopieer-enginebewerkingen.
Prioriteitsstack staat bovenaan in de stack, heeft een terugtrekking, en is de laatst aangevraagde prioriteitsquery.
Tweede query in de stapel.
Derde query in de stack.
Vierde vraag in de stack, enzovoort.
Items met normale prioriteit.
Verwijderde items.
Notitie
Items binnen elke groep worden intern geprioriteerd via de oudere semantiek per item.
Voorbeelden van IRowsetPriorization
De primaire API voor prioriteitstelling is beschikbaar via de volgende interface, die kan worden aangeroepen door een query uit te voeren op de geretourneerde rijenset:
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 );
};
Prioriteitstelling van rijensets werkt als volgt:
- IRowsetPrioritization- wordt verkregen met de IUnknown::QueryInterface-methode op een rowset van een indexeerfunctie. DBPROP_ENABLEROWSETEVENTS moet worden ingesteld op TRUE- met de OLE DB-ICommandProperties::SetProperties methode voordat u de query uitvoert om de prioriteit van rijensets te kunnen gebruiken.
- IRowsetPrioritization::SetScopePriority stelt de prioriteitsaanduiding in voor de bereiken die horen bij de query en het interval dat de gebeurtenis voor bereikstatistieken wordt gegenereerd, wanneer er binnen de querybereiken nog documenten moeten worden geïndexeerd. Deze gebeurtenis wordt gegenereerd als het prioriteitsniveau is ingesteld op de standaardwaarde.
- IRowsetPrioritization::GetScopeStatistics kunnen worden gebruikt om het aantal geïndexeerde items in het bereik op te halen, het aantal openstaande documenten dat in het bereik moet worden toegevoegd en het aantal documenten dat opnieuw moet worden geïndexeerd binnen dit bereik.
IRowsetPrioritization-gebeurtenissen
Er zijn drie rijensetgebeurtenissen in IRowsetEvents::OnRowsetEvent in de opsomming 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 );
De gebeurtenissen van de rijenset zijn als volgt:
- De gebeurtenis ROWSETEVENT_TYPE_DATAEXPIRED geeft aan dat de gegevens van de rijenset zijn verlopen, waardoor er een nieuwe rijenset moet worden aangevraagd.
- De gebeurtenis ROWSET_TYPE_FOREGROUNDLOST geeft aan dat een item dat voorheen voorgrondprioriteit had in de prioriteitsstack is gedegradeerd, omdat iemand anders zichzelf voorrang heeft gegeven boven deze query.
- De gebeurtenis ROWSETEVENT_TYPE_SCOPESTATISTICS geeft u dezelfde informatie die u kunt krijgen via de IRowsetPrioritization::GetScopeStatistics methode-aanroep, maar via een push-mechanisme, als volgt:
- De gebeurtenis treedt op als de prioriteitsaanduidings-API is gebruikt om een niet-standaard prioritatieniveau aan te vragen en een gebeurtenisfrequentie die niet nul is.
- De gebeurtenis treedt alleen op wanneer statistieken daadwerkelijk veranderen en het interval dat is opgegeven in de IRowsetPrioritization is verstreken (het interval garandeert niet de frequentie van de gebeurtenis).
- Deze gebeurtenis garandeert een 'bounce zero'-status (nul items die nog moeten worden toegevoegd, nul wijzigingen resterend), mits er een gebeurtenis is gegenereerd die geen nul was.
- De indexeerfunctie kan items verwerken zonder deze gebeurtenis te verzenden, als de wachtrij leeg is vóór de frequentie van de statistiekengebeurtenis.
Aanvullende informatiebronnen
Zie de volgende bronnen met betrekking tot prioriteitstelling en rijensets:
- Interfaces:
- Opsommingen:
Verwante onderwerpen