Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 交叉适用/在条款确认和性能问题之间_Sql_Sql Server - Fatal编程技术网

Sql 交叉适用/在条款确认和性能问题之间

Sql 交叉适用/在条款确认和性能问题之间,sql,sql-server,Sql,Sql Server,我使用上面的查询来获取报告中的数据 此查询需要4到5分钟的执行时间,这太多了 这个查询发生的奇怪事情是,如果我删除交叉应用,查询将在10秒内运行,如果我在其中保留交叉应用和删除条件,那么查询也将在10到12秒内执行 我想了解为什么会有如此奇怪的行为,以及交叉应用和交叉应用之间是如何相互关联的 另外,有人能帮我在where条件下使用Cross Apply和BEVER子句优化此查询吗?为什么要将@contract计算为逗号分隔的列表,然后在下一个语句中拆分它?这只是示例目的,在SP中,我将@cont

我使用上面的查询来获取报告中的数据

此查询需要4到5分钟的执行时间,这太多了

这个查询发生的奇怪事情是,如果我删除交叉应用,查询将在10秒内运行,如果我在其中保留交叉应用和删除条件,那么查询也将在10到12秒内执行

我想了解为什么会有如此奇怪的行为,以及交叉应用和交叉应用之间是如何相互关联的


另外,有人能帮我在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, ','))