C# 为什么exec sp_executesql比内联sql慢得多?
我在ManagementStudio中测试了这个查询,它执行得非常快(不到一秒钟)C# 为什么exec sp_executesql比内联sql慢得多?,c#,sql-server,ado.net,full-text-search,sp-executesql,C#,Sql Server,Ado.net,Full Text Search,Sp Executesql,我在ManagementStudio中测试了这个查询,它执行得非常快(不到一秒钟) declare@p_Message_0 varchar(3)='whh' 声明@p_CreatedTime_0 datetime='2015-06-01' 从包含([Message]、@p_Message_0)和[CreatedTime]的(SELECT*FROM[Logs](nolock)中选择count(1)尝试更新统计信息。第一个使用带有今天日期的变量。变量不会被嗅探,因此您将获得猜测的分布。第二个使用参数
declare@p_Message_0 varchar(3)='whh'
声明@p_CreatedTime_0 datetime='2015-06-01'
从包含([Message]、@p_Message_0)和[CreatedTime]的(SELECT*FROM[Logs](nolock)中选择count(1)尝试更新统计信息。第一个使用带有今天日期的变量。变量不会被嗅探,因此您将获得猜测的分布。第二个使用参数。这可以被嗅探
如果统计数据今天还没有更新,SQL Server会认为该日期不存在行,因此会在此基础上给出一个计划。例如,一个嵌套循环计划,估计执行TVF一次,但实际执行了多次
AKA.将datetime列索引更改为聚集索引后,现在速度非常快,非常感谢!顺便说一句,更新Statistics并不能使其快速,我不知道为什么。如何添加针对未知linq到sql查询的优化
declare @p_Message_0 varchar(3) = 'whh'
declare @p_CreatedTime_0 datetime = '2015-06-01'
SELECT count(1) FROM (SELECT * FROM [Logs](nolock) WHERE CONTAINS([Message], @p_Message_0) AND [CreatedTime]<@p_CreatedTime_0) t
SELECT t2.* FROM (SELECT t.*,ROW_NUMBER() OVER (ORDER BY Id DESC) as rownum FROM (SELECT * FROM [Logs](nolock) t WHERE CONTAINS([Message], @p_Message_0) AND [CreatedTime]<@p_CreatedTime_0) t) t2 WHERE rownum>0 AND rownum<=20
exec sp_executesql N'SELECT count(1) FROM (SELECT * FROM [Logs](nolock) WHERE CONTAINS([Message], @p_Message_0) AND [CreatedTime]<@p_CreatedTime_0) t
SELECT t2.* FROM (SELECT t.*,ROW_NUMBER() OVER (ORDER BY Id desc) as rownum FROM (SELECT * FROM [Logs](nolock) t WHERE CONTAINS([Message], @p_Message_0) AND [CreatedTime]<@p_CreatedTime_0) t) t2 WHERE rownum>0 AND rownum<=20',N'@p_Message_0 varchar(3),@p_CreatedTime_0 datetime',@p_Message_0='whh',@p_CreatedTime_0='2015-06-01'