如何从启用限制的大型列表中获取?

时间:2010-09-30 18:04:39

标签: sharepoint sharepoint-2010 throttling

我们有一个包含50.000项的SharePoint列表,并希望从中获取一些数据,而不会禁用SP2010的默认限制。

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 Connections 2010的MVP专家的说法,这是按设计,因为结果集上的隐式排序仍会触发5000项限制阈值。

哪个好,所有,但是我们从这个列表中获取的方式是什么?使用ContentIterator会更好吗?如果是这样,内容迭代器将实现这一目标的神奇之处是什么呢?

5 个答案:

答案 0 :(得分:3)

您可以使用:

query.QueryThrottleMode = SPQueryThrottleOption.Override;

以超级用户身份执行查询。

http://adicodes.com/sharepoint-2010-list-throtelling/

答案 1 :(得分:2)

作为管理员,而不是开发人员,我没有适合您的代码解决方案 - 但确实有2个无代码“解决方案”供您考虑。

  1. SP为列表/网站集所有者提供了一组不同的限制规则 - 默认情况下我认为设置为10000 - 但可以提升。这个想法是平均最终用户被限制,但不是列表所有者。这可能会有所帮助。
  2. SP还允许管理员定义在没有任何类型限制的情况下执行查询的时间。因此,如果它可以在午夜运行您的查询等 - 这可能是一个选项。
  3. 这些设置均在Web应用程序级别进行调整

答案 2 :(得分:2)

您的<Where>子句中使用的字段需要编入索引。

设置索引字段也需要在限制之外进行。例如,您有一个全新的列表,设置索引的列将通过。但是,一旦该列表的项目数超过限制阈值,设置新索引将失败,因为限制也适用于添加索引。

答案 3 :(得分:2)

您可以使用ContentInterator帮助访问大型列表中的5,000多个项目,而无需达到列表限制限制并接收SPQueryThrottleException。

ContentIterator实现了一种回调模式,用于对查询进行分段,以便一次处理单个项目。如果您需要处理可能超出限制限制的大量项目,请考虑使用此功能

答案 4 :(得分:2)

ContentIterator解决方案有一个例外:如果你的列表被索引(这是必需的),如果索引有超过5000行(基于Central Admin),你甚至会在contentIterator实例之前得到一个限制异常开始浏览内容。