Sql server 调用UDF本身时进行索引查找,在sp中包装UDF时进行索引扫描

Sql server 调用UDF本身时进行索引查找,在sp中包装UDF时进行索引扫描,sql-server,tsql,user-defined-functions,Sql Server,Tsql,User Defined Functions,我有一个UDF,它执行大多数连接,当我运行它时,它读取大约100-150页(来自sql profiler),但如果我将此UDF包装到sp中,sp将读取大约243287页 此外,UDF本身执行索引查找,但sp对其中一个搜索列执行索引扫描 有人能提供建议吗?根据您对(custid=@param1或@param1为空)与(custid=@param1)的评论,我认为Gail Shaw在上的博客文章将提供一些关于您在这里看到的内容的见解。基本上,我认为您正在为@param1为null案例缓存一个执行计划

我有一个UDF,它执行大多数连接,当我运行它时,它读取大约100-150页(来自sql profiler),但如果我将此UDF包装到sp中,sp将读取大约243287页

此外,UDF本身执行索引查找,但sp对其中一个搜索列执行索引扫描


有人能提供建议吗?

根据您对
(custid=@param1或@param1为空)
(custid=@param1)
的评论,我认为Gail Shaw在上的博客文章将提供一些关于您在这里看到的内容的见解。基本上,我认为您正在为
@param1为null
案例缓存一个执行计划,然后根据您对
(custid=@param1或@param1为null)
(custid=@param1)
的评论传入一个真正的
@param1
案例时,执行计划会很差,我认为Gail Shaw在上的博客帖子会让你对这里看到的东西有所了解。基本上,我认为您正在为
@param1为null
的情况缓存一个执行计划,当您传入一个真正的
@param1

时,该执行计划的性能会很差。您需要更具体地说明您的要求。好的..让我再试一次。。我有一个自定义项(比如pullingCustomerUDF),它包含3个参数。如果我用select语句调用UDF(例如,从pullingCustomerUDF('param1'、'parm2'、'param3')中选择*,则读取110页(在100微秒内)就可以了。但是,如果我在存储过程中包含select语句并执行该存储过程,它将在5-7秒内读取243287页。有什么想法吗?请注意,该存储过程不包含select语句以外的任何其他代码!ok发现了问题,但我无法解释原因。我进行了如下比较:(custid=@param1或@param1为null)当我删除“is null”并变成这样时:(custid=@param1)然后,存储过程现在执行得如此之快。有人能解释一下吗?我也设置了ANSI_null,但没有LuckInesting您一定是混淆了查询优化器,对表进行了顺序读取。您需要更具体地说明您所要求的内容。好的。让我再试一次。我有UDF(比如pullingCustomerUDF)如果我用select语句调用UDF(例如,从pullingCustomerUDF('param1','parm2','param3')中选择*,它可以读取110页(100微秒以内)的数据。但是,如果我在存储过程中包含select语句并执行该存储过程,它将在5-7秒内读取243287页。有什么想法吗?请注意,该存储过程不包含select语句以外的任何其他代码!ok发现了问题,但我无法解释原因。我进行了如下比较:(custid=@param1或@param1为null)当我删除“is null”并变成这样时:(custid=@param1)那么存储过程现在执行得太快了。有人能解释一下吗?我也设置了ANSI_NULLS,但没有LuckInesting您一定是把查询优化器弄糊涂了,让它按顺序读取了表。我该如何刷新执行计划。我还尝试使用“重新编译”选项创建存储过程,但它没有修复执行计划compile无法修复此问题。SQL会为这种查询模式生成错误的计划。请参阅我的博客文章(参考上文),或更改查询,使参数不再是可选的。如何刷新执行计划。我还尝试使用重新编译选项创建存储过程,但没有修复执行计划。重新编译不会修复此问题。SQL为这种查询模式生成错误的计划。请参阅我的博客文章(参考上文),或更改查询,使参数不再是可选的。