2

非常に低速で動作するリクエストが 1 つあります。

しかし、OPTIONクエリに句を追加すると、飛び始めます。このような:

select distinct 
    d.* 
from 
    Bundles b, 
    Bundles_Permissions bp, 
    CameraGroupPermissions cgp, 
    Addresses a, 
    Districts d, 
    Cameras c, 
    Cameras_CameraGroups ccg 
where 
    b.Id = bp.BundleId 
    and bp.CameraGroupPermissionId = cgp.Id 
    and cgp.ShortName = 'See-Cameras' 
    and b.CameraGroupId = ccg.CameraGroupId 
    and ccg.CameraId = c.Id 
    and b.UserGroupId = ''
    and c.AddressId = a.Id 
    and c.CameraStateId in (5,3,4,9) 
    and c.IsDeleted = 0 
    and d.Id = a.DistrictId 
    OPTION (HASH JOIN) 

OPTION問題は、生成されたクエリの最後にEntity Framework を追加する方法です。

今のところ、ストアド プロシージャを使用して機能させていますが、良い解決策には見えません。

  1. IQueryable私たちは私たちに与えるすべての能力を失います。
  2. すべてのクエリ/選択ロジックはアプリケーションに保存されますが、この部分はデータベースに保存する必要があります。

UPDATE (linq2Entity スロー リクエストの例):

camsResult = from permis in ((MoscowVideoDbEntities) ObjectContext).CameraGroupPermissions
                             where permis.ShortName == Permissions.CameraGroupSpecific.SeeCameraVideo
                             from bundles in permis.Bundles
                             where bundles.UserGroupId == user.UserGroupId
                             from cams in bundles.CameraGroup.Cameras
                             where
                                 !cams.IsDeleted
                                 && (
                                        cams.CameraStateId == (int) CameraStates.InExploitation ||
                                        cams.CameraStateId == (int) CameraStates.OnVerification ||
                                        cams.CameraStateId == (int) CameraStates.Rejected ||
                                        cams.CameraStateId == (int) CameraStates.OnMaintenance
                                    )
                                 && cams.Address != null
                             select cams;

var result = (from cams in camsResult 
    from districts in ((MoscowVideoDbEntities)ObjectContext).Districts 
    where districts.Id == cams.Address.DistrictId 
    select districts).Distinct().ToList(); 
4

1 に答える 1

2

Entity Framework にクエリを準備済みの SQL として送信させることができる場合 (とにかくこれを行う必要があります)、プラン ガイドを使用して、このクエリの実行プランを変更できます: http://msdn.microsoft.com/en-us/ライブラリ/ms190417(v=sql.90).aspx

ただし、クエリ ヒントの使用は、常に最後の手段にする必要があります。そのクエリの 6 つの結合操作すべてでハッシュ結合を強制してオプティマイザーを効果的に無効にする代わりに、適切なインデックス作成や適切に維持された統計などの他のオプションを検討することをお勧めします。

于 2012-12-28T09:10:45.253 に答える