modest violet

modest violet

開発者としてのあれこれや、日々の雑記など

your future hasn't written yet. no one's has.
by Emmett Lathrop "Doc" Brown

Joinを多用するとLINQ to SQLは遅い?

LINQ to SQLが便利すぎてDataAdapterとかCommandには戻りたくない今日この頃です。ようやくメソッド形式にも慣れてきて、メソッド形式になっていないときもちわるいかも!という風に思えるようになって来ました。でも、1つ困った事に、書き方によってはレスポンスが簡単に悪くなってしまうみたいなんです。今日もリリース間近のシステムで、SQLへの対合わせに9秒もかかっている箇所が見つけられました。大体1秒強くらいが妥当値だと思える箇所です。今日半日すったもんだした事を綴ります!

 

 さて、Joinが遅いのか?

キチンとベンチマークしていないので確実な事は言えませんが、体感的にはそんなに遅いとも思えない。ただ、今回は6テーブルくらいjoinして、その中で更に絞り込んだテーブルとjoinするといった「少々重たい処理」というのをしていました。ここの処理をコメントアウトしてテスト実行すると、さらっと処理が終わる。んー、LINQの書き方かなー。あっ、クエリ式で書いてるなぁ。。。joinはクエリ式の方がわかりやすいからそうしたんだった。。。

とりあえずテーブルを小分けにしてみた

joinで値を取得していたテーブル達をそれぞれ単一で値を取得するように変更しました。取得結果から値を集めて結果を返す形です。
速度的に50%早くなった。
 
ビルドが、通るからと言ってムリなjoinを組むのは良くないという事ですね。

でも美しくない!

早くなったんですが、ソースコード的にはあまり美しくない。SQLを1回投げるのと6回投げるのならば、1回投げる方がベターだと思いますし、そうしてきました。はてさて、どれが正解なんだろう。もう少し色々試してみようっと。