如何修复sql server 2005中的用户定义函数标量值性能问题?

kar*_*hik 2 sql t-sql sql-server performance sql-server-2005

用户定义函数用于存储过程.用户定义函数返回标量值.遵循用户定义函数中使用的逻辑

CREATE  FUNCTION [dbo].[udf_Test] ( @Code varchar(10),  )  
  RETURNS bit AS    
BEGIN 
  DECLARE @bFlag bit  

  SELECT @bFlag = COUNT(id)  
    FROM tbL1  
   WHERE Code = @Code  

  IF  @bFlag = 0   
  BEGIN  
    SELECT @bFlag = COUNT(id)  
      FROM tbl2
     WHERE LTRIM(RTRIM(Code)) = @Code  
  END  

  IF @bFlag = 0   
  BEGIN  
    SELECT @bFlag = COUNT(id)  
      FROM tbl3  
     WHERE LTRIM(RTRIM(Code)) = @Code  
  END  

  IF @bFlag = 0   
  BEGIN  
    SELECT @bFlag = COUNT(id)  
      FROM tbl4
     WHERE LTRIM(RTRIM(Code)) = @Code  
  END

RETURN @bFlag 
Run Code Online (Sandbox Code Playgroud)

这是提高上述用户定义函数性能的正确方法吗?

Mar*_*ith 8

提高性能的最佳方法是完全抛弃UDF.

我发生的一个直接的事情是

LTRIM(RTRIM(Code)) = @Code
Run Code Online (Sandbox Code Playgroud)

因为每次调用(即外部查询中返回的每一行)都可能导致最多4次表扫描.

如果在查询中使用内联CASE表达式替换UDF中的逻辑,则可能会获得更优越的执行计划.即使你不能使谓词至少变得可思议,它也会允许优化器探索不同的连接策略,例如散列连接,而不是强制重复扫描相同的表.