Frage

Deshalb erstelle ich einen Webpart, der alle Doclibs im aktuellen Web auflistet, alle ausgecheckten Dateien erfasst und in einer Tabelle auflistet, sodass ein Benutzer einige erforderliche Metadaten anwenden und viele auf einmal einchecken kann (50).

Dieses Webpart muss auf Listen funktionieren, die über dem Listenansichtsschwellenwert liegen (derzeit in der Produktion auf 15.000 festgelegt), und auch auf Websites, die SEHR groß sind (50.000 – 100.000+ Dokumente).

Ich folge hier den MS Best Practices für den Umgang mit großen Listen: http://msdn.microsoft.com/en-us/library/ee557257.aspx

Verwenden einer SP-Abfrage (ohne definiertes CAML), Abrufen von Seiten mit 2.000 Elementen und Parsen auf diese Weise.Das Problem dabei ist, dass das Webpart tatsächlich eine Zeitüberschreitung auf diesen sehr großen Websites (50.000+) verursacht.Deshalb versuche ich, mit meinem CAML etwas intelligenter umzugehen und nur Elemente einzubeziehen, die ausgecheckt sind:

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

Ich verwende ein CrossListQueryInfo query, um das gesamte Web mit demselben CAML abzufragen, und es funktioniert wunderbar, wenn sich keine Liste über dem LVT befindet.Wenn dies der Fall ist, fange ich diese Ausnahme ab und versuche es erneut mit der „langsameren“ SPQuery für jede einzelne Bibliothek.

Nach allem, was ich lese, sollte es funktionieren, solange mein CAML weniger Artikel zurückgibt als der LVT.Aber die Verwendung der oben genannten CAML verursacht den Fehler The attempted operation is prohibited because it exceeds the list view threshold enforced by the administrator wann geworfen werden SPList.GetItems(spQuery) wird genannt.Sollte das nicht nie passieren, da ich ein Zeilenlimit von 2.000 festlege?MS schlägt vor, eine SPQuery auszuführen, ohne dass CAML überhaupt definiert ist – im Grunde werden alle Elemente aus der Bibliothek auf Seiten von 2.000 abgerufen.Daher verstehe ich nicht, warum mein CAML nur bei Listen fehlschlägt, die über dem Anzeigeschwellenwert liegen.

Bearbeiten:Nach weiteren Recherchen versuche ich, das zu nutzen ContentIterator Klasse, um meine Bedürfnisse zu erfüllen (http://msdn.microsoft.com/en-us/library/microsoft.office.server.utilities.contentiterator.aspx).Anhand von Beispielen aus diesem Beitrag: http://extreme-sharepoint.com/2012/07/17/data-access-via-caml-queries/

Beim Contentiterator scheitere ich immer noch mit dem gleichen LVT-Fehler.

Muss das Feld „CheckoutUser“ auf jeder Liste indiziert werden, für die wir diese Abfrage ausführen möchten?

Update 2:Dies liegt daran, dass das Feld „CheckoutUser“ nicht indiziert ist und versucht wird, eine Abfrage dagegen durchzuführen.Leider ist es für uns keine Option, diesen Index für jede Bibliothek in der Farm zu erzwingen.Ich glaube, dass meine einzige Option derzeit darin besteht, auf sehr großen Websites eine Art Paging-Schema zu implementieren, um Elemente in Stapeln zu verarbeiten.

Letztes Update:Als Lösung habe ich beschlossen, die Indizierung der Spalte „CheckoutUser“ für Bibliotheken zu erzwingen.Dies sollte die Gesamtleistung des Webparts erheblich verbessern und die Unterstützung sehr großer Websites ermöglichen.Unmittelbar nach der Bereitstellung wird es einige Kopfschmerzen geben, da wir den Spaltenindex für Listen manuell festlegen müssen, die über dem Schwellenwert für die Listenansicht liegen. Auf lange Sicht ist dies jedoch das Beste.

War es hilfreich?

Lösung

Mein Verständnis der Funktionsweise des Listenansichtsschwellenwerts ist begrenzt. Ich vermute jedoch, dass Ihre CAML-Abfrage fehlschlägt, weil sie nach dem nicht indizierten Feld filtert und das RowLimit „danach“ angewendet wird.

Ich denke, dass die Indizierung des CheckoutUser-Felds Ihr Problem lösen würde, es hört sich jedoch so an, als hätten Sie viele Websites.

Gestatten Sie mir, einen alternativen Ansatz vorzuschlagen – Paging.Da die ID-Spalte in jeder Liste indiziert ist, implementieren Sie eine CAML-Abfrage, bei der Sie ZUERST (sehr wichtig) nach der ID-Spalte kleiner als beispielsweise 2000 und zweitens nach dem Feld „CheckoutUser“ filtern.Wenn diese Abfrage nicht die gewünschte Anzahl an Ergebnissen zurückgibt, erhöhen Sie den Wert von 2.000 auf 4.000 und wiederholen Sie den Vorgang.

Ich habe diese Lösung nicht selbst implementiert, es ist nur ein Gedanke.

Andere Tipps

Wenn Sie große Listen abfragen, sollten Sie unbedingt die Felder indizieren, die Sie abfragen.Eine Drosselung findet nicht statt, da die indizierten Felder in einer separaten Tabelle in der Datenbank gespeichert werden.

Dieser Blog-Beitrag von mir sollte meiner Meinung nach hilfreich sein:http://vrdmn.blogspot.in/2012/11/sharepoint-list-indexes-under-hood.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit sharepoint.stackexchange
scroll top