カスタムコードのベストプラクティス


みなさん、こんにちは。猛暑の中いかがお過ごしでしょうか。

お盆休みや夏休みの方も多いと思うので、今回は今までに既に紹介している、カスタムコードの
ベストプラクティスを、いくつかおさらいをかねて紹介させていただきます。

とその前に、以前ある方から伺った言葉で、面白いものがあるので紹介します。

「アプリケーションのパフォーマンスを高める最善の方法は、なにもしないこと。」

半分冗談で半分本気だとのことでしたが、確かになにもしなければ、CPU にもメモリにもネットワークにも
負荷を与えることがないので、リソース面では非常にいい結果が出ます。しかしながら、リソースを使って
"何か” をするのがアプリケーションですので、そこには明白な矛盾が生じます。

そこで詳細を聞いてみたところ、「基本は何もしない。必要な場合のみ最小限のことを実装する。」
そのことを常に意識するということだそうです。表現の仕方が面白いですが王道ではあります。

と、小話が終わったところで、いくつかベストプラクティスを紹介していきます。

読み取り系のベストプラクティス

AllColumns() は使わない
Web サービスを使用する場合には、AllColumns() の使用は避け、明示的に列を指定してください。
これにより SQL Server での CPU 負荷、各サーバーでのメモリ使用量、またネットワーク帯域の
負荷が軽減されます。また FilteredView をクエリする場合にも、 Select * は使用を避けてください。

Where 句を有効活用する
取得するデータの行に対する対策は、Where 句を有効に活用することです。必要のないデータを
取得しないように、Where 句を随時見直し、また対応するインデックスの見直しが必要です。

Order By を極力使用しない
Order By は SQL レベルでコストがかかります。必要ないものはどんどん削除していきましょう。

JOIN を見直す
必要のない JOIN が発生しないかクエリを見直します。また ON に関わる列に対するインデックスを
随時見直していく必要があります。

更新系のベストプラクティス

伝播 (カスケード) の存在を考慮する
レコードの操作を実施すると、カスタマイズの設定により、その内容が複数のレコードに対して
伝播されます。つまり 1 つの処理が、複数の処理になるため、予想外のパフォーマンス低下につながる
訳ですが、対処方法は状況次第です。まずはその存在を意識してみてください。

一括削除を使用する
可能な場合は、一括削除も検討してください。サンプルがSDKにあります。
SDK\Server\Howto\CS\BulkDelete\DeleteCompletedAsyncOperationRecords.cs
SDK\Server\Howto\VB\BulkDelete\DeleteCompletedAsyncOperationRecords.vb

Plug-inに関するベストプラクティス

InputParameters を活用する
処理に必要な情報を Retrieve 処理で読み取っている場合は、同じ情報が InputParameters に
存在していないか確認してください。Plug-in 実行に必要な情報を含んでいるため、活用可能な場合が
意外と多いのです。

EntityImages を活用する
InputParameters に必要な情報がない場合には、Plug-in を登録する際にイメージを渡せます。
イメージとは、エンティティのデータそのものですから、必要な情報を Plug-in のパイプライン内に
持ち込むことが可能です。必要なものだけを渡すようにしてください。

イメージには、処理前と処理後のイメージを渡すことが可能で、Plugin Registration Tool から
簡単に設定が可能です。

ステップ登録後に、ステップを右クリックすると、Register New Image メニューが出ます。
image 
ここでメニューをクリックするとイメージ登録の画面に出ます。Pre、Postイメージを選択し、Parameters
より列を選択してください。
image

ご覧のように、デフォルトは All Attributes ですので、必要なものだけを選ぶ作業を忘れないでください。

ワークフローのベストプラクティス

子ワークフローの活用
子プロセスを活用して、コードを最小単位に落としていく。コードの再利用性を高めるだけでなく、問題の切り分けも
容易になっていきます。ただし子ワークフローも非同期になるため、その点は注意が必要です。

状態の活用
カスタムアクティビティも状態を持つことが可能です。これによりシステム障害から復帰した場合に、2重実行を
防止することが可能です。詳細は SDK で PersistOnCloseAttribute を確認してください。

パラメーターを活用する
必要なデータはパラメータを活用して受け渡しすることが可能です。カスタムアクティビティ内で他の手段で
取得している場合には、パラメーターを活用できないか検討してください。

.NET レベルでのベストプラクティス

.NET レベルでは数多くのベストプラクティスが存在します。たとえば極力 using を使ってオブジェクトの破棄を
確実にすることや、StringBuilder を使用するなどですが、この分野は今回は省略します。

上記の内容が、お問い合わせがあった場合に問題を解消した実績のあるテクニックです。当然プロジェクトごとに
問題も対応方法も変わりますが、参考になれば幸いです。

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

Comments (0)

Skip to main content