C# 使用日期参数时Linq to SQL慢速存储过程

C# 使用日期参数时Linq to SQL慢速存储过程,c#,asp.net,sql-server,linq,stored-procedures,C#,Asp.net,Sql Server,Linq,Stored Procedures,在这方面的任何帮助都将不胜感激 我正在使用LINQtoSQL调用SQLServer中的存储过程。存储过程有3个参数;int,datetime,datetime 当我在ASP.NET MVC应用程序中从Linq调用SQL时,速度非常慢,可能会超时。但是,当我在SQLServerManagementStudio中调用存储过程时,它会在大约一秒钟内返回结果 我删除了作为参数的日期,并将sames日期硬编码到过程中,然后从我的web应用程序中调用它,然后它就可以正常运行了。把那些日期参数放回去,它就挂了

在这方面的任何帮助都将不胜感激

我正在使用LINQtoSQL调用SQLServer中的存储过程。存储过程有3个参数;int,datetime,datetime

当我在ASP.NET MVC应用程序中从Linq调用SQL时,速度非常慢,可能会超时。但是,当我在SQLServerManagementStudio中调用存储过程时,它会在大约一秒钟内返回结果

我删除了作为参数的日期,并将sames日期硬编码到过程中,然后从我的web应用程序中调用它,然后它就可以正常运行了。把那些日期参数放回去,它就挂了。有什么想法吗?日期格式等问题

这里没有什么特别的事

C#

public List GetSales(int-StoreId、DateTime-dateFrom、DateTime-dateTo)
{
使用(AppDataContext ctx=new AppDataContext())
{
var result=ctx.sp_GetSales(id,dateFrom,dateTo).ToList();
foreach(结果中的var项目)
{
//处理返回的数据
}
}
}

所有日期都是类型
DateTime
。我不认为这是存储过程,正如我所说,当我硬编码日期时,它工作得非常好。也许与使用存储过程将Linq映射到SQL有关?谢谢你的帮助

这是一个很长的机会,但我想我以前在约会中见过这种情况。我认为我所看到的问题与此有关,但它从来没有完全加起来,因为SQL Server似乎设法生成了一个比提供给查询的任何参数都要差几个数量级的查询

但是,如果我还记得在存储过程中正确地执行了以下操作,那么这是很久以前的事了,解决了这个问题:

CREATE PROCEDURE Test
    @Param1 DATETIME
AS
BEGIN
    DECLARE @Param1_Copy DATETIME = @Param1

    -- Use @Param1_Copy instead of @Param1
END
出于某种原因,以这种方式“复制”参数似乎可以防止出现问题。我记不起来了,可能会将
与重新编译一起使用,或者使用其他参数嗅探解决方案


如果这不能解决您的问题,那么我建议使用SQL Server Profiler捕获应用程序执行的确切SQL语句的SQL跟踪,然后尝试在SQLServerManagementStudio中运行这条确切的语句,看看这是否会再现糟糕的性能—即使是过程执行方式中非常细微的差异也会导致差异。我还相信SQLServerManagementStudio使用了与.Net不同的(即
QUOTED_IDENTIFIER
等)。这些设置之一可能是您无法在SQL Server Management Studio中复制此设置的原因。

能否发布表结构(包括该表上的任何索引)您可能想考虑运行SQL剖析器,看看LINQ是如何生成执行存储过程的SQL查询的。它可能会提供一些帮助。嗨,马克,我现在没有访问源代码的权限,但我会在早上(悉尼时间)更新帖子。如果没有访问相关的源代码,我真的无法告诉你问题可能是什么。我真的很想看看sp_GetSales
方法。贾斯汀,这似乎成功了!只需复制日期参数并在整个过程中使用它们,它的运行速度与我在ManagementStudio中运行时的速度一样快。我必须仔细阅读它才能理解它背后的科学。非常感谢@迈克尔:如果你能弄明白,请告诉我!
CREATE PROCEDURE Test
    @Param1 DATETIME
AS
BEGIN
    DECLARE @Param1_Copy DATETIME = @Param1

    -- Use @Param1_Copy instead of @Param1
END