Question

Je suis donc la construction d'une webpart qui énumère tous les doclibs dans le site web en cours, tenant compte de tous les fichiers extraits et de les répertorier dans un tableau, permettant à un utilisateur d'appliquer certaines métadonnées nécessaires et de vérifier dans plusieurs à la fois (50).

Cette partie web doit fonctionner sur des listes sur le seuil d'affichage de liste (actuellement fixé à 15 000 en production), et également sur les sites qui sont de TRÈS grande taille (de 50 000 à 100 000+ documents).

Je suis à la suite de la MS des Meilleures pratiques pour la manipulation de grandes listes ici: http://msdn.microsoft.com/en-us/library/ee557257.aspx

À l'aide d'un SPquery (sans CAML définie en a), de la récupération des pages de 2 000 articles et l'analyse de cette façon.Le problème avec cela est que la partie web est en fait à l'origine d'un délai d'attente de se produire sur ceux très large (50+) des sites.Donc j'essaye d'être un peu plus intelligent avec mon CAML, tirant uniquement les éléments qui sont extraits:

spQuery.Query = "<Where><IsNotNull>
    <FieldRef Name=\"CheckoutUser\" LookupId=\"TRUE\"/>
</IsNotNull></Where>";
spQuery.RowLimit = 2000;
spQuery.ViewAttributes = "Scope=\"Recursive\"";

Je suis à l'aide d'un CrossListQueryInfo requête pour interroger le web entier avec cette même caml, et ça fonctionne à merveille lorsque aucune liste n'est plus de la LVT.Si l'on est, j'attrape cette exception et de ré-essayer avec le "moins vite" SPQuery sur chaque individu de la bibliothèque.

De tout ce que je lis, aussi longtemps que mon CAML est de retour moins d'éléments que la LVT, il devrait fonctionner.Mais en utilisant le CAML ci-dessus les causes de l'erreur The attempted operation is prohibited because it exceeds the list view threshold enforced by the administrator pour être levée lors de l' SPList.GetItems(spQuery) est appelé.Depuis que je suis un rowlimit de 2 000, ne pourrait-il pas de ne jamais arriver?MS Suggère d'exécuter une SPQuery sans CAML tout défini - fondamentalement, tenant compte de tous les éléments de la bibliothèque en pages de 2 000.Donc je ne peux pas donner un sens pourquoi mon CAML est en train d'échouer sur des listes sur le seuil d'affichage.

Edit:Sur d'autres recherches, j'essaie d'utiliser le ContentIterator classe pour répondre à mes besoins (http://msdn.microsoft.com/en-us/library/microsoft.office.server.utilities.contentiterator.aspx).À l'aide d'exemples de ce post: http://extreme-sharepoint.com/2012/07/17/data-access-via-caml-queries/

Je suis toujours à la peine sur le contentiterator avec la même LVT erreur.

La " CheckoutUser champ doivent être indexés sur chaque liste que nous voulons exécuter cette requête contre?

Mise à jour 2:Ce qui revient à la " CheckoutUser champ ne sont pas indexés, et en essayant de requête contre elle.Malheureusement, il n'est pas une option pour nous de sortir et la force de cet indice sur toutes les bibliothèques de la batterie.Je crois que ma seule option à ce stade est de mettre en place une sorte de système de pagination sur les très grands sites pour des éléments de processus par lots.

Dernière Mise À Jour:Comme solution, j'ai décidé d'appliquer l'indexation de la " CheckoutUser colonne pour les bibliothèques.Cela devrait améliorer considérablement la performance d'ensemble de la partie web, et de permettre au support pour les très gros sites.Il y aura un peu de mal de tête suivant immédiatement le déploiement, comme nous aurons besoin de régler manuellement la colonne de l'index sur les listes sur le seuil d'affichage de liste, mais dans le long terme, ce seront les meilleurs.

Était-ce utile?

La solution

Ma compréhension de la manière dont la liste des travaux de seuil est limitée, cependant, je soupçonne la raison pour laquelle votre requête CAML est en cas de filtrage sur le champ non indexé, et le Rowlimit est appliqué "après".

Je pense que l'indexation du champ ChectOUtutilisateur résoudrait votre problème, mais cela ressemble à vous avoir beaucoup de sites.

Permettez-moi de suggérer une approche alternative - pagination.Étant donné que la colonne ID de chaque liste est indexée, implémentez une requête CAML où vous filtrez d'abord (très important) sur la colonne ID inférieure à, dites, 2000, et deuxièmement, sur le champ ChectOUTUser.Si cette requête ne renvoie pas le nombre de résultats souhaité, augmentez la répétition de 2000 à 4000 et répétez.

Je n'ai pas mis en œuvre cette solution moi-même, c'est juste une pensée.

Autres conseils

Si vous interrogez de grandes listes, vous devez définir définitivement indexer les champs sur lesquels vous interrogez.L'étranglement ne se produit pas car les champs indexés sont stockés dans une table séparée de la base de données.

Ce billet de môme devrait être d'une aide, je pense: http://vrdmn.blogspot.in/2012/11/SharePoint-list-Indexes-under-hood.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à sharepoint.stackexchange
scroll top