LoginSignup
7

More than 1 year has passed since last update.

Entity Frameworkでレコードの取得時間が通常のSQL実行より異様に遅かった話

Last updated at Posted at 2019-09-10

EntityFrameworkを利用して1000万件くらいあるテーブルからレコード取得したら10秒くらいかかった。
検索条件はインデックス張ってる1カラムをキーとして取得しているだけ。

なぜ?

EntityFrameworkが実行しているSQLをOracle SQL Developerで叩くと0.1秒で返って来る。

これはおかしい。

最初に原因

Entityとして定義したクラスの定義とDBのテーブル定義に乖離があったため、遅くなっていたらしい。

下記ページを見て解決しました。
ttps://codeday.me/jp/qa/20181211/75824.html
[20210520]リンク先が消えていたのでリンク削除

やったこと

CHARカラムにタイプと長さを書いた

sample.cs
        [Column(TypeName = "char")]
        [StringLength(6)]
        public string SAMPLE_CHAR_CLM { get; set; }

VARCHARカラムに長さを書いた

sample.cs
        [MaxLength(10)]
        public string SAMPLE_VARCHAR_CLM { get; set; }

null許可の数値、日付カラムをnullableにした

sample.cs
        public long? SAMPLE_NULLABLE_NUM{ get; set; }
        public DateTime? SAMPLE_NULLABLE_DATE { get; set; }

何故気付いたか

恐らく、レコードが大量にあったから。
コードファーストで作っている場合は発生しないと思うが、既存のテーブルがあってそれに合わせてEntityクラスを作る場合、同様の問題が発生する可能性がある。
このときEntityFrameworkは不整合が発生した各カラムについて全レコードアクセスをしてからレコードを取得していて、そのせいでレコード取得に時間がかかっていると想像。

レコードが少なければアクセスも少ないため、この問題に気付きにくいのだろう。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7