したがって、Entity Framework 6のMySQLプラグインのパフォーマンスについて不平を言っている記事があります。しかし、これらのほとんどは、悪いSQLを生成しているようです。私はこの問題で苦しんでいるが、それはプラグイン自体に起因するパフォーマンスの遅れによるものと思われる。Entity Framework 6 MySQLとパフォーマンスの差異対MySQLエンジン
List<Address> matches = _rep.GetAddresses(s => s.AddressKey == cleanAddress).ToList();
をし、リポジトリ(_rep
)に私はこれを持っている:
はここにLINQで私のクエリの
public IQueryable<Address> GetAddresses(Expression<Func<Address, bool>> query)
{
//var foo = Addresses.AsNoTracking().Where(query);
//var bar = foo.ToString();
return Addresses.AsNoTracking().Where(query);
}
だから私はすでに試してみて、パフォーマンスを向上させるためにAsNoTrackingを使用しています。
SELECT
`Extent1`.`AddressId`,
`Extent1`.`AddressKey`,
`Extent1`.`NameKey`,
`Extent1`.`Title`,
`Extent1`.`Forename`,
`Extent1`.`Surname`,
FROM `Addresses` AS `Extent1`
WHERE (`Extent1`.`AddressKey` = @p__linq__0)
OR ((`Extent1`.`AddressKey` IS NULL) AND (@p__linq__0 IS NULL))
十分なシンプル:コメントアウト行は、私があることが判明し、生成されていたSQLを、見ることができますがあります。 AddressKeyがインデックスを持つvarchar(255)列であることに注意してください。
ここには、事があります。私がそのクエリをMySQLワークベンチにスティックして実行した場合(実行時に登録されていない場合は、@p__linq__0
の値が変わります)この時間は0.000秒と表示されます。
しかし、私のクエリの周りにストップウォッチを置き、Linqを実行するのにかかる時間を記録すると、約0.004秒で終了します。あなたが考える大きな違いはありませんが、これは何百万回もこのコードを実行するスピードクリティカルなアプリケーションの一部です。それはすぐに追加されます。
upsertコードの後のブロックで同じ問題が発生します。ワークベンチでネイティブに実行し、それはミリ秒未満です。再度、EFを介して、3〜4ミリ秒かかる。
これはEF MySQLプラグインの弱いデザインになっていると思いますか?もしそうなら、私はストアドプロシージャを介して実行するか、ExecuteSqlCommand()
で直接SQLを実行しようとすると、同じ問題に遭遇するだろうと推測できますか?
このパフォーマンスの遅れを解消するために他に何かできますか?
あなたは多くのコールを用いて測定した平均時間を話している、または(追加のオーバーヘッドを持っている、おそらく最初の)1つだけの呼び出し? –
@IvanStoev EFログされた時間は、1kコールの平均です。 SQLの比較はいくつかの単一コールです。私は、EFが実際の操作でやっていたことを模倣しようと試みるたびに、探していたキーを変更しました。 –
これは単なる推測ですが、実際にはEFクエリーの実行/マテリアライゼーションプロセスのオーバーヘッド、つまりMySQLプラグインとは無関係かもしれません。 [SqlQuery](https://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k(System.Data.Entity.DbSet%601.SqlQuery); k(TargetFrameworkMoniker問題がEFやMySQLのプラグインにあるかどうかを判断するために単純な 'DbReader'と言っていますが、正直なところ私はあなたの要件/期待値を考えています。あまりにも高いです。 –