Sql 交叉适用/在条款确认和性能问题之间
我使用上面的查询来获取报告中的数据 此查询需要4到5分钟的执行时间,这太多了 这个查询发生的奇怪事情是,如果我删除交叉应用,查询将在10秒内运行,如果我在其中保留交叉应用和删除条件,那么查询也将在10到12秒内执行 我想了解为什么会有如此奇怪的行为,以及交叉应用和交叉应用之间是如何相互关联的Sql 交叉适用/在条款确认和性能问题之间,sql,sql-server,Sql,Sql Server,我使用上面的查询来获取报告中的数据 此查询需要4到5分钟的执行时间,这太多了 这个查询发生的奇怪事情是,如果我删除交叉应用,查询将在10秒内运行,如果我在其中保留交叉应用和删除条件,那么查询也将在10到12秒内执行 我想了解为什么会有如此奇怪的行为,以及交叉应用和交叉应用之间是如何相互关联的 另外,有人能帮我在where条件下使用Cross Apply和BEVER子句优化此查询吗?为什么要将@contract计算为逗号分隔的列表,然后在下一个语句中拆分它?这只是示例目的,在SP中,我将@cont
另外,有人能帮我在where条件下使用Cross Apply和BEVER子句优化此查询吗?为什么要将
@contract
计算为逗号分隔的列表,然后在下一个语句中拆分它?这只是示例目的,在SP中,我将@contract作为参数,并以逗号分隔的格式从UI传递ID。@DhavalShukla“一条建议”如果您可以用更少的代码行重现此问题,并提供一些示例数据和所需的输出,更多的人将愿意尝试,在你的问题中有了这堵代码墙,大多数用户甚至不会费心去阅读这个问题。如果我直接在查询中写日期而不是从参数中获取日期,这对我来说也很有效。。这是我编写所有内容的唯一原因。请确保对子查询中的JOIN和WHERE子句中指定的列具有索引。对于初学者,您可以尝试在TechnicanTripDetail(SERVICEORDERID,TechnicanID)上建立索引。
DECLARE @Contract AS NVARCHAR(MAX)
DECLARE @STARTDATE AS DATETIME;
DECLARE @ENDDATE AS DATETIME;
SET @STARTDATE = '2014-07-01';
SET @ENDDATE = '2014-09-21';
WITH CTE (Cntr)
AS (SELECT CONVERT(NVARCHAR(MAX), ContractId) + ','
FROM contract
WHERE clientid = 20739
FOR XML PATH(''))
SELECT @Contract = Cntr
FROM CTE;
SELECT DISTINCT so.ServiceOrderId,
C.ContractId,
so.CreateDate,
CP.AccountNumber AS 'Customer #',
CT.ContractName,
CP.NAME AS 'Customer Name',
bm.BucketName AS 'BucketCode',
LISTOFNOTES,
C.ContractName AS 'Contract',
PP.PartnerProfileId AS 'PartnerId',
PP.PartnerName AS 'PartnerName',
stm.ServiceTypename
FROM ServiceOrder AS SO
CROSS APPLY (SELECT T.BasCode + ','
FROM TECHNICIANTRIPDETAIL TTD
INNER JOIN TECHNICIAN T
ON TTD.TECHNICIANID = T.TECHNICIANID
WHERE TTD.SERVICEORDERID = SO.SERVICEORDERID
FOR XML PATH('')) TEMP(LISTOFNOTES)
INNER JOIN Contract AS C
ON C.ContractId = so.ContractId
INNER JOIN ClientProfile AS CP
ON CP.ClientId = C.ClientId
INNER JOIN BucketMaster AS bm
ON bm.BucketId = so.Status
INNER JOIN Servicetypemaster AS stm
ON stm.servicetypeid = C.servicetypeid
INNER JOIN ContractType CT
ON CT.ContractTypeId = C.ContractTypeId
LEFT OUTER JOIN PartnerProfile AS PP
ON PP.PartnerProfileId = CP.PartnerId
WHERE SO.Deleted = 'false'
AND so.CreateDate BETWEEN @STARTDATE AND @ENDDATE
AND C.ContractId IN (SELECT *
FROM dbo.Split(@CONTRACT, ','))