私は 6.5.6 mySQL DotNet コネクタを使用して mySQL 5.5.25 に対して最初にコードを使用して EF 5 を使用しています (ただし、DevArt コネクタは同じパフォーマンスを示すため、コネクタではありません)。エンティティは次のとおりです。
public class SocialMediaEventEntity
{
public virtual int Id { get; set; } //PK
public virtual DateTime Date{ get; set; }
public virtual string ProvIdType{ get; set; }
public virtual string ProviderId{ get; set; }
public virtual int Rendered{ get; set; }
public virtual int Sent{ get; set; }
public virtual decimal UserId { get; set; }
public virtual string UserName { get; set; }
public virtual string UserScreenName { get; set; }
public virtual string UserDescription { get; set; }
public virtual ICollection<HistoryEntity> Messages { get; set; }
}
次の Code First を使用して、キーなどを構成します。
HasKey(entity => entity.Id);
Property(entity => entity.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity).IsRequired();
最終的に、次の方法でこのテーブルに単一の行を追加しています。
var socialEvent = new SocialMediaEventEntity()
{
Date = ADate,
ProviderId = AProviderId,
ProvIdType = AProviderIdType,
Rendered = ARendered,
Sent = ASent,
UserId = AUserId,
UserName = AUserName ?? string.Empty,
UserScreenName = AUserScreenName ?? string.Empty,
UserDescription = AUserDescription ?? string.Empty,
Messages = new List<HistoryEntity>()
};
MyDBContext.SocialMediaEvents.Add(socialEvent);
スキンの下で、これにより次の予期される SQL が生成されます。
INSERT INTO tblSocialMediaEvents(`Date`, ProvIdType, ProviderId, Rendered, Sent, UserId, UserName, UserScreenName, UserDescription) VALUES ('2013-03-25 14:26:30', 'Twitter', '316028289447763968', 0, 0, 280310495, 'ChuBbyBhu', 'Komang Trinda Dewi', 'Always smile,,,but no crazy..:D\r All must be beautiful in its time'
私のマシンでプロファイリングされたときのINSERTステートメントは、約1ミリ秒のオーダーで非常に高速ですが、次の呼び出しは次のとおりです。
MyDBContext.SaveChanges();
~20 から ~40 ミリ秒、場合によっては > 100 ミリ秒かかります。
コードをプロファイリングすると、実際にはトランザクションのコミットに最も時間がかかっていることがわかります。ただし、これは、トランザクション内でまったく同じ SQL を mySQL に実行する場合には当てはまりません。
だから私の質問は:
- このコードのパフォーマンスを改善するにはどうすればよいですか? SaveChanges() をあまり頻繁に呼び出さないことは別として?
- HeidiSQL のような mySQL クライアント ツールで同じコードを実行した場合よりも、トランザクションのコミットに時間がかかるのはなぜですか?
ヘルプとポインタに感謝します。
編集: SQL Server 2008 Express に対してまったく同じコードを使用しましたが、パフォーマンスは素晴らしいです。通常、INSERTS は < ~1ms で、SaveChanges は ~1ms です。当然、M$ 製品が高速であることを期待しますが、mySQL に行き詰まっており、変更できません。それで、私にできることはありますか?