简体   繁体   English

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

[英]SQL query taking time in SSRS report

I am using SSRS report and use dataset in it. 我正在使用SSRS报告,并在其中使用数据集。 When it execute in less data, result shows in seconds, but when it runs on huge data it takes two minute approximately below mentioned in my query. 当它以较少的数据执行时,结果以秒为单位显示,但是当它以巨大的数据运行时,大约要花两分钟,这在我的查询中大约比下面提到的少。 Please suggest a way weather there is problem in query or not. 请提出一种查询是否存在问题的方式。

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')

Do you just want a yes or no answer? 您是否只想回答是或否? Yes, I think there is a problem with your query. 是的,我认为您的查询有问题。

What are the "(ISNULL(0,0) = 0 OR .." in the where clause? Isn't that always true and therefore pointless? where子句中的“((ISNULL(0,0)= 0 OR ..”)是什么?难道不总是如此,因此毫无意义吗?

Why are the date criteria in a coalesce with NULL? 为什么日期条件与NULL合并? Not sure if indexes will be used with that kind of parameter. 不知道索引是否将与该类型的参数一起使用。 That date format is also bad, use YYYYMMDD to be sure it's always interpreted correctly. 该日期格式也很糟糕,请使用YYYYMMDD来确保始终正确地解释它。

At least all the "inner join + select *" looks bad. 至少所有“内部联接+选择*”看起来都很糟糕。 Use exact columns instead of *, it might give SQL Server possibility to avoid key lookups. 使用确切的列而不是*,它可能使SQL Server避免进行键查找。

Having that many tables in a query can cause the optimizer either to time out or just otherwise to get a really bad plan because the statistics are most likely going to be really complex. 在查询中拥有很多表可能会导致优化器超时或以其他方式获得错误的计划,因为统计信息很可能会变得非常复杂。

Look at what statistics I/O returns, that should give you an idea where the problem is + actual plan and plan cache might help. 查看I / O返回的统计信息,这应该使您知道问题出在哪里+实际计划,计划缓存可能会有所帮助。 With statistics I/O and actual plan (not just a picture of it) it would be easier to point where the problem is. 使用统计I / O和实际计划(而不仅仅是它的图片),可以更轻松地指出问题所在。

Edit: Also the select distinct + XML path can be causing problems, but can't be sure without more info. 编辑:同样,选择独特的+ XML路径也可能会导致问题,但是如果没有更多信息就无法确定。

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

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