BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース .NETプラットフォーム用のORMプロファイリング・ツール

.NETプラットフォーム用のORMプロファイリング・ツール

原文(投稿日:2009/11/16)へのリンク

悲しいことに、「ORM」という言葉には、「パフォーマンス問題」がいつも付きまとう。開発者から基礎となるSQLを隠すことで、ORMは、大きな生産性の向上を提供することができる。残念ながら容易に、ばかばかしいほど悪いクエリを生成し、それを認識することもない。通常のデータベース管理者は、生成されたコードが呼ぶストアドプロシージャにより、問題となるストアドプロシージャをクロスリファレンスすることにより、呼び出し元の問題のコードを見つけることができる。しかしORMが信じている、動的に生成されたSQLでは、そのようなやり方は、めったに通用しない。そこでORMプロファイリング用のもっとちゃんとしたツールをよく見てみることにする。

NHibernate

NHibernateプロファイラ (NHProf))には、基本的な製品に期待することは、皆含まれている。すべての統計を保持することに加えて、最近呼ばれたクエリのリストを完全なSQL文で、そして完全なスタックトレースにより、それを呼び出したコードまでのバックトレースのリストを表示する。インターフェースがきれいで、非常によくクロスリファレンスされていて、興味のあるクエリを試すことから、あるかたまりのコードが使用する全クエリへ切り替えるのも簡単である。

NHibernateプロファイラで本当に優れているのは、警告機能である。ある警告は、データベースのエラーあるいは偶然にも複数のスレッドが1つのセッションを使ってしまうような緊急の問題を指摘する。別の警告として、おそらくは単一のバッチにまとめられるべきである大量の個別の書き込みのような可能性の高い問題も指摘する。制限なしの結果セットのような将来の問題に繋がるまずい設計を警告すものもある。

制限なしの結果セットは、クエリが実行されて、NHibernateでSetMaxResults()あるいは、SQL文でTOPやLIMITを使用して、返される結果の数を明示的に制限しない場合である。通常、これは、クエリがいつも数レコードしか返さない、とアプリケーションが決めてかかっている、ことを意味している。この仮説は、開発中やテストのときは成り立つが、実運用時に爆発を待つ時限爆弾である。

NHibernateプロファイラの欠点は、ちょっとばかり侵害的なことである。走っているプロセスにアタッチできず、フロントジョブとして配置しなくてはならない。推奨方法は、直接コード中にNHibernateプロファイラへの参照を含めることであるが、log4netのユーザは、app.configの設定を介してプロファイラを動作させることもできる。

NHibernateプロファイラは、有償製品で最低で1ユーザあたり約300ドルである。

LINQ to SQL

LINQからSQLへのマッピングで起きる問題を調べているときに、開発者がおそらく最初に考えるのは、DataContextのロギングである。DataContextオブジェクトは、それが生成するすべてのSQLを選んだTextWriterに届けるLogプロパティを持っている。DataConextは、ただであり使うのも易しいが、ものすごい量の洗練されていないSQL文を生成するので、ちゃんとしたアプリケーションに使うには、問題である。

LINQ to SQLプロファイラ (L2SProf)は、NHibernateプロファイラを作った会社からのもので、同じように動くようだ。リアルタイムなプロファイリングに加えて、分析を後回しするように、ログファイルを生成する設定もできる。NHProfのように、1ユーザ約300ドルで、現在は、ベータ・バージョンである。

Huagatiクエリ・プロファイラ も、侵害的なプロファイラのひとつである。彼がはっきり言うには、「ランタイム・コンポーネントは、Linq-to-SQLかLLBLGen Proのいずれかを使ってSQL Severにアクセルするアプリケーションに統合され、配布されるように設計されている。」幸いにして、実行時に必要に応じてプロファイラをオン・オフできる。

Huagatiのユーザ・インターフェースは、全く時代遅れのものである。画面の半分をSQL文で埋める単一の大きなグリッドとその下にあるスタック・トレースからできている。NHProfやL2SProfにあるような警告とか要約画面のような気のきいたものは、全くないが、筋金入りの開発者には、圧倒的な特徴がある、詳細な情報である。

Huagatiクエリ・プロファイラは、単に絶対存続時間や行数を示すのではなく、本当に深く調べ、SQL Serverが提供するすべての情報を取り出すのである。単に全体時間のみを示すのではなく、クエリのコンパイル時間対実行時間のような重要な情報が見れる。I/Oが含まれていて、実際の実行計画さえ見ることができる。

Huagatiクエリ・プロファイラは、有償製品で、機能限定バージョンは、1ユーザで50ドル、フル・バージョンが1ユーザで120ドルである。

ADO.NETエンティティ・フレームワーク

この話は、全く哀れなものである。第一に、LINQからSQLへの変換で何が起きているのかを見るような、基本的なSQLロギングさえできないのである。さらに、これと一緒動くプロファイラを誰も作っていないようである。

結論

.NET用のORMフレームワークは、他にもたくさんあるが、どれもADO.NETエンティティ・フレームワークと似たような状況である。ここで述べた2つのプロファイリングツールを別にして、データベースに組み込みのプロファイラを使う際、上記のどれに対してもほとんどあるいは全くサポートが無い。

この記事に星をつける

おすすめ度
スタイル

BT