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://adcodes.com/sharepoint-2010-list-throtelling/

于 2013-11-10T14:29:19.807 に答える
2

ContentInteratorを使用すると、リストの制限に達したりSPQueryThrottleExceptionを受け取ったりすることなく、大きなリスト内の5,000を超えるアイテムにアクセスできます。

ContentIteratorは、一度に1つのアイテムを処理するためにクエリをセグメント化するためのコールバックパターンを実装します。スロットル制限を超える可能性のある多数のアイテムを処理する必要がある場合は、この機能の使用を検討してください

于 2012-05-27T09:28:57.293 に答える
2

句内で使用されるフィールド<Where>にはインデックスを付ける必要があります。

インデックス付きフィールドの設定は、スロットリング以外でも行う必要があります。たとえば、まったく新しいリストがあり、どの列にインデックスを付けるかを設定すると合格します。ただし、そのリストのアイテム数がスロットリングのしきい値を超えると、スロットリングはインデックスの追加にも適用されるため、新しいインデックスの設定は失敗します。

于 2012-02-07T22:31:40.533 に答える
2

開発者ではなく管理者として、コードによる解決策はありませんが、考慮すべきコードなしの「解決策」が 2 つあります。

  1. SP では、リスト/サイト コレクションの所有者に対して異なるスロットリング ルールのセットを使用できます。デフォルトは 10000 に設定されていると思いますが、これを増やすことができます。平均的なエ​​ンドユーザーは抑制されていますが、リストの所有者は抑制されていないという考えです。それは役立つかもしれません。
  2. SP では、管理者は、スロットリングなしでクエリを実行できる時間を定義することもできます。したがって、真夜中などにクエリを実行できる場合は、オプションになる可能性があります。

これらの設定は両方とも、Web アプリケーション レベルで調整されます。

于 2010-12-18T14:32:14.367 に答える