最近、いくつかのエンティティに対する linq クエリから 3 つの結合を削除し、代わりにテーブル間の関連付けを使用しました。
クエリの実行に時間がかかるようになりました。パフォーマンスの向上を期待して変更を加えました。
これは、他の人が観察したことと一致していますか? これには論理的な理由がありますか?どの戦略を使用するかについて、適切な経験則はありますか?
結合を含む Linq クエリ:
from n in db.Names
.Where(n.ID = "myID")
**join d in db.InstitutionDemographics on n.ID equals d.ID
join m in db.MemberAdhocIds on n.ID equals m.ID
join ba in db.NameAddresses on n.BillingAddressNumber equals ba.AddressNumber
join sa in db.NameAddresses on n.ShippingAddressNumber equals sa.AddressNumber
join ma in db.NameAddresses on n.MailingAddressNumber equals ma.AddressNumber
join mas in db.MemberAdhocServices on n.ID equals mas.InstitutionID**
join pn in db.PrimaryContactNames on n.ID equals pn.ID into PrimeName
from pn in PrimeName.DefaultIfEmpty()
join cd in currentDuesResults on n.ID equals cd.ID into DuesJoin
from cd in DuesJoin.DefaultIfEmpty()
join bd in billingDateResults on n.ID equals bd.ID
into BillingDate
from bd in BillingDate.DefaultIfEmpty()
** マークの付いたセクションは、EDMX ファイルで関連付けに置き換えられたものです。関係は 1 対 1 であり、制約は結合と同様に ID に基づいています。
また、SQL テーブルには FK 関係がないことにも言及する必要があります。(私が変更できないレガシーなもの)
** 新しい情報 join -vs- associations を使用してクエリによって生成された SQL を取得し、SSMS から実行しました。性能はほぼ同じです。したがって、生成された sql は問題ではなく、linq コードの動作方法に問題があるようです。