3

Entity Framework を使用してデータを取得しています。以下のコードに示すように、LINQ クエリは複数の結合を使用しています。これをより高速な SQL ストアド プロシージャに変更するように依頼されました。この LINQ コードを最適化するにはどうすればよいですか?なぜ遅いのですか?

var brands = (from b in entity.tblBrands
                          join m in entity.tblMaterials on b.BrandID equals m.BrandID
                          join bm in entity.tblBranchMaterials on m.MaterialID equals bm.MaterialID
                          join br in entity.tblBranches on bm.BranchID equals br.BranchID
                          where br.BranchID == branch.branchId
                          select new Brand { brandId=b.BrandID, brandName=b.BrandName, SAPBrandId=b.SAPBrandID}).Distinct();
            return brands.ToList();
4

1 に答える 1

5

パフォーマンスの大きな問題は、私の大きな不満によるものだと思います。キーワードjoinの乱用。

JOINを使用しているため、結果が多すぎます。したがって、DISTINCTを使用しました。さらに悪いことに、SQLサーバーにインデックスがない外部の結果セットに対してこれを行いました。

var brands = from b in context.Brands
where 
    (from m in context.Materials 
        where b.BrandID == m.BrandID 
        where (from bm in context.BranchMaterials 
                where (from br in context.Branches
                        where bm.BranchID == br.BranchID
                        where br.BranchID == branch.branchId
                        select br).Any()
                where m.MaterialID == bm.MaterialID select bm).Any()
        select m).Any()
    ).Any()
select b;

よりパフォーマンスが高いはずです。しかし、これもまた間違っています。ORMを使用するときは、JOINではなくASSOCIATIONSについて考える必要があります。あなたのモデルが意味をなすと仮定して、私は次のことをします。

var brands = from b in context.Brands
             where (from m in b.Materials
                    //Assuming that BranchMaterials is just a Many-Many mapping table
                    from br in m.Branches
                    where br.BranchID == branch.branchId).Any()     
                select new Brand { brandId=b.BrandID, brandName=b.BrandName, SAPBrandId=b.SAPBrandID};
于 2013-03-06T08:12:15.770 に答える