私はEntityFramework4(データベースファースト)を使用して映画データベースアプリに取り組んでおり、リストに約8,200行をロードするのに30秒かかります。関連するテーブルは3つあり、.Include()を使用すると、パフォーマンスがさらに低下します。8,200行をロードするのに約3分かかります。これは苦痛です。一度にたくさんのテクノロジーを学んでいることを考えると、簡単な修正があることを望んでいます。詳細は次のとおりです。
表1-ビデオ
これは、約7,800行のビデオについて31列の大きなテーブルです。主キーとしてGuidを使用します。
表2-ActorsVideos(ジャンクションテーブル)
このテーブルには、(1)VideoID列と(2)ActorID列の2つの列があります。両方の列はGUIDであり、それぞれVideoテーブルとActorテーブルへの外部キーです。このテーブルは、両方の列が主キーとして機能する複合主キーを使用します。EF4はこのテーブルをモデル化しません。ただし、ナビゲーションプロパティを作成します。このテーブルを使用すると、ユーザーは任意の数の俳優を映画に割り当てることができます。
表3-アクター
約400行の16列があります。繰り返しますが、主キーはGuidです。
コードでは、Videosテーブルの約10列を読み取ってから、関連するActorsテーブルの列を読み取ります。
C#コードは次のようになります。
var videos = context.Videos
foreach (var video in videos)
{
// retrieve 10 or so properties from 'video'
if (video.Actors.Count > 0)
{
foreach (var actor in video.Actors)
{
// retrieve some properties on the actor
}
}
}
context.Videosの後に.Include( "Actors")を追加してみましたが、前述のように、パフォーマンスはひどいものから恐ろしいものになりました。
インクルードで生成されるSQLを見てきましたが、ビデオテーブルにある列の数を考えると、約2Kのテキストです。
マスター/詳細パターンを使用してビデオテーブルを分割する必要がありますか?次のステップは、actorsテーブルをキャッシュし、navigation/associationプロパティを完全に回避することです。これを高速化するための他の提案はありますか?私の意見では、5〜6秒以内に実行されるはずです。
編集:データベースはSQL ServerCE3.5です。