2017-02-08 4 views
1

У меня есть отчет с невероятно медленным набором данных. К сожалению, мы не можем оптимизировать запрос дальше в данный момент времени. Однако, независимо от того, какие тайм-ауты я изменяю, отчет по-прежнему не работает через 10 минут. Я пробовал тайм-аут набора данных отчета, время выполнения отчета, а также удаленное выполнение на сервере sql. Кажется, что никто не работал.Отчет о SSRS откладывается через 10 минут

немного рытье дал следующий ресурс, который я также пытался без толка:

https://blogs.msdn.microsoft.com/selvar/2010/07/12/report-builder-2-0-3-0-errors-out-with-the-operation-has-timed-out-when-previewing-a-report-saved-in-report-server-takes-more-than-10-minutes/

https://msdn.microsoft.com/en-us/library/ms155782.aspx

Почему мой отчет будет синхронизации через 10 минут?

Сценарий:

DECLARE @SessionDateFrom DATETIME = '2016/11/01' 
DECLARE @SessionDateTo DATETIME = '2016/12/01' 
DECLARE @SiteNo INT = 1 

SELECT DISTINCT [CS].[No] AS SiteNo 
    ,[CS].[Name] AS SiteName 
    ,TSE.[MediaNo] AS Media 
    ,TSE.[MediaIndex] 
    ,Sum(TSE.[Qty]) AS SalesQty 
    ,Sum(TSE.[Value]) AS SalesValue 
    ,TSE.[MediaGroup] 
    ,TSE.[MediaName] 
    ,TSE.SortOrder 
    ,TSE.[ReasonNo] 
    ,[R].[Name] AS ReasonName 
    ,Convert(BIT, CASE 
      WHEN TSE.[MediaNo] NOT IN (
        1001 
        ,1002 
        ,1003 
        ,1004 
        ,3002 
        ,3004 
        ,7002 
        ,7004 
        ,7006 
        ) 
       THEN 1 
      ELSE 0 
      END) AS Clickable 
FROM TSE 
LEFT JOIN CS ON CS.No = TSE.SiteNo 
LEFT JOIN R ON (R.No = TSE.ReasonNo) 
WHERE EXISTS (
      SELECT Descendant 
      FROM DescendantSites 
      WHERE Parent = @SiteNo 
       AND Descendant = TSE.SiteNo 
      ) 
     AND (
      Qty <> 0 
      OR Value <> 0 
      ) 
     AND MediaNo <> 0 
     AND ExcludeFromReport <> 1 
     --AND (
     -- MediaNo IN (@MediaNo) 
     -- OR MediaNo IS NULL 
     -- ) 
     AND TermNo = 0 
     AND SessionDate BETWEEN @SessionDateFrom 
      AND @SessionDateTo 
GROUP BY [CS].[No] 
    ,[CS].[Name] 
    ,TSE.[MediaNo] 
    ,TSE.[MediaIndex] 
    ,TSE.[MediaGroup] 
    ,TSE.[MediaName] 
    ,TSE.SortOrder 
    ,TSE.[ReasonNo] 
    ,[Reason].[Name] 
ORDER BY TSE.[MediaGroup] 
    ,TSE.[SortOrder] 
    ,TSE.[MediaIndex] 
OPTION (OPTIMIZE FOR UNKNOWN) 

Будет нужно фильтровать для средств массовой информации, но если он может вернуть все в разумные сроки, то должно быть в порядке (пожалуйста, поправьте меня, если эта логика не так Im совершенно новой для SQL.) ,

+1

«мы не можем оптимизировать запрос дополнительно в данный момент времени» Как-то я сомневаюсь, что это ... – iamdave

+0

Вы призыв отчет внутри другого веб-приложения или с помощью диспетчера ssrs? –

+0

@iamdave Вы правы, но в этот момент времени для изменения реальной схемы db потребуется какое-то реальное воздействие. Мы не можем сэкономить время для этого, поэтому повышение тайм-аута является допустимым обходным решением. – NinjaArekku

ответ

1

Мне удалось переписать запрос на следующее. Это имеет массовый прирост в скорости (от ~ 40 секунд до ~ 2)

SELECT [CfgSites].[No] AS SiteNo 
,[CfgSites].[Name] AS SiteName 
,[Media] AS Media 
,[MediaIndex] 
,Sum([Qty]) AS SalesQty 
,Sum([Value]) AS SalesValue 
,[MediaGroup] 
,[MediaName] 
,TSE.SortOrder 
,TSE.[ReasonNo] 
,[Reason].[Name] AS ReasonName 
,Convert(BIT, CASE 
     WHEN TSE.[Media] NOT IN (
       1001 
       ,1002 
       ,1003 
       ,1004 
       ,3002 
       ,3004 
       ,7002 
       ,7004 
       ,7006 
       ) 
      THEN 1 
     ELSE 0 
     END) AS Clickable 
FROM (
SELECT SessionDate 
    ,TransactionSales.SiteNo 
    ,Media 
    ,MediaIndex 
    ,Qty 
    ,Value 
    ,MediaGroup 
    ,FullName as MediaName 
    ,SortOrder 
    ,ReasonNo 
FROM TransactionSales 
LEFT JOIN MediaExtended ON TransactionSales.Media = MediaExtended.MediaNo 
AND TransactionSales.MediaIndex = MediaExtended.[Index] 
INNER JOIN [Sessions] ON TransactionSales.[SiteNo] = [Sessions].[SiteNo] AND TransactionSales.[TermNo] = [Sessions].[TermNo] AND TransactionSales.SessionNo = [Sessions].[SessionNo] AND 
        [Sessions].[Type] = 0 
WHERE TransactionSales.SiteNo IN (@SiteNo) 
    AND (
     Qty &lt;&gt; 0 
     OR Value &lt;&gt; 0 
     ) 
    AND Media &lt;&gt; 0 
    AND ExcludeFromReport &lt;&gt; 1 
    AND (
     MediaNo IN (@MediaNo) 
     OR MediaNo IS NULL 
     ) 
    AND TransactionSales.TermNo = 0 
    AND SessionDate BETWEEN @SessionDateFrom 
     AND @SessionDateTo 
) TSE 
LEFT JOIN CfgSites ON CfgSites.No = TSE.SiteNo 
LEFT JOIN [Reason] ON ([Reason].[ReasonNo] = TSE.[ReasonNo]) 
GROUP BY [CfgSites].[No] 
,[CfgSites].[Name] 
,[Media] 
,[MediaIndex] 
,[MediaGroup] 
,[MediaName] 
,TSE.SortOrder 
,TSE.[ReasonNo] 
,[Reason].[Name] 
UNION ALL 

SELECT CfgSites.No 
,CfgSites.Name 
,MediaExtended.MediaNo 
,0 
,sum(transactionsales.qty) AS Qty 
,SUM(transactionsales.value) AS Value 
,MediaGroup 
,ISNULL([MediaExtended].[FullName], 'Unknown Media') AS MediaName 
,MediaExtended.SortOrder 
,null 
,null 
,null 
FROM MediaExtended 
INNER JOIN transactionsales ON transactionsales.media = MediaExtended.TotalForMedia 
INNER JOIN [Sessions] ON [TransactionSales].[SiteNo] = [Sessions].[SiteNo] 
AND [TransactionSales].[TermNo] = [Sessions].[TermNo] 
AND [TransactionSales].[SessionNo] = [Sessions].[SessionNo] 
AND [Sessions].[Type] = 0 
LEFT JOIN CfgSites ON TransactionSales.SiteNo = CfgSites.No 
WHERE [MediaExtended].[TotalForMedia] &gt; 0 AND TransactionSales.SiteNo IN (@SiteNo) 
    AND (
     Qty <> 0 
     OR Value <> 0 
     ) 
    AND Media <> 0 
    AND ExcludeFromReport <> 1 
    AND (
     MediaNo IN (@MediaNo) 
     OR MediaNo IS NULL 
     ) 
    AND TransactionSales.TermNo = 0 
    AND SessionDate BETWEEN @SessionDateFrom 
     AND @SessionDateTo 

     Group By CfgSites.No 
,CfgSites.Name 
,MediaNo 
,MediaGroup 
,FullName 
,MediaExtended.SortOrder 

ORDER BY [MediaGroup] 
,TSE.[SortOrder] 
,[MediaIndex] 
OPTION (OPTIMIZE FOR UNKNOWN) 
+0

Вы также можете изменить право на присоединение? EXISTS ( ВЫБОР Потомок ОТ DescendantSites ГДЕ Родитель = @SiteNo И Потомок = TSE.SiteNo ) –

+0

Это поздно, но не могли бы вы объяснить, что вы сделали и почему, чтобы сделать запрос намного быстрее? –

+0

@ DanielKotin Я обновил свой сценарий, чтобы отразить изменения. Должно быть, забыл это сделать. Извиняюсь. – NinjaArekku

0

Это не прямой ответ, но обходной путь. Вы можете включить кеширование в параметрах обработки. А затем запланировать подписку, чтобы обновить кеш. Тайм-аут для запланированных отчетов намного более снисходителен. Затем, когда вы переходите на просмотр отчета, вам даже не придется ждать 10 минут, он просто загрузится из кеша.

0

решить эту проблему, попробуйте уменьшить ненужные столбцы из отчета

+0

В настоящее время отчет использует только те столбцы, которые ему нужны. – NinjaArekku

0

«... У нас есть зритель приложение отчет, который подключается к серверу и запускает отчеты оттуда»

Так у вас есть несколько вещи.

1. SSRS API Connection Timeout (http) 
2. SSRS Database connection timeout (Dataset) 
3. SSRS Report Processing Timeout (Report) 
4. Your Report Viewer application timeout (http) 

Вы указали, что увеличили значение тайм-аута для всех, кроме # 4. Может ли ваше приложение выходить из строя?

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