Indexation des événements de hiérarchisation et d’ensemble de lignes dans Windows 7

Cette rubrique décrit l’introduction de la priorisation de l'indexation et des événements d’ensemble de rangées pour Windows 7.

Cette rubrique est organisée comme suit :

Indexation des événements de hiérarchisation et d’ensemble de lignes

Dans Windows 7 et versions ultérieures, il existe une pile de priorités dans laquelle, dans le contexte d'une requête particulière, le client peut demander que les étendues utilisées dans cette requête soient hiérarchisées au-dessus de celles des éléments normaux.

Cette pile de hiérarchisation présente les caractéristiques suivantes :

  • Les éléments de la pile peuvent avoir un premier plan, une priorité élevée ou faible :
    • Premier plan : la logique d’interruption est ignorée et l’indexation se poursuit aussi rapidement que l’ordinateur le permet.
    • Élevé : une priorisation a été demandée avec recul.
    • Faible : la priorisation a été demandée, non pas au détriment d'autres composantes de la pile, mais avant l'indexation non priorisée.
  • Toute demande de priorité élevée ou de premier plan place automatiquement la requête en haut de la pile.
  • Seul l’élément situé au-dessus de la pile peut avoir une priorité de premier plan.
  • Une requête avec priorité de premier plan dont la priorité est déclassée reçoit un événement l'informant qu'elle a perdu la priorité de premier plan et est devenue une priorité élevée avec un recul.

La pile de priorités définit une priorité globale des éléments traités dans l’indexeur comme suit :

  • Les notifications à priorité élevée n’ont pas de délai d'attente et sont généralement envoyées uniquement pour un petit nombre d’éléments. Par exemple, l’Explorateur Windows utilise cette priorité pour les opérations de petit moteur de copie.

  • Priority Stack est en haut de la pile, a un backoff et est la dernière requête de priorité demandée.

  • Deuxième requête dans la pile.

  • Troisième requête dans la pile.

  • Quatrième requête dans la pile, et ainsi de suite.

  • Éléments de priorité normale.

  • Éléments supprimés.

    Note

    Les éléments de chaque groupe sont hiérarchisés en interne par le biais de l’ancienne sémantique par élément.

     

IRowsetPriorization exemples

L’API principale pour le travail de hiérarchisation est disponible via l’interface suivante, qui peut être appelée en interrogeant l’ensemble de lignes retourné :

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 );
};

La hiérarchisation des ensembles de lignes fonctionne comme suit :

  1. IRowsetPrioritization est acquis avec la méthode IUnknown ::QueryInterface sur un ensemble de lignes d’indexeur. DBPROP_ENABLEROWSETEVENTS devez avoir la valeur TRUE avec la méthode OLE DB ICommandProperties ::SetProperties avant d’exécuter la requête afin d’utiliser la hiérarchisation de l’ensemble de lignes.
  2. IRowsetPrioritization::SetScopePriority définit la hiérarchisation des étendues appartenant à la requête, ainsi que l'intervalle à laquelle l'événement de statistiques d’étendue est déclenché lorsqu’il existe des documents en attente d'être indexés dans les étendues de requête. Cet événement est déclenché si le niveau de priorité est défini sur la valeur par défaut.
  3. IRowsetPrioritization ::GetScopeStatistics peut être utilisé pour obtenir le nombre d’éléments indexés dans l’étendue, le nombre de documents en attente à ajouter dans l’étendue et le nombre de documents qui doivent être réindexés dans cette étendue.

Événements IRowsetPrioritization

Il existe trois événements d’ensemble de lignes dans IRowsetEvents ::OnRowsetEvent dans l’énumération 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 );

Les événements d’ensemble de lignes sont les suivants :

  • L’événement ROWSETEVENT_TYPE_DATAEXPIRED indique que les données de sauvegarde de l’ensemble de lignes ont expiré et qu’un nouvel ensemble de lignes doit être demandé.
  • L’événement ROWSET_TYPE_FOREGROUNDLOST indique qu’un élément ayant une priorité de premier plan dans la pile de hiérarchisation a été rétrogradé, car une autre personne s’est hiérarchisée avant cette requête.
  • L’événement ROWSETEVENT_TYPE_SCOPESTATISTICS vous donne les mêmes informations disponibles à partir de l’appel de méthode IRowsetPrioritization ::GetScopeStatistics , mais via un mécanicien push, comme suit :
    • L’événement se produit si l’API de hiérarchisation a été utilisée pour demander un niveau de hiérarchisation non défini par défaut et une fréquence d’événement de statistiques non nulle.
    • L’événement se produit uniquement lorsque les statistiques changent réellement et que l’intervalle spécifié dans la IRowsetPrioritization s’est écoulé (l’intervalle ne garantit pas la fréquence de l’événement).
    • Cet événement est garanti de déclencher un état « rebond zéro » (zéro élément restant à ajouter, zéro modification restante), à condition qu’un événement non nul ait été déclenché.
    • L'indexeur peut traiter les éléments sans envoyer cet événement, si la file d’attente se vide avant la fréquence des événements statistiques.

Ressources supplémentaires

Consultez les ressources suivantes relatives à la hiérarchisation et aux ensembles de lignes :

Recherche Windows 7

Nouveautés de la recherche Windows 7

Bibliothèques Windows Shell dans Windows 7