2

我们有一个请求以非常低的速度运行。

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到生成的查询的末尾?

目前我们正在使用存储过程来使其工作,但它看起来不是一个好的解决方案。

  1. 我们失去了所有IQueryable赋予我们的能力。
  2. 所有查询/选择逻辑都存储在我们的应用程序中,但这部分我们必须存储在数据库中。

更新(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

如果您可以让实体框架将查询作为准备好的 SQL 提交(无论如何您都应该这样做),您可以使用计划指南来更改此查询的执行计划:http: //msdn.microsoft.com/en-us/库/ms190417(v=sql.90).aspx

但是,使用查询提示应该始终是最后的手段。您可能希望查看其他选项,例如正确的索引和正确维护的统计信息,而不是对该查询中的所有六个连接操作强制执行哈希连接,从而有效地禁用优化器。

于 2012-12-28T09:10:45.253 回答