SQL 自定义函数查询很慢优化问题

clipboard.png
数据库是SQL SERVER 2008

这个系统灵活性太高了,查一些很简单的字段都要关联七八张表。所以就定义了一些函数。
由于查询数据库用到了自定义函数比较多,导致查询很少的数据要很久。要怎么优化,有没有什么好的办法。
除了函数有其他的办法吗。

例如:

SELECT
    Bugid,
    (SELECT dbo.GetCustom3(BugID,565)) AS FunModel,
    (SELECT dbo.GetCustom4(BugID,565)) AS Severity,
    (SELECT dbo.GetProjectName(dbo.getSub(Bugid,565))) AS ProjectName,
    BugTitle,
    CreatedByPerson,
    --判断当前责任人要判定当前bug的状态,如果是 (923:已修复,验证中)则为上一条记录的责任人

--     (SELECT dbo.FX_getBugOwner(BugID,565))AS CurrentOwner,
    ProgressStatusID,
    DateCreated 
    FROM
        Bug 
    WHERE
        ProjectID = 565

下面是FX_getBugOwner自定义的函数。

ALTER FUNCTION [dbo].[FX_getBugOwner]
( @BugId AS int ,
  @projectID AS int 
)
RETURNS NVARCHAR(500) 
AS
BEGIN
   declare @result NVARCHAR(500) 
   declare @ProgressStatusID INT 
     SET @result=''
     SET @ProgressStatusID = 0
    -- routine body goes here, e.g.
    -- SELECT 'Navicat for SQL Server'
    
    --查询 当前任务状态,如果 ProgressStatusID等于923 则为审核中,负责人向上推一级
    
    SELECT @ProgressStatusID=ProgressStatusID FROM BugTracking WHERE BugID = @BugId AND SequenceNo = (SELECT MAX(SequenceNo) FROM BugTracking WHERE BugID = @BugId AND ProjectID = @ProjectID) 
    IF @ProgressStatusID=923 BEGIN
    --返回负责人
    SELECT @result=PersonAssigned FROM BugTracking WHERE BugID = @BugId AND SequenceNo = ((SELECT MAX(SequenceNo) FROM BugTracking WHERE BugID = @BugId AND ProjectID = @ProjectID)-1)
    END
    ELSE BEGIN
        SELECT @result=PersonAssigned FROM BugTracking WHERE BugID = @BugId AND SequenceNo = (SELECT MAX(SequenceNo) FROM BugTracking WHERE BugID = @BugId AND ProjectID = @ProjectID)
    
    END
    RETURN @result
END

屏蔽掉掉代码后查询结果大约是0.5s,放开以后大约3.1s

阅读 3.2k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进