Sql server 在实体框架中,可变条件的运行速度要慢得多

Sql server 在实体框架中,可变条件的运行速度要慢得多,sql-server,linq-to-entities,Sql Server,Linq To Entities,下面的内容非常快,我对任何此类相关问题的第一个“猜测”是参数嗅探。不,不仅仅是procs:}试着运行相同的SQL,有参数和没有参数。它是否遵循程序指示的相同性能/速度?如果您的意思是使用内联的值运行SQL查询,那么它们是的,它执行得很好。无论我以何种方式尝试,我都无法使查询在SSMS中缓慢运行。既然使用静态参数和变量参数生成相同的SQL,为什么要进行嗅探虽然这显然是发生了,但我怀疑这归结为一个可重用的缓存查询计划。当存在变量时,查询计划是相同的,即使它们得到不同的值。清除查询缓存后的第一次运行可

下面的内容非常快,我对任何此类相关问题的第一个“猜测”是参数嗅探。不,不仅仅是procs:}试着运行相同的SQL,有参数和没有参数。它是否遵循程序指示的相同性能/速度?如果您的意思是使用内联的值运行SQL查询,那么它们是的,它执行得很好。无论我以何种方式尝试,我都无法使查询在SSMS中缓慢运行。既然使用静态参数和变量参数生成相同的SQL,为什么要进行嗅探虽然这显然是发生了,但我怀疑这归结为一个可重用的缓存查询计划。当存在变量时,查询计划是相同的,即使它们得到不同的值。清除查询缓存后的第一次运行可能会很快(这是可以尝试的),即使是使用变量的表单也是如此。“ick”是指缓存的计划是在考虑了一些数据的情况下生成的——好吧,如果多样性不存在,它将被存储。在计数之前排序可以解决问题,尽管我不能说我确切地知道原因——所以我不知道它是否会爆炸……(我想它不是“相同的”)作为PS,但归根结底是对当前变量值使用一个非理想的计划。YMMV与“巧妙修改的查询”-在那里,这样做了,成功有限。)
IQueryable<fn_GetDocumentsForContact_Result> _queriable;
var zeus = new Zeus();
var UoW = new UnitOfWork(zeus);
var sp = new StoredProcedureService(zeus);

int _userId = 183494;
int totalRecords = 0;
int doctype = 2;

var predicate = PredicateBuilder.True<fn_GetDocumentsForContact_Result>();

predicate = predicate.And(x=>x.Type == 2);

IQueryable<fn_GetDocumentsForContact_Result> documents = 
    sp.fn_GetDocumentsForContact(183494)
    .AsExpandable()
    .Where(predicate);

_queriable = documents;

_queriable.Count().Dump();
-- Region Parameters
DECLARE @ctcIDnumber Int = 183494
DECLARE @p__linq__0 Int = 2
-- EndRegion
SELECT 
    [GroupBy1].[A1] AS [C1]
    FROM ( SELECT 
        COUNT(1) AS [A1]
        FROM [dbo].[fn_GetDocumentsForContact](@ctcIDnumber) AS [Extent1]
        WHERE [Extent1].[Type] = @p__linq__0
    )  AS [GroupBy1]
predicate = predicate.And(x=>x.Type == 2);
predicate = predicate.And(x=>x.Type == doctype);