在大型清單上的暫時停用清單檢視臨界值

本文:

SharePoint 2010 新加入了一些限制,這是為了保護伺服器及使用者,不會因為其他使用者執行耗費大量資源的作業而受到影響。如需 SharePoint 2010 軟體界限與限制的完整清單,請至這裡 (http://technet.microsoft.com/zh-tw/sharepoint/ff601870.aspx)。若想了深入了解這些不同限制的用意為何,請至這裡 (http://office2010.microsoft.com/zh-tw/sharepoint-server-help/HA010378155.aspx),參考此篇說明主題。若想深入了解哪些功能可協助您管理大型清單,以及有哪些最佳作法,請參考此份白皮書:設定大型清單及使清單發揮最大效能 (可能為英文網頁) (http://technet.microsoft.com/zh-tw/library/ff608068.aspx)。

「清單檢視臨界值」是在每個 Web 應用程式「資源節流」設定中的一項臨界值,可從管理中心管理此值。它的預設值為 5,000,這表示只要一次處理超過 5,000 個項目的檢視或查詢,SharePoint 伺服器便會予以封鎖。舉例而言,若有個檢視要篩選清單中未編製索引的欄,而該清單有 5,001 個項目,使用者就會收到訊息,表示因為有「清單檢視臨界值」的限制,所以封鎖該查詢,而且如果還設定了每日時間視窗,訊息中也會指出允許執行該查詢作業的時間。

在剛完成升級後的一段時間,部分使用者可能會無法透過以前的檢視存取資料;若想按照所要方式存取資料 (例如,依「色彩」欄排序),使用者必須對他們的大型清單新增索引。但是,他們會一直遇到「清單檢視臨界值」的限制問題,而無法執行工作,解決方式就是:

  1. 等到管理員設定的每日時間視窗 (若已設定且啟用) 再執行。根據預設,並不會設定每日時間視窗,因為這必須由管理員謹慎決定哪些時段對其組織來說是最適合的「離峰」時間。這只是建議的處理方式,有時候若使用者亟需立即存取資料,這種作法就無法滿足使用者需求。
  2. 伺服器陣列管理員大幅提高「清單檢視臨界值」,讓擁有大型清單的人都能存取所有檢視。我們非常不鼓勵這種作法,因為這會對伺服器運作狀況及穩定性帶來極大風險,而且這種作法雖可解決少數人擁有大型清單的困擾,但同時可能為其他人帶來問題,甚至鼓勵建構不當的檢視及查詢。
  3. 管理員可特許使用者的某份特定清單暫時免受「清單檢視臨界值」的限制。這項免受限設置可利用程式設計方式來設定。下面我將示範如何撰寫此作法的程式,其中還可以在您對該使用者所指定的時限一到時,放寬免受限時間。強烈建議您以極為保守方式特許這項免受限設置,且時間也切勿過長而有多餘之虞。在大部分情況下,讓使用者有一星期時間修正檢視或自訂程式碼,就已相當足夠。

若特定清單要停用清單檢視臨界值,您可以在物件模型中編輯該清單,將其 "EnableThrottling" 屬性設為 False (預設值為 True)。以下程式碼可讓您針對一份特定清單或特定網站下所有清單執行此動作。最好僅特許特定清單可有此項免受限的權利,而非整個網站都予以特許,因為小部分個別特許,較容易追蹤是哪些因素致使伺服器效能降低,同時也能讓使用者更清楚知道應儘速修正清單的重要性。

以下指令碼是由 SharePoint 小組的測試工程師 Chris Clark 所寫,此指令碼可執行上述變更。若要回復變更 (亦即,移除某份清單或網站內所有清單的免受限設置),只要將這行程式碼:

$list.EnableThrottling = $false

改成:

$list.EnableThrottling = $true

###########################################################################

#             MakeExceptionLIst Script

#             OnFailure: NONE

#             OnSuccess: Changes SPList settings to make one or more lists under an SPWeb Exception Lists                                         

#                                                                                            

#             Input Parameters:

#               - WebUrl ~ The URL of the SPWeb which contains the lists to be made exception lists

#               - ListName (Optional) ~ The name of the list to make an exception list

#  

#             Ex:

#               makeexceptionlist.ps1 -WebUrl http://localhost -ListName "Shared Documents"

#               makeexceptionlist.ps1 -WebUrl http://localhost/sites/site1 -ListName "*"

#

#       Exit code rule:

#       On success, exit 0

#       On failure, if no other scripts depend on this, exit a none-zero value

#       Do not use "return" to give the caller exit code, as this cannot be

#       captured by the caller process.

###########################################################################

Param([string]$WebUrl = "", [string]$ListName = "")

# Add Sharepoint pssnapin

Add-PSSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue

###########################################################################

#

#             Turn off/on list throttling on selected list

#

###########################################################################

Function UpdateList($list)

{

     $listname = $list.Title

     Write-Host "Making list $listname an exception list"

     $list.EnableThrottling = $false

     $list.Update()

}

###########################################################################

#

#             Retrieve relevant objects (SPWeb, SPList) for operation and call Update

#

###########################################################################

$web = Get-SPWeb $WebUrl

if( $web -eq $NULL )

{

     Write-Host "Web not found.  Exiting"

     exit 1;

}

if ( $ListName -eq "*" )

{

     Write-Host "Locating all Lists under web..."

     $lists = $web.Lists

     foreach( $list in $lists )

     {

                UpdateList( $list )            

     }

}

elseif ( $ListName -ne "" )

{

     Write-Host "Locating List < $ListName >..."

     $list = $web.Lists[$ListName]

     if ( $list -ne $NULL )

     {

                Write-Host "List found!"

                UpdateList( $list )

     }

     else

     {

                Write-Host "List not found.  Exiting"

                exit 1;

     }

}

else

{

     Write-Host "Invalid List Name"

     exit 1;

}

Write-Host "Done!"

exit 0;

###########################################################################

#   End

#

###########################################################################

- Dina Ayoub

Microsoft SharePoint 程式技術經理

發佈日期: 8/15/2010 11:40 PM

這是翻譯後的部落格文章。英文原文請參閱 Temporarily disabling List View Threshold on a large list