Dynamics CRM パフォーマンス : EnableRetrieveMultipleOptimization オプションの紹介

みなさん、こんにちは。

前回、Microsoft Dynamics CRM 2011 およびオンライン環境で利用可能な、
OrgDBOrgSettings ツールを紹介しましたが、その中でもパフォーマンスに
大きな影響のあるオプションとして EnableRetrieveMultipleOptimization
が存在します。

今回はこちらのオプションに関してより詳細な情報を提供します。

背景

ご存知の方も多いと思いますが、こちらのオプションは Microsoft Dynamics
CRM 4.0 の頃に提供されたオプションです。その当時の技術情報が以下です。

https://support.microsoft.com/kb/955138/ja

問題は上記技術情報で記述があるように、以下の条件を満たしている環境で
RetrieveMultiple のパフォーマンスが悪くなる可能性があるというものです。

- レコードをチームやユーザーと共有している
- アクセスしているエンティティに対してユーザーレベルの権限しかない
- エンティティレコードが 500,000 件以上ある
- PrincipalObjectAccess テーブルが 1,000,000 件以上ある

このような状況で、ビューを開く操作などで複数のレコードを取得した場合
パフォーマンスが悪くなる可能性があります。

原因

各エンティティのレコードには所有者フィールドが存在します。よって本人が
所有するレコードを特定することは容易ですが、他のユーザーがレコードを
共有されている場合、アクセス権に関して付加情報が必要となります。

権限が組織レベルの場合は、どのレコードに対して読み取り権限を持って
いるか確認する必要はありませんが、上記シナリオにおいては本人所有の
レコード以外にも読み取れるレコードがある一方、全てのレコードを読み取る
権限はないため、付加情報が必要です。

PrincipalObjectAccess はこのような付加情報を保持するテーブルであり、
結果 RetrieveMultiple 実行時に SQL レベルでテーブルの結合が必要と
なります。ここでデータの持ち方や取得する件数に応じてパフォーマンスが
下がる可能性があります。

解決策

問題の解決策として、EnableRetrieveMultipleOptimization オプションが
Microsoft Dynamics CRM 4.0 Update Rollup 3 から提供されました。値を
1 に設定することでパフォーマンスの向上が期待できます。

Microsoft Dynamics CRM 2011 では、出荷時点でこのオプションが有効です。
しかし権限がユーザーレベル以外にも、部署や部署配下の権限ある場合には
同様の問題が発生することから、Microsoft Dynamics CRM 2011 Update
Rollup 2 で、オプション値として 2 をサポートし、上記シナリオにも対応します。

問題の確認方法

上記問題に該当しているような環境があった場合、簡単な切り分け方法として
ユーザーに組織レベルの権限を一時的に付与することが考えられます。
ユーザーが組織レベルでエンティティに対して読み取りの権限がある場合、
PrincipalObjectAccess の付加情報は不要のため、問題は発生しません。

まとめ

EnableRetrieveMultipleOptimization オプションは全ての組織で値を
2 にする必要はありません。特定の状況においてのみ効果を発揮します。
レコード数が多く、ビューのパフォーマンスが悪い場合に是非お試しください。

‐ Dynamics CRM サポート 中村 憲一郎