У меня есть этот запрос в SQL Server 2005:
SELECT J.JobID,
dbo.tblCustomers.Name AS CustomerName,
J.CustomerJobNumber,
J.JobName,
(CASE WHEN [tblCustomers].[CoreCust] = 0 THEN 'AUXILIARY' ELSE 'CORE' END) AS Department,
J.JobStatusID,
dbo.tblJobTypes.JobType
FROM dbo.tblJobs (NOLOCK) AS J
INNER JOIN dbo.tblCustomers (NOLOCK) ON J.CustomerID = dbo.tblCustomers.CustomerID
INNER JOIN dbo.tblJobTypes (NOLOCK) ON J.JobTypeID = dbo.tblJobTypes.JobTypeID
INNER JOIN dbo.tblDepartments (NOLOCK) ON J.DepartmentId = dbo.tblDepartments.DepartmentID
WHERE (J.Closed = 0)
AND (J.Invoiced = 0)
AND (J.Active = 1)
AND (dbo.fncIsAllPointsDelivered(J.JobID) = 1)
AND (J.DepartmentId <> 2)
Этот запрос выполняется слишком долго, и я знаю, что проблема в UDF - (dbo.fncIsAllPointsDelivered (J.JobID) = 1) -.
SQL для UDF находится здесь:
DECLARE @DetailCount int
DECLARE @TrackingCount int
SELECT @DetailCount = COUNT(*)
FROM [dbo].[tblLoadDetails] (NOLOCK)
WHERE JobId = @JobId
SELECT @TrackingCount = COUNT(*)
FROM [dbo].[tblLoadDetails] (NOLOCK)
WHERE JobId = @JobId AND Delivered = 1
IF(@DetailCount = @TrackingCount AND @DetailCount > 0)
RETURN 1
RETURN 0
Все это работает невероятно быстро, если в задании нет большого количества сведений о загрузке. Я пытаюсь придумать, как ускорить UDF или избавиться от необходимости UDF, но я в растерянности. Я надеюсь, что некоторые из вас гуру SQL смогут мне помочь.