繁体   English   中英

SQL查询在SSRS报告中花费的时间

[英]SQL query taking time in SSRS report

我正在使用SSRS报告,并在其中使用数据集。 当它以较少的数据执行时,结果以秒为单位显示,但是当它以巨大的数据运行时,大约要花两分钟,这在我的查询中大约比下面提到的少。 请提出一种查询是否存在问题的方式。

SELECT TOP 1000 
  VarianceRequestID,
  vr.Created,
  j.FullName AS Job,  
STUFF
(
    (
        SELECT DISTINCT ',' + v.Name
        FROM (SELECT * FROM VarianceRequestDetail WHERE (TenantID = (SELECT TenantID FROM Tenant WHERE (SQLUserID = SUSER_ID('ReportUser_1_37'))))) vrd 
        INNER JOIN (SELECT * FROM Vendor WHERE (TenantID = (SELECT TenantID FROM Tenant WHERE (SQLUserID = SUSER_ID('ReportUser_1_37'))))) v  ON v.VendorID = vrd.VendorID
        WHERE vrd.VarianceRequestID = vr.VarianceRequestID
        FOR XML PATH(''), type
    ).value('.', 'varchar(max)'), 1, 1, ''
) AS Vendors
  ,vReas.Name AS VarianceReasonText
  ,VarianceDescription
  , ExecutiveSummary
  ,e.Name AS CreatedBy
  ,ApprovalCode AS Approved
  ,IsProcessed AS Authorized
  ,ApprovedVarianceTotal
  ,CASE CostAllocationType WHEN 0 THEN 'Unknown' WHEN 1 THEN 'True Variance' WHEN  2 THEN 'Unused Budget' WHEN 3 THEN 'Budget Transfer' WHEN 4 THEN 'Budget Cancellation' WHEN  5 THEN 'Unallocated Budget' END AS CostType

    ,(SELECT TOP 1 e.Name FROM (SELECT * FROM LiveWorkflowItem WHERE (TenantID = (SELECT TenantID FROM Tenant WHERE (SQLUserID = SUSER_ID('ReportUser_1_37'))))) li  
        INNER JOIN (SELECT * FROM LiveWorkflow WHERE (TenantID = (SELECT TenantID FROM Tenant WHERE (SQLUserID = SUSER_ID('ReportUser_1_37'))))) l ON l.LiveWorkflowID = li.LiveWorkflowID 
        INNER JOIN (SELECT * FROM Employee WHERE (TenantID = (SELECT TenantID FROM Tenant WHERE (SQLUserID = SUSER_ID('ReportUser_1_37'))))) e ON e.EmployeeID = li.EmployeeID AND li.ItemStatus in (2,6)
        WHERE l.WorkbookID = vr.WorkbookID ORDER BY li.Code DESC) AS ApprovedBy
    ,(SELECT TOP 1 e.Name FROM (SELECT * FROM LiveWorkflow WHERE (TenantID = (SELECT TenantID FROM Tenant WHERE (SQLUserID = SUSER_ID('ReportUser_1_37'))))) l 
        INNER JOIN (SELECT * FROM Employee WHERE (TenantID = (SELECT TenantID FROM Tenant WHERE (SQLUserID = SUSER_ID('ReportUser_1_37'))))) e ON e.EmployeeID = l.AuthorizedBy 
        WHERE l.WorkbookID = vr.WorkbookID) AS AuthorizedBy
      FROM (SELECT * FROM VarianceRequest 
      WHERE (TenantID = (SELECT TenantID FROM Tenant WHERE (SQLUserID = SUSER_ID('ReportUser_1_37'))))) vr 
      LEFT OUTER JOIN (SELECT * FROM Employee WHERE (TenantID = (SELECT TenantID FROM Tenant WHERE (SQLUserID = SUSER_ID('ReportUser_1_37'))))) e  ON e.EmployeeID = vr.EmployeeID

      left outer join (SELECT * FROM VarianceReason WHERE (TenantID = (SELECT TenantID FROM Tenant WHERE (SQLUserID = SUSER_ID('ReportUser_1_37'))))) vReas ON vReas.VarianceReasonID = vr.VarianceReasonID
      LEFT OUTER JOIN (SELECT * FROM Job WHERE (TenantID = (SELECT TenantID FROM Tenant WHERE (SQLUserID = SUSER_ID('ReportUser_1_37'))))) j  ON j.JobID = vr.JobID
      WHERE VarianceType = 0
        AND (ISNULL(0,0) = 0 OR (ISNULL(0,0) = j.CommunityID))
        AND (ISNULL(0,0) = 0 OR (ISNULL(0,0) = j.JobID))
        AND (ISNULL(NULL,0) = 0 OR (ISNULL(NULL,0) = vr.EmployeeID))
        AND (ISNULL(NULL,0) = 0 OR EXISTS(SELECT VendorID FROM (SELECT * FROM VarianceRequestDetail WHERE (TenantID = (SELECT TenantID FROM Tenant WHERE (SQLUserID = SUSER_ID('ReportUser_1_37'))))) AS ve WHERE VarianceRequestID = vr.VarianceRequestID AND  (ISNULL(NULL,0) = VendorID)))AND (ISNULL(NULL,0) = 0 OR (ISNULL(NULL,0) = vr.VarianceReasonID))
        AND vr.Created >= COALESCE(NULL, '1/1/1900') AND vr.Created  <= COALESCE(NULL, '1/1/3000')

您是否只想回答是或否? 是的,我认为您的查询有问题。

where子句中的“((ISNULL(0,0)= 0 OR ..”)是什么?难道不总是如此,因此毫无意义吗?

为什么日期条件与NULL合并? 不知道索引是否将与该类型的参数一起使用。 该日期格式也很糟糕,请使用YYYYMMDD来确保始终正确地解释它。

至少所有“内部联接+选择*”看起来都很糟糕。 使用确切的列而不是*,它可能使SQL Server避免进行键查找。

在查询中拥有很多表可能会导致优化器超时或以其他方式获得错误的计划,因为统计信息很可能会变得非常复杂。

查看I / O返回的统计信息,这应该使您知道问题出在哪里+实际计划,计划缓存可能会有所帮助。 使用统计I / O和实际计划(而不仅仅是它的图片),可以更轻松地指出问题所在。

编辑:同样,选择独特的+ XML路径也可能会导致问题,但是如果没有更多信息就无法确定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM