【问题标题】:SQL query taking time in SSRS reportSSRS 报告中的 SQL 查询耗时
【发布时间】:2015-04-06 07:17:42
【问题描述】:

我正在使用 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')

【问题讨论】:

    标签: sql sql-server ssrs-2008 report reporting


    【解决方案1】:

    您只是想要一个是或否的答案吗?是的,我认为您的查询有问题。

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

    为什么日期条件与 NULL 合并?不确定索引是否会与这种参数一起使用。该日期格式也很糟糕,请使用 YYYYMMDD 确保它始终被正确解释。

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

    在一个查询中有这么多表可能会导致优化器超时,或者只是获得一个非常糟糕的计划,因为统计信息很可能会非常复杂。

    查看 I/O 返回的统计信息,这应该可以让您了解问题出在哪里 + 实际计划和计划缓存可能会有所帮助。通过统计 I/O 和实际计划(不仅仅是一张图片),更容易指出问题所在。

    编辑:select distinct + XML 路径也可能会导致问题,但如果没有更多信息则无法确定。

    【讨论】:

    • 当然,您应该检查那里所有选择的索引使用情况(或者最好尝试摆脱其中一些)
    • 而且您还在 SQL 中重复了许多相同/相似的提取,您可能应该改为连接
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多