4

我们有一个包含 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会是更好的选择吗?如果是这样,内容迭代器会发挥什么魔力来实现这一点?

4

5 回答 5

3

您可以使用:

query.QueryThrottleMode = SPQueryThrottleOption.Override;

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

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

于 2013-11-10T14:29:19.807 回答
2

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

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

于 2012-02-07T22:31:40.533 回答
2

ContentIterator 解决方案有一个例外:如果您的列表已编入索引(这是必需的),如果索引有超过 5000 行(基于 Central Admin),即使在 contentIterator 实例开始运行之前,您仍然会遇到节流异常通过内容。

于 2013-05-01T16:19:36.430 回答
2

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

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

于 2012-05-27T09:28:57.293 回答
2

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

  1. SP 允许为列表/网站集所有者设置一组不同的限制规则 - 我相信默认设置为 10000 - 但可以提高。这个想法是普通最终用户受到限制,而不是列表所有者。这可能会有所帮助。
  2. SP 还允许管理员定义一天中可以在没有任何限制的情况下执行查询的时间。因此,如果可以在午夜运行您的查询等 - 这可能是一种选择。

这两个设置都在 Web 应用程序级别进行了调整

于 2010-12-18T14:32:14.367 回答