SPQuery는 목록 보기 임계값 아래의 라이브러리에서 작동하지만 그 이상에서는 작동하지 않습니다.

sharepoint.stackexchange https://sharepoint.stackexchange.com//questions/62609

문제

그래서 현재 웹의 모든 Doclib을 열거하고 체크아웃된 모든 파일을 가져와 테이블에 나열하는 웹파트를 구축 중입니다. 이를 통해 사용자는 일부 필수 메타데이터를 적용하고 한 번에 여러 개를 체크인할 수 있습니다(50).

이 웹 파트는 목록 보기 임계값(현재 프로덕션에서 15,000개로 설정됨)을 초과하는 목록과 매우 큰 사이트(50,000 - 100,000개 이상의 문서)에서도 작동해야 합니다.

여기에서는 큰 목록을 처리하기 위한 MS 모범 사례를 따르고 있습니다. http://msdn.microsoft.com/en-us/library/ee557257.aspx

CAML이 전혀 정의되지 않은 SPquery를 사용하여 2,000개 항목의 페이지를 검색하고 해당 방식으로 구문 분석합니다.문제는 웹 파트가 실제로 매우 큰(50,000+) 사이트에서 시간 초과를 발생시킨다는 것입니다.그래서 저는 CAML을 좀 더 현명하게 사용하여 체크아웃된 항목만 가져오려고 노력하고 있습니다.

spQuery.Query = "<Where><IsNotNull>
    <FieldRef Name=\"CheckoutUser\" LookupId=\"TRUE\"/>
</IsNotNull></Where>";
spQuery.RowLimit = 2000;
spQuery.ViewAttributes = "Scope=\"Recursive\"";

나는 CrossListQueryInfo 동일한 caml로 전체 웹을 쿼리하는 쿼리는 LVT에 목록이 없을 때 훌륭하게 작동합니다.그렇다면 해당 예외를 포착하고 각 개별 라이브러리에서 '느린' SPQuery를 사용하여 다시 시도합니다.

내가 읽고 있는 모든 것에서 내 CAML이 LVT보다 적은 항목을 반환하는 한 작동할 것입니다.그러나 위의 CAML을 사용하면 오류가 발생합니다. The attempted operation is prohibited because it exceeds the list view threshold enforced by the administrator 언제 던질까 SPList.GetItems(spQuery) 호출됩니다.행 제한을 2,000으로 설정했기 때문에 그런 일이 발생해서는 안 되는 것 아닌가요?MS는 CAML이 전혀 정의되지 않은 상태에서 SPQuery를 실행할 것을 제안합니다. 기본적으로 2,000페이지의 라이브러리에서 모든 항목을 가져옵니다.따라서 내 CAML이 보기 임계값을 초과하는 목록에서만 실패하는 이유를 이해할 수 없습니다.

편집하다:추가 연구를 통해 활용하려고 합니다. ContentIterator 내 필요에 맞는 수업 (http://msdn.microsoft.com/en-us/library/microsoft.office.server.utilities.contentiterator.aspx).이 게시물의 예를 사용하여: http://extreme-sharepoint.com/2012/07/17/data-access-via-caml-queries/

동일한 LVT 오류로 인해 contentiterator에서 여전히 실패하고 있습니다.

이 쿼리를 실행하려는 모든 목록에서 'CheckoutUser' 필드를 색인화해야 합니까?

업데이트 2:이는 'CheckoutUser' 필드가 색인화되지 않고 쿼리를 시도하기 때문에 발생합니다.불행하게도 우리가 팜의 모든 라이브러리에 이 색인을 강제 적용하는 것은 선택 사항이 아닙니다.이 시점에서 내 유일한 선택은 항목을 일괄 처리하기 위해 매우 큰 사이트에 일종의 페이징 체계를 구현하는 것이라고 생각합니다.

최종 업데이트:해결책으로 저는 라이브러리에 대한 'CheckoutUser' 열 색인을 강제하기로 결정했습니다.이를 통해 웹 파트의 전반적인 성능이 크게 향상되고 대규모 사이트에 대한 지원이 가능해집니다.목록 보기 임계값을 초과하여 목록의 열 인덱스를 수동으로 설정해야 하기 때문에 배포 직후 약간의 골치 아픈 문제가 발생하지만 장기적으로는 이것이 가장 좋습니다.

도움이 되었습니까?

해결책

목록 보기 임계값이 작동하는 방식에 대한 내 이해는 제한되어 있지만 CAML 쿼리가 실패하는 이유는 인덱싱되지 않은 필드를 필터링하고 RowLimit이 "이후" 적용되기 때문인 것 같습니다.

CheckoutUser 필드를 색인화하면 문제가 해결될 것이라고 생각하지만 사이트가 너무 많은 것 같습니다.

대체 접근 방식인 페이징을 제안하겠습니다.모든 목록의 ID 열이 인덱싱되므로 2000보다 작은 ID 열에서 첫 번째(매우 중요)를 필터링하고 두 번째로 CheckoutUser 필드에서 필터링하는 CAML 쿼리를 구현합니다.해당 쿼리가 원하는 결과 수를 반환하지 않으면 2000을 4000으로 늘리고 반복합니다.

나는 이 솔루션을 직접 구현하지 않았으며 단지 생각일 뿐입니다.

다른 팁

큰 목록을 쿼리하는 경우 쿼리하는 필드를 반드시 인덱싱해야 합니다.인덱싱된 필드는 데이터베이스의 별도 테이블에 저장되므로 제한이 발생하지 않습니다.

내 블로그 게시물이 도움이 될 것이라고 생각합니다.http://vrdmn.blogspot.in/2012/11/sharepoint-list-indexes-under-hood.html

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 sharepoint.stackexchange
scroll top