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は不整合が発生した各カラムについて全レコードアクセスをしてからレコードを取得していて、そのせいでレコード取得に時間がかかっていると想像。
レコードが少なければアクセスも少ないため、この問題に気付きにくいのだろう。