[英]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.