0

상당히 큰 목록에서 항목을 검색하는 데 문제가 있습니다. 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 
} 

사람이 문제의 원인이 될 수있는 것을 알고 있나요?

미리 감사드립니다.

답변

2

매우 오랜 투쟁 끝에 해결책을 찾았습니다.

우리는이 게시물을 발견 :

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

우리는 그것을 테스트를하고 일했다! ,

그래서 우리가해야 할 일을했을 모든 스위치 true로와 "자동 업데이트 통계" "자동 통계를 생성", 그리고에 대한 문제는 모든 replys에 대한

감사를 해결되었다

+0

링크를 더 이상 사용할 수 없습니다. –

0

CAML 쿼리를 사용하여 데이터를 가져 오십시오.

데이터가 있으면이를 SPQuery에 넣을 수 있습니다.

1

list.Items, list.GetItems(query) (빈 쿼리 사용)을 통해 항상 모든 항목을 검색하려고하면 서버를 종료합니다.

당신은 관련 쿼리를 정의하고 SPQuery의 ROWLIMIT 속성을 통해 검색하려는 결과의 양을 지정해야합니다 전에 어떤 다른 메모리에있는 모든 항목을로드 그렇지 않을 경우

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

조작. 이러한 모든 데이터를로드하려고하면 응용 프로그램 풀에서 사용 가능한 메모리 또는 SQL Server 메모리를 죽일 것입니다.

희망을 얻었습니다.

+0

자원을 절약하기 위해 목록에서 관련 행만 검색해야 할 필요는 있지만이 특정 인스턴스에서는 목록의 모든 항목을 검색해야한다. 우리는 캐싱 프레임 워크에서이 코드를 사용한다. 우리는 웹 파트가 데이터를 빠르게 검색 할 수 있도록 캐시에 모든 항목을로드합니다.이 코드는 dev 환경에서 잘 작동하지만 클라이언트 스테이징 환경에서만이 문제가 있습니다.우리는 이것을 많은 고객들과 함께 사용해 왔으며 문제가 없었으며 다른 고객들도 10 000 개의 항목을 가진 목록을 가지고있었습니다. 그리고 우리는 그 항목들을 검색하는 데 아무런 문제가 없었습니다. – Appelman

+0

이것은 왜 나는 그것의 SQL 문제, 그리고 SP 또는 코딩 문제가 아니라고 생각합니다. – Appelman

+0

Mmmmh interesting. 당신은 SPListItem이로드 될 때 첨부 파일이로드되어 있는지 확신 할 수 없지만 일부 무거운 항목 (어쩌면 첨부 파일이있는 일부 항목)이 있다고 생각하지 않습니까? 서버의 메모리 할당을 확인 했습니까? 이 환경 특정 (준비, 나는 그것이 생산에서 사건이되지 않을 바랍니다) "배치에 의해"로드하고 결과를 캐시 내 응용 프로그램에서 특정 스위치를 추가합니다 (예 : 첫 번째 2000 수천 다음 2000까지 4000, 당신이 요점을 얻을)하지만 난 여전히 램 문제가 확실 해요.이 전용 데이터베이스 서버입니까? –

관련 문제