jos*_*ers 1 sql t-sql sql-server
我在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)
Run Code Online (Sandbox Code Playgroud)
这个查询运行时间太长,我知道问题是UDF - (dbo.fncIsAllPointsDelivered(J.JobID)= 1) - .
UDF的SQL在这里:
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
Run Code Online (Sandbox Code Playgroud)
除非作业中有大量的负载细节,否则所有这些都会非常快速地运行.我试图想办法让UDF更快或摆脱UDF的需要,但我不知所措.我希望你们中的一些SQL大师能够帮助我.
SELECT *
FROM tblJobs j
INNER JOIN
tblCustomers c
ON c.CustomerID = J.CustomerID
INNER JOIN
tblJobTypes jt
ON jt.JobTypeID = J.JobTypeID
INNER JOIN
tblDepartments d
ON d.DepartmentID = J.DepartmentId
WHERE J.Closed = 0
AND J.Invoiced = 0
AND J.Active = 1
AND J.DepartmentId <> 2
AND J.JobID IN
(
SELECT JobID
FROM tblLoadDetails
)
AND J.JobID NOT IN
(
SELECT JobID
FROM tblLoadDetails
WHERE Delivered <> 1
)
Run Code Online (Sandbox Code Playgroud)
在这些字段上创建复合索引:
tblJobs (Closed, Invoiced, Active) INCLUDE (DepartmentID)
Run Code Online (Sandbox Code Playgroud)
如果您tblLoadDetails.Delivered是位字段,则创建以下索引:
tblLoadDetail (JobID, Delivered)
Run Code Online (Sandbox Code Playgroud)
并重写最后一个条件:
SELECT *
FROM tblJobs j
INNER JOIN
tblCustomers c
ON c.CustomerID = J.CustomerID
INNER JOIN
tblJobTypes jt
ON jt.JobTypeID = J.JobTypeID
INNER JOIN
tblDepartments d
ON d.DepartmentID = J.DepartmentId
WHERE J.Closed = 0
AND J.Invoiced = 0
AND J.Active = 1
AND J.DepartmentId <> 2
AND
(
SELECT TOP 1 Delivered
FROM tblLoadDetails ld
WHERE ld.JobID = j.JobID
ORDER BY
Delivered
) = 1
Run Code Online (Sandbox Code Playgroud)