Domanda

Così sto costruendo un WebPart che enumera tutti i doclibs nel web corrente, afferrando tutti i file controllati e li elencando in una tabella, consentendo all'utente di applicare alcuni metadati richiesti e controllare in molti contemporaneamente (50). .

Questo WebPart deve operare sugli elenchi tramite la soglia di visualizzazione dell'elenco (attualmente impostata a 15.000 in produzione), e anche su siti che sono molto grandi (50.000 - 100.000 documenti).

Sto seguendo le ms best practice per la gestione di grandi elenchi qui: http://msdn.microsoft.com/en-us/library/ee557257.aspx

Utilizzo di una Spquery (senza alcuna camm definita a tutti), recuperando pagine di 2.000 articoli e analizzando in questo modo. Il problema con questo è che il WebPart sta effettivamente causando un timeout in quei siti molto grandi (50k +). Quindi sto cercando di essere un po 'più intelligente con il mio caml, tirando solo oggetti che vengono controllati:

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

Sto usando una query CrossListQueryInfo per interrogare l'intero Web con questo stesso caml, e funziona meravigliosamente quando nessuna lista è sopra la LVT. Se uno è, prendo quell'eccezione e ri-provare con la sptalità "più lenta" su ogni singola libreria.

Da tutto ciò che sto leggendo, finché il mio caml sta tornando meno oggetti rispetto al LVT, dovrebbe funzionare. Ma usare il camm sopra provoca l'errore The attempted operation is prohibited because it exceeds the list view threshold enforced by the administrator da lanciare quando viene chiamato SPList.GetItems(spQuery). Dal momento che sto impostando un rewillimit di 2.000, non dovrebbe mai accadere mai? La SM suggerisce di eseguire una spaliare senza camm definita affatto - praticamente afferrando tutti gli elementi dalla libreria nelle pagine di 2.000. Quindi non riesco a fare qualsiasi senso del perché il mio caml non riesce solo sugli elenchi sopra la soglia di visualizzazione.

Modifica: Su ulteriori ricerche, sto tentando di utilizzare la classe ContentIterator per soddisfare le mie esigenze ( http://msdn.microsoft.com/en-us/library/microsoft.office.server.itielli.contitator.aspx ). Usando esempi da questo post: http:// extreme- sharepoint.com/2012/07/17/data-access-via-caml-queries/

Sto ancora fallendo sul controftano con lo stesso errore LVT.

Il campo "CheckoUtuser" deve essere indicizzato su ogni lista che vogliamo eseguire questa query contro?

Aggiornamento 2: Questo si riduce al campo "checkoutusore" non essere indicizzato e cercando di interrogarlo contro di esso. Sfortunatamente non è un'opzione per noi uscire e forzare questo indice su ogni biblioteca nella fattoria. Credo che la mia unica opzione a questo punto sia implementare una sorta di schema di paging su siti molto grandi per elaborare gli elementi in lotti.

Aggiornamento finale: come soluzione, ho deciso di far rispettare l'indicizzazione della colonna "CheckoUxer" per le biblioteche. Ciò dovrebbe migliorare notevolmente le prestazioni generali del WebPart e consentire il supporto per i siti molto grandi. Ci sarà un po 'di mal di testa immediatamente dopo l'implementazione, poiché dovremo impostare manualmente l'indice della colonna sugli elenchi tramite la soglia di visualizzazione dell'elenco, ma nel lungo periodo sarà il migliore.

È stato utile?

Soluzione

La mia comprensione di come funziona la soglia di visualizzazione dell'elenco è limitata, tuttavia, sospetto il motivo per cui la tua query Caml è in mancanza perché sta filtrando sul campo non indicizzato e il rightlimit viene applicato "dopo". Penso che indicizzare il campo checkoutusore risolverebbe il tuo problema, tuttavia sembra che tu abbia molti siti.

Consentono a suggerire un approccio alternativo - paging.Poiché la colonna ID su ogni elenco è indicizzata, implementare una query Caml in cui si sta filtrando prima (molto importante) sulla colonna ID inferiore a, ad esempio, 2000 e in secondo luogo sul campo checkoutusore.Se tale query non restituisce il numero desiderato di risultati, aumentare da 2000 a 4000 e ripetere.

Non ho implementato questa soluzione anch'io, è solo un pensiero.

Altri suggerimenti

Se si stanno interrogando liste di grandi dimensioni, dovresti assolutamente indicizzare i campi su cui stai interrogando.La limitazione non si verifica perché i campi indicizzati sono memorizzati in una tabella separata nel database.

Questo post del mio blog dovrebbe essere di qualche aiuto che penso: http://vrdmn.blogspot.in/2012/11/sharepoint-list-indexes-under-hood.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a sharepoint.stackexchange
scroll top