Как получить из большого списка с включенным Throttling? - PullRequest
4 голосов
/ 30 сентября 2010

У нас есть список SharePoint, содержащий 50 000 элементов, и мы хотим извлечь из него некоторые данные, не отключая регулирование по умолчанию в SP2010.

Из MSDN , характерного для обработки больших списков, мы решили, что ключевым ингредиентом будет использование небольшого RowLimit для SPQuery и использование 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 );

По мнению экспертов MVP на SharePoint Connections 2010, это по проекту , как неявная сортировкав результирующем наборе все равно будет срабатывать порог регулирования элемента 5000.

Что хорошо и все, но тогда как извлечь из этого списка?Будет ли лучше использовать ContentIterator ?Если да, то в чем заключается магия, которую итератор контента использовал бы для этого?

Ответы [ 5 ]

3 голосов
/ 10 ноября 2013

Вы можете использовать:

query.QueryThrottleMode = SPQueryThrottleOption.Override;

, выполнив запрос от имени суперпользователя.

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

2 голосов
/ 01 мая 2013

есть исключение для решения ContentIterator: если ваш список проиндексирован (что необходимо), если индекс имеет более 5000 строк (на основе Central Admin), вы все равно получите исключение газа даже перед экземпляром contentIteratorначинает просматривать содержимое.

2 голосов
/ 08 февраля 2012

Поля, используемые в вашем предложении <Where>, должны быть проиндексированы.

Настройка индексированных полей также должна происходить вне регулирования. Например, у вас есть новый список, настройка, по которому столбцы индексируются, пройдет. Однако, как только количество элементов этого списка превысит порог регулирования, установка новых индексов завершится неудачей, поскольку регулирование также применимо и к добавлению индексов.

2 голосов
/ 27 мая 2012

Вы можете использовать ContentInterator , который помогает получить доступ к более чем 5000 элементам в большом списке, не превышая ограничение регулирования списка и не получая SPQueryThrottleException.

ContentIterator реализует шаблон обратного вызова для сегментации запроса для обработки одного элемента за раз. Подумайте об использовании этой возможности, если вам нужно обработать большое количество элементов, которые могут превышать предел регулирования

2 голосов
/ 18 декабря 2010

Как администратор, а не разработчик, у меня нет для вас решения для кода - но у вас есть 2 "не-кодовых" решения "для вас.

  1. SP допускает другой набор правил регулирования для владельца списка / семейства сайтов - я полагаю, по умолчанию установлено значение 10000 - но это может быть увеличено. Идея заключается в том, что ограничен средний конечный пользователь, а не владелец списка. Это может быть полезно.
  2. SP также позволяет администратору определять время дня, когда запросы могут выполняться без какого-либо регулирования. Так что, если возможно выполнить ваши запросы в полночь и т. Д. - это может быть вариант.

Обе эти настройки настраиваются на уровне веб-приложения

...