Время ожидания получения элементов из списка - PullRequest
0 голосов
/ 26 января 2011

У меня проблема с получением элементов из довольно большого списка. Я могу быстро и легко извлекать элементы из небольшого списка, содержащего более или менее 50 элементов, но когда я пытаюсь извлечь элементы из списка, содержащего более или менее 4600 элементов, процесс sqlsever.exe вызывает скачки на время запроса, но предметы никогда не извлекаются. Если вы настроили параметры регулирования веб-приложений, проблема может быть не в этом. Вот код, который я первоначально использовал для получения элементов. В этом нет ничего особенного.

using (SPSite site = new SPSite(siteUrl))
{
 using (SPWeb web = site.OpenWeb())
 {
  SPList list = web.Lists[uid.ToString()];
  SPListItemCollection itemCollection = list.Items;

  foreach (SPListItem i in itemCollection) //This is where the code stops responding
  {
   //Use list items
  }
 }
}

После того, как это не сработало, я попробовал несколько других способов извлечь элементы из списка. Вот код:

SPList list = web.Lists[uid.ToString()];  

SPQuery query = new SPQuery();
query.Query = "";
query.QueryThrottleMode = SPQueryThrottleOption.Override;

SPListItemCollection itemCollection = list.GetItems(query);

//The code stops here
//I added this part for interest sake, i wanted to if it was the looping that caused the problem
//It seems the when you try to access properties of the item collection that the problem occurs
int itemCount = itemCollection.Count;

foreach (SPListItem i in itemCollection) 
{
 //Use list items
}

Я тоже пробовал:

SPList list = web.Lists[uid.ToString()];
SPListItemCollectionPosition pos;
DataTable dt = list.GetDataTable(new SPQuery(), SPListGetDataTableOptions.None, out pos); //The code stops responding here

foreach (DataRow i in dt.Rows)
{
 //Use data rows 
}

Кто-нибудь знает, что может быть причиной этой проблемы?

Заранее спасибо!

Ответы [ 4 ]

2 голосов
/ 13 апреля 2011

После очень долгой борьбы мы нашли решение.

Мы нашли этот пост:

http://trycatch.be/blogs/tom/archive/2009/04/22/never-turn-off-quot-auto-create-amp-auto-update-statistics-quot.aspx

Мы проверили его, и оно сработало !!!

Итак, все, что нам нужно было сделать, это переключить «Автоматическое создание статистики» и «Автоматическое обновление статистики» на true, и чтобы проблема была решена

Спасибо за все ответы

1 голос
/ 26 января 2011

Вы убьете свой сервер, если всегда будете пытаться получить все элементы через list.Items, list.GetItems(query) (с пустым запросом).

Вам необходимо определить соответствующий запрос и указать суммурезультатов, которые вы хотите получить через свойство RowLimit вашего SPQuery

SPQuery query = new SPQuery();
query.Query = "<OrderBy><FieldRef Name='Title' /></OrderBy>"; // any relevant query here
query.RowLimit = 50;

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

Надеюсь, это помогло.

0 голосов
/ 26 января 2011

Попробуйте загрузить элементы не все одновременно.Вы можете загружать их навалом (по страницам) с помощью SPQuery.ListItemCollectionPosition (http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spquery.listitemcollectionposition.aspx).

)
0 голосов
/ 26 января 2011

Попробуйте получить данные, используя CAML запрос.

Если у вас есть данные, вы можете поместить их в SPQuery .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...