2010-09-30 33 views
4

我們有一個包含50.000項的SharePoint列表,並希望從中獲取一些數據而不禁用SP2010的默認限制。如何從啓用了Throttling的大型列表中獲取?

MSDN處理大型列表的文章中,我們發現關鍵要素是在SPQuery上使用一個小的RowLimit,並使用ListItemCollectionPosition進行批處理。

然而,我們的代碼(東西)這樣,節流例外同樣會被觸發:

SPQuery query = new SPQuery(); 
query.Query = "<Where><Contains><FieldRef Name=\"MatterName\" /><Value Type=\"Text\">7476922</Value></Contains></Where>"; 
query.ViewFields = "<FieldRef Name=\"MatterName\"/>"; 
query.RowLimit = 10; 

int index = 0; 
do 
{ 
    SPListItemCollection batch = mattersList.GetItems(query); 

    query.ListItemCollectionPosition = batch.ListItemCollectionPosition; 
} 
while (query.ListItemCollectionPosition != null); 

據當時的SharePoint連接2010的MVP專家介紹,這是設計,作爲隱含排序在結果集上仍然會觸發5000個項目的限制閾值。

哪個不錯,所有,但是然後如何我們從這個列表中獲取?會使用ContentIterator是更好的選擇嗎?如果是這樣,內容迭代器將實現這種功能的神奇功能是什麼?

回答

2

作爲管理員,不是開發人員,我沒有針對您的代碼解決方案 - 但確實有2個無代碼「解決方案」供您考慮。

  1. SP允許爲列表/網站集所有者設置不同的限制規則集 - 默認情況下,我認爲它設置爲10000 - 但可能會出現問題。這個想法是平均最終用戶受到限制,但不是列表所有者。這可能會有所幫助。
  2. SP還允許管理員定義可以在沒有任何類型的限制的情況下執行查詢的時間。所以如果它可能在午夜等運行你的查詢 - 這可能是一個選擇。

這兩個設置在Web應用程序級別的<Where>子句中使用

2

字段需要進行索引進行調整。

設置索引字段也需要在限制之外發生。例如,你有一個全新的列表,設置哪些列索引將通過。但是,一旦該列表項數超出限制閾值,設置新索引將失敗,因爲限制也適用於添加索引。

2

您可以使用ContentInterator幫助訪問大型列表中超過5,000個項目,而不會觸及列表限制限制並接收SPQueryThrottleException。

ContentIterator實現了一次回調模式,用於分段處理單個項目的查詢。如果您需要處理大量可能超出限制限制的項目,請考慮使用此功能

2

ContentIterator解決方案存在異常:如果您的列表已編入索引(這是必需的),如果索引具有多個5000行(基於Central Admin),即使在contentIterator實例開始通過內容之前,您仍然會收到節流異常。