2015-04-06 7 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

Вы хотите получить ответ «да» или «нет»? Да, я думаю, что есть проблема с вашим запросом.

Какие «(ISNULL (0,0) = 0 ИЛИ ..» в пункте где? Разве это не всегда верно, и поэтому бессмысленно?

Почему критерии даты в единое целое со значением NULL «Не уверен, что индексы будут использоваться с таким параметром. Этот формат даты также плох, используйте YYYYMMDD, чтобы быть уверенным, что он всегда правильно интерпретируется.

По крайней мере, все« внутреннее соединение + выбор »выглядит плохо. точные столбцы вместо *, это может дать SQL Server возможность избежать ключевых поисков.

Наличие такого множества таблиц в запросе может вызвать оптимизатор e ither, чтобы тайм-аут или просто иначе, чтобы получить действительно плохой план, потому что статистика, скорее всего, будет очень сложной.

Посмотрите, какая статистика ввода-вывода возвращается, что должно дать вам представление о том, где проблема + реальный план и план кеша могут помочь. Со статистическим вводом-выводом и фактическим планом (а не только с его изображением) было бы легче указать, где проблема.

Редактировать: Также выбор отдельных XML-путей может вызывать проблемы, но не может быть уверен без дополнительной информации.

+0

И, конечно же, вы должны проверить использование индексов всех выбранных вами вариантов (или, желательно, попытаться избавиться от некоторых из них). –

+0

И вы также повторяете много одинаковых/похожих изъятий в SQL, которые вы, вероятно, вместо этого вместо –

Смежные вопросы