我有一个多租户数据库,根据查询的租户返回大量不同的行。最近我们遇到了参数嗅探问题,其中针对一个租户执行的实体框架(EF)查询(TenantID = 1)比针对另一个租户(TenantID = 2)的相同查询花费更长的时间。我做了一些研究,并确定EF不支持查询提示(请参阅this question),这将允许我强制查询每次重新编译。现在我想知道我是否可以拦截由EF生成的Sql查询并在执行之前手动附加“OPTION(OPTIMIZE FOR UNKNOWN)”。这可能吗? EF可插拔,以便我可以在生成之前修改生成的Sql吗?有没有如何做到这一点的例子?
答案 0 :(得分:1)
您是否尝试过解决此问题?您可以强制EF不使用参数,例如:
var q = Context.Tenants.Where(t => t.TenantID == tenantId);
...将使用参数,但是:
var r = Context.Tenants.Where(t => t.TenantID == 1);
......不会,我敢打赌:
var s = Context.Tenants.Where("it.TenantID = 1");
......也不会。