私はEntity Frameworkのパフォーマンスに非常に特有の問題があります。私はフレームワークのバージョン7をSQLiteプロバイダ(どちらもnuget製)で使用しています。データベースには約10百万のレコードがありますが、将来は約100百万個になります。 dbの構築は非常に簡単です:(Entity framework)Group by-lowパフォーマンス
public class Sample
{
public int SampleID { get; set; }
public long Time { get; set; }
public short Channel { get; set; } /* values from 0 to 8191, in the presented test 0-15 */
public byte Events { get; set; } /* 1-255 */
}
public class Channel
{
public int ChannelID { get; set; }
public short Ch { get; set; }
public int Es { get; set; }
}
public class MyContext : DbContext
{
// This property defines the table
public DbSet<Sample> Samples { get; set; }
public DbSet<Channel> Spectrum { get; set; }
// This method connects the context with the database
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
var connectionStringBuilder = new SqliteConnectionStringBuilder { DataSource = "E://database.db" };
var connectionString = connectionStringBuilder.ToString();
var connection = new SqliteConnection(connectionString);
optionsBuilder.UseSqlite(connection);
}
}
私はイベントをチャンネル別にグループ化し、スペクトルのようなものにしようとします。私はlinq2sqlを使用するとき、私は非常に低いパフォーマンスを持っています。 10mのレコードでは約15分かかり、1GBのRAMを取得してOutOfMemoryExceptionをスローします。Entity Frameworkはすべてのレコードをオブジェクトとしてメモリにロードしていると思いますが、なぜですか?一方、シンプルなSQLは約3秒を要し、大量のRAMを必要としません。
using (var db = new MyContext())
{
var res1 = from sample in db.Samples
group sample by sample.Channel into g
select new { Channel=g.Key, Events = g.Sum(s => s.Events) };
res1.ToArray();
var res2 = db.Natas.FromSql("SELECT Channel as ChannelID, Channel as Ch, SUM(Events) as Es FROM Sample GROUP BY Channel");
var data = res2.ToArray();
}
助けてくれてありがとう;)
なぜ「orderby」が必要ですか? –
私はorder byを使って結果を適切な順序で取得します(グループ化してから使用してください)。この場合linqのこの部分を削除しても、パフォーマンスは変わりません。 質問のコードでOrderByの部分を削除して、より明確にしました。 –
しかし、注文は "はるかに高速な純粋なSQL"ではありません。 SQLが機能的に同一でない限り、リンゴとオレンジを比較します。 – TomTom