Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将日期参数传递给内联表值函数是SLOOWW_Sql_Sql Server 2008_Sql Server 2005_Tsql - Fatal编程技术网

Sql 将日期参数传递给内联表值函数是SLOOWW

Sql 将日期参数传递给内联表值函数是SLOOWW,sql,sql-server-2008,sql-server-2005,tsql,Sql,Sql Server 2008,Sql Server 2005,Tsql,对于表值函数的性能,我有一个奇怪的场景。基本上,我有一个内联表值函数,它以DATETIME作为参数 有点像这样(不完全是这样): 现在,我正在尝试调查一个问题,其中此查询运行时间>1分钟。结果是,如果我这样调用查询: SELECT * FROM fn_MyFunction('7/1/2011') DECLARE @startDate DATETIME = '7/1/2011' SELECT * FROM fn_MyFunction(@startDate) 它运行时间超过1分钟 但是,如果我这

对于表值函数的性能,我有一个奇怪的场景。基本上,我有一个内联表值函数,它以DATETIME作为参数

有点像这样(不完全是这样):

现在,我正在尝试调查一个问题,其中此查询运行时间>1分钟。结果是,如果我这样调用查询:

SELECT * FROM fn_MyFunction('7/1/2011')
DECLARE @startDate DATETIME = '7/1/2011'
SELECT * FROM fn_MyFunction(@startDate)
它运行时间超过1分钟

但是,如果我这样调用查询:

SELECT * FROM fn_MyFunction('7/1/2011')
DECLARE @startDate DATETIME = '7/1/2011'
SELECT * FROM fn_MyFunction(@startDate)
它在一秒钟内运行。SQL Server对这两个调用使用完全不同的解释计划

显然,我希望它一直使用第二种方法,不幸的是,我正在通过LINQ 2 SQL调用这个表值函数,它不会声明中间变量


有没有办法在内嵌表值函数中使用中间变量?我真的不想把它转换成多行表值函数。其他想法也将受到欢迎。我有点困惑。

我用大量记录尝试了这个方法,两种方法都在9秒内返回了值,没有 差异

这是一个长期的尝试,但可以测试隐式转换是否为函数提供了与显式转换相同的日期值?尝试使用“2011/1/30”这样的日期,这样您可能会遇到月/日转换问题

添加选项(重新编译)将解决您的问题。我对内置TVF有完全相同的问题,如下所示:

此语句在不到一秒钟的时间内执行:

select PropertyID from msa_GetPropertlyListWithNoMessages_TVF(DATEADD(hh, -2, Getdate())) 
此语句在5小时后从未完成执行:

declare @msg_age as Datetime
SET @msg_age = DATEADD(hh, -2, Getdate())
select PropertyID from msa_GetPropertlyListWithNoMessages_TVF(@msg_age)
将选项(重新编译)添加到第二个调用可以更正此问题


据我所知,使用datetime参数会以某种方式产生完全不同的执行计划。我很想知道原因。

在您的测试中,您是否多次尝试运行fn_MyFunction('7/1/2011')。对好几次。不是缓存问题。如果您尝试从fn_MyFunction('7/1/2011')中选择*选项(重新编译),以防自动参数化,该怎么办?如果这不起作用,
订单的统计数据可能需要更新。你能在两次调用中发布一份执行计划的副本吗?