数据库是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