2015-04-06 97 views
0

我使用它SSRS报告使用的数据集。当它执行的数据较少时,结果以秒为单位显示,但当它运行在大量数据上时,我的查询中提到的时间大约低于两分钟。请提出一个方法天气有问题在查询或不。SQL查询到一次在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') 

回答

1

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

什么where子句中的“(ISNULL(0,0)= 0或..”?是不是总是如此,因此没有意义?

为什么在一个NULL聚结日期条件?不确定索引是否会与这种参数一起使用,日期格式也不好,请使用YYYYMMDD以确保它始终正确解释。

至少所有的“inner join + select *”看起来都不好。确切列,而不是*,可能会给SQL Server的可能性,以避免键查找。

具有在查询许多表可能会导致优化Ë以免超时或以其他方式得到一个非常糟糕的计划,因为统计数据很可能会变得非常复杂。

看什么统计数据I/O的回报,这应该给你一个想法是哪里的问题是+实际的规划和计划缓存可能会有所帮助。通过统计I/O和实际计划(不只是它的图片),指出问题出在哪里会更容易。

编辑:另外选择不同的+ XML路径可以是造成问题,但没有更多的信息无法确定。

+0

当然,你应该检查你在那里的所有选择(或最好试图摆脱其中的一部分)的索引使用 – 2015-04-06 07:34:14

+0

而且你也在SQL中重复了很多相同/相似的提取,你可能应该改为连接 – 2015-04-06 07:37:07