Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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_Sql Server 2008 - Fatal编程技术网

Sql 如何优化此查询(填充部分)

Sql 如何优化此查询(填充部分),sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,如何优化以下查询: SELECT MONTH('1' + LEFT(Datename(month,visitDate),3) +'00') AS MONTH_NUMBER , VisitMonth = LEFT(Datename(month,visitDate),3) ,TotalVisits = Count(v.VisitID) ,TotalVisits_with_StandardReport = Count(CASE WHEN v.ReportStandard NOT IN (0,

如何优化以下查询:

SELECT 

MONTH('1' + LEFT(Datename(month,visitDate),3) +'00') AS MONTH_NUMBER ,

VisitMonth = LEFT(Datename(month,visitDate),3)

,TotalVisits = Count(v.VisitID)

,TotalVisits_with_StandardReport = Count(CASE WHEN v.ReportStandard NOT IN (0,9) THEN   v.ReportStandard END)

,TotalVisits_with_FeedbackReport = Count(CASE WHEN v.DiscrepancyType IN (2,5) THEN v.DiscrepancyStatus END)

,Perc = 
CAST(100 - ISNULL(CAST((Count(CASE WHEN v.DiscrepancyType IN (2,5) THEN v.DiscrepancyType END) * 1.0 / Count(CASE WHEN v.ReportStandard NOT IN (0,9) THEN v.ReportStandard END)) * 100 AS FLOAT),0) AS NUMERIC(10,2))  


,VisitAssignmentID_with_FeedbackRpt = STUFF (( SELECT  ', ' + CAST(v2.AssignmentID  AS VARCHAR) from Visits v2
INNER JOIN 
Assignments a2 ON a2.AssignmentID = v2.AssignmentID
WHERE 
DATENAME(MONTH,v.VisitDate) = DATENAME(MONTH,v2.VisitDate) 
AND a2.ClientID IN (22,33) AND v2.DiscrepancyType IN (2,5)  
GROUP BY V2.AssignmentID 
FOR xml path('')), 1, 2, '')
FROM Visits v
INNER JOIN Assignments a ON a.AssignmentID = v.AssignmentID  
WHERE a.ClientID IN (22,33)
AND v.VisitDate BETWEEN '01/01/2013' AND '31/12/2013'

GROUP BY DATENAME(MONTH,v.VisitDate) 

ORDER BY MONTH_NUMBER 
结果

我试图简化和优化的第二个查询(但查询结果不同)

我试图优化查询,并试图简单地处理内部查询,但我没有得到我想要的结果。虽然它减少了总的执行时间,但结果不一样

  WITH ALL_CTE(MONTH_NUMBER,VisitMonth,VisitID,AssignmentID,ReportStandard,DiscrepancyStatus,DiscrepancyType,VisitA     ssignmentID_with_FeedbackRpt)
 AS
 -- Define the CTE query.

(
SELECT 
    MONTH('1' + LEFT(Datename(month,visitDate),3) +'00') AS MONTH_NUMBER ,
    VisitMonth = LEFT(Datename(month,visitDate),3)
   ,v.VisitID, v.AssignmentID ,  v.ReportStandard , v.DiscrepancyStatus, v.DiscrepancyType 

     ,VisitAssignmentID_with_FeedbackRpt = 
     STUFF (( SELECT  ', ' + CAST((CASE WHEN DiscrepancyType IN (2,5) THEN v.AssignmentID END)  AS VARCHAR)                 
            FOR xml path('')), 1, 2, '')

FROM Visits v
INNER JOIN Assignments a ON a.AssignmentID = v.AssignmentID
WHERE a.ClientID IN (22,33)
AND v.VisitDate BETWEEN '01/01/2013' AND '31/12/2013'
group by v.AssignmentID,visitDate,VisitID,ReportStandard,DiscrepancyStatus,DiscrepancyType

 )
-- Define the outer query referencing the CTE name.

SELECT 
MONTH_NUMBER
,VisitMonth  
,COUNT(VisitID) 
,TotalVisits_with_StandardReport = COUNT(CASE WHEN ReportStandard NOT IN (0,9) THEN  ReportStandard END)
,TotalVisits_with_FeedbackReport = COUNT(CASE WHEN DiscrepancyType IN (2,5) THEN DiscrepancyStatus END)

,isnull(VisitAssignmentID_with_FeedbackRpt,0)   
FROM ALL_CTE

GROUP BY MONTH_NUMBER,VisitMonth,VisitAssignmentID_with_FeedbackRpt

客户统计数据


我认为您在这里可以做的唯一真正的优化是确保在
AssignmentID
上有一个索引,以便内部连接更快。所有其他部分都是无关紧要的,它们只是在内存中处理的转换。

请发布执行计划。我已经添加了客户端统计数据,您希望我也添加执行计划吗?是的,请。执行计划将告诉我们问题在哪里,您可以将其作为图片或xml进行处理