質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
LINQ to Entities

LINQ to Entitiesは、言語統合クエリであるLINQをEDMに行う機能を指します。C#/VBといった言語に統合されており、Visual StudioのIntelliSense機能を始めとするコーディングの様々なサポートを受けることが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

Q&A

解決済

2回答

4256閲覧

LINQ to Entities(クエリ式)と生のクエリってそんなに実行速度が異なるのですか?

widget11

総合スコア221

LINQ to Entities

LINQ to Entitiesは、言語統合クエリであるLINQをEDMに行う機能を指します。C#/VBといった言語に統合されており、Visual StudioのIntelliSense機能を始めとするコーディングの様々なサポートを受けることが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

0グッド

0クリップ

投稿2018/11/27 09:39

編集2018/11/27 09:46

現在インターンでとある会社のアプリケーションのスタッフツールの速度改善を行っております。
環境はwindows(intel corei-5)、ASP.NET MVC5,VisualStudio2017,EntityFrameWork6.2,MySql.Data8.03です。

基本的に放置気味な感じで体感で表示して遅いなってところを直してみてといった感じの要求がざっくりしている内容である為、stopwatch.Start();stopwatch.Elapsed;等のストップウォッチ系のプロパティを置いて実行速度を計って遅そうな箇所を調べていました。(あとはchromeの検証<network画面を見たりという感じです)

調べた結果やはり実行に時間がかかるのがDBとのやり取りで、2万件ほどある顧客の情報をListとして取ってくるといった処理には少々時間がかかっていました。
とは言ってもそれを画面に表示するのにかかる時間は大体5秒くらいで、表示やページングを除く、リスト取得のメソッドが実行されるまでには大体2.5秒ほどかかるものでした。なので言うほど改善するべき箇所か疑問です。ログにそのLINQ式をSQLとして吐き出してみたのですが、書き方もとんでもなく冗長な形になっていましたし、それをべた書きして実行するのもどうかと思いました。。

特に他の箇所では無駄なループが回っていたりするようには見えないですし、高速化するといっても構文レベルの問題ではないでしょうし困っています(緩いインターンではあるので別にアウトプットをそこまで求められているものではないのですが)。
C#(.NET MVC)のDB周りの高速化について調べていると、生のSQLを発行させることが一番速いといった記事をよく目にしました。しかし記事によっては誤差の範囲や、そこまで変わらないといったものも目にしました。

質問をまとめるとアプリケーションのパフォーマンスを上げる上でLINQ to Entitiesと生のクエリを書くことはそこまで違いが出るものなのでしょうか?
またサイトパフォーマンスを上げたい際はどのようなことに着目すればよいでしょうか?
抽象的な質問で申し訳ございませんがよろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こんにちは。

EntityFrameworkはどうやっても生SQLよりは遅くなります。Linq to Entitiesはクエリの組み立てにもある程度のコストが掛かってしまうからです。
しかし、それで生SQLに置換したところで速度が改善できるかというと、その箇所がネックになっていない限りは労力に見合わない結果になります。
まずは、以下を確認してみてください。

  1. EntityFrameworkが吐いたクエリと「同じもの」を返すクエリを自分で書いてみて、それぞれを直接発行したときに速度に明らかな違いがあるかどうか
  2. EntityFrameworkが発行したクエリの中で、実際には必要の無いデータを取得していないかどうか

この2つを調査し、それにより明らかに速度に差が出るというのであれば、生SQLに置換することで速度の改善が見込めるということになります。
2番については、Linq to Entitiesの記述を見直すことで改善できる可能性もあります。

その他に、速度低下を起こしやすいものというと、「ループで呼び出している部分が実は内部でIO処理を行っていた場合」ですかね。例えば、2万件のループで2万回DBに接続している、とか。こういうのは社内フレームワークの中に埋もれていたりすることがままあるので注意する必要があります。

投稿2018/11/27 13:09

tamoto

総合スコア4110

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

生のSQLを発行させることが一番速い

意図するところは、冗長な記述を排除し、適切なインデックスが使用されるように、SQLチューニングが可能であるという事です。

サイトパフォーマンスを上げたい際はどのようなことに着目すればよいでしょうか?

実際に出力されているその冗長なSQLに対し実行計画を取得して、不足のインデックスを追加するなどは行えるのでは無いかと思います。

ただ、

2万件ほどある顧客の情報をListとして取ってくるといった処理には少々時間がかかっていました。
とは言ってもそれを画面に表示するのにかかる時間は大体5秒くらいで、表示やページングを除く、リスト取得のメソッドが実行されるまでには大体2.5秒ほどかかるものでした。

画面の描画の方が時間が掛かっていますので、手当てするのは画面の方が改善効果は望めそうです。
つくり的なところもあると思いますので、具体的手当については言及できませんけれど。

投稿2018/11/27 09:53

編集2018/11/27 09:56
sazi

総合スコア25195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問