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