大きなリストでのリスト ビューのしきい値の一時的な無効化

大きなリストでのリスト ビューのしきい値の一時的な無効化

Body:

SharePoint 2010 では、別のユーザーによって不用意に実行された高コストの操作からサーバーやその他のユーザーを保護するために、新しい制限がいくつか追加されています。SharePoint 2010 ソフトウェアの境界および制限事項の全容については、こちら (https://technet.microsoft.com/ja-jp/sharepoint/ff601870.aspx) を参照してください。各種制限の違いの詳細については、こちらをクリックしてヘルプ トピック (https://office2010.microsoft.com/ja-jp/sharepoint-server-help/HA010378155.aspx) を参照してください。大きなリストの管理に役立つ機能と関連するベスト プラクティスの詳細については、こちらのホワイト ペーパー「Designing Large Lists and Maximizing List Performance (英語)」 (https://technet.microsoft.com/ja-jp/library/ff608068.aspx) を参照してください。

リスト ビューのしきい値は、サーバーの全体管理で管理できる、Web アプリケーションごとの "リソースの調整" 設定にあるしきい値の 1 つです。既定では 5,000 に設定されています。つまり、5,000 を超えるアイテムを一度に処理しようとするビューやクエリはすべて SharePoint サーバーによってブロックされます。たとえば、あるビューで 5,001 個のアイテムを持つリストのインデックス付けされていない列に対してフィルター処理を行うと、リスト ビューのしきい値によってそのクエリがブロックされたことをユーザーに通知するメッセージが表示され、時間帯が設定されている場合は、この操作が許可される時間もメッセージに記載されます。

アップグレードの直後は、一部のユーザーが既存のビューから自分のデータにアクセスできなかったり、希望する方法 ("色" という列によって並べ替えを行うなど) でデータにアクセスできなかったりすることがあり、その場合は自らの大きなリストにインデックスを追加する必要があります。ただし、リスト ビューのしきい値制限が適用されるため、以下のようにしない限りこの作業は実行できません。

  1. とにかく時間帯を設定して有効にする場合は、管理者によって時間帯が設定されるのを待ちます。既定では、時間帯は設定されていません。組織の "オフ ピーク" 時間を十分に把握するという管理者の役割に関わる決定が必要になるからです。これは推奨される対処の方針ですが、ユーザーが直ちにそのデータにアクセスする必要がある場合は問題の十分な解決に至らないことがあります。
  2. 大きなリストを持つすべてのユーザーが各自のビューのすべてにアクセスできるように、ファームの管理者がリスト ビューのしきい値を十分に大きな数にします。この方法は推奨されません。サーバーの正常性と安定性に対する大きなリスクが伴い、少数のユーザーの問題を解決する代わりにその他すべてのユーザーに問題が発生したり、作り込みの不十分なビューやキューの作成を促進したりする可能性があります。
  3. 管理者は、ユーザーの特定のリストに対してリスト ビューのしきい値の一時的な免除を与えます。この免除はプログラムによってのみ行うことができます。以下に、その実現方法と、ユーザーに対して指定した期間が過ぎるとその免除を無効にする方法を示します。こうした免除はかなり慎重に与えること、また不必要に長い期間にわたって有効にしないことを強くお勧めします。ほとんどの場合、1 週間の期間を与えれば、ユーザーは自らのビューまたはカスタム コードを十分に修正できるはずです。

リスト ビューのしきい値を特定のリストで無効にする場合は、オブジェクト モデルを使用して、そのリストの "EnableThrottling" プロパティを false (既定値は true) に変更できます。以下のコードは、ある特定のリスト、または特定のサイトの下にあるすべてのリストに対してこの操作を行う方法を示しています。こうした免除は、サイト全体ではなく、特定のリストにのみ与えるのが最適です。というのは、免除の対象をきめ細かく指定したほうがサーバーのパフォーマンス低下の原因が追跡しやすくなり、またリストを修正することの重要性をできるだけ迅速にエンド ユーザーに訴えることができるからです。

以下に、SharePoint チームのテスト担当者である Chris Clark が作成した、こうした変更を実行するためのスクリプトを示します。この変更を元に戻す (つまり、あるリストまたは Web 内のすべてのリストに対する免除を無効にする) 場合は、次の行を変更するだけで済みます。

$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 https://localhost -ListName "Shared Documents"

#               makeexceptionlist.ps1 -WebUrl https://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

Program Manager on SharePoint, Microsoft

投稿日: 2010 年 8 月 15 日 午後 11:40

これはローカライズされたブログ投稿です。原文の記事は「Temporarily disabling List View Threshold on a large list」をご覧ください。