Reputation: 1
I am using SSRS report and use dataset in it. 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')
Upvotes: 0
Views: 51
Reputation: 12317
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?
Why are the date criteria in a coalesce with 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.
At least all the "inner join + select *" looks bad. Use exact columns instead of *, it might give SQL Server possibility to avoid key lookups.
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. With statistics I/O and actual plan (not just a picture of it) it would be easier to point where the problem is.
Edit: Also the select distinct + XML path can be causing problems, but can't be sure without more info.
Upvotes: 1