2010-09-15 10 views
0

J'ai un rapport dans SSRS 2005, avec une requête SQL incorporée (pas de procédure stockée). Ce rapport s'exécute plus lentement dans SSRS que la requête s'exécutera dans SSMS. Je me demande comment résoudre ce problème, et s'il existe des différences dans la façon dont l'optimisation des requêtes fonctionne pour un rapport avec du code Embedded SQL par rapport à une procédure stockée.Dépannage du rapport SSRS 2005 qui s'exécute lentement

Merci!

Répondre

0

Il peut y avoir des différences entre l'exécution d'une requête à partir de SSMS et un rapport, mais l'optimisation des requêtes SQL Server ne l'est pas. En d'autres termes, SQL Server ne se soucie pas d'où provient la requête. D'abord, vous devez utiliser SQL Profiler pour capturer la requête lorsqu'elle est exécutée à partir des deux sources. Vous pouvez voir si la différence de performance réelle est due à l'heure sur le serveur SQL et non ailleurs. En outre, avec les résultats, vous pouvez voir si les requêtes sont identiques. SSRS utilise probablement une requête paramétrée et elle est en fait différente de celle que vous utilisez dans SSMS.

Y a-t-il une grande quantité de données renvoyées au rapport? Vous pouvez voir des différences de synchronisation car les résultats reviennent plus rapidement à SSMS.

0

Tant le proc stocké que la requête via ssrs seront paramétrés, donc ils devraient être mis en cache de la même manière bien qu'ils soient 2 caches différents. Si j'étais vous je commencerais par examiner le journal d'exécution sur la base de données du serveur de rapports pour trouver d'où vient votre problème.

Voici un script qui vous montrera les temps nécessaires pour obtenir les données, traiter et rendre.

select 
     reverse (substring (reverse (el . ReportPath), 1 , charindex ('/' , reverse (el . ReportPath))- 1)) as ReportName 
     , u . UserName as LastModBy 
     , coalesce (cast (el . parameters as varchar (max)), '') as [Parameters] 
     ,(select count (*) from executionlog2 tmp where tmp . reportpath = el . reportpath and tmp . username = el . username and tmp . reportaction = 'Render' and tmp . status = 'rsSuccess' group by tmp . ReportPath) as UserCount60Day 
     , el . Format 
     , el . UserName 
     , el . ReportAction 
     , el . Status 
     , el .Source 
     , el . [RowCount] 
     , el . ExecutionId 
     , el . TimeDataRetrieval/1000 as DataRetrieval 
     , el . TimeProcessing/1000 as Processing 
     , el . TimeRendering/1000 as Rendering 
     ,(el . TimeProcessing + el . TimeRendering)/1000 as ProcessAndRender 
     , el . AdditionalInfo 
     , case 
      when datediff (ss , el . TimeStart , el . TimeEnd) >= 30 
        then 1 
      else 2 
     end as DisplayInRed 

from 
     ExecutionLog2 el 
     join ReportServer . dbo . Catalog c 
      on c . Path = el . ReportPath 
     join ReportServer . dbo . Users u 
      on u . UserId = c . ModifiedByID 

where 
     el . ReportAction = 'Render' 

garder également en cours d'exécution profileur pendant que vous exécutez le rapport afin que vous puissiez voir ce qui se passe dans les coulisses.

Espérons que ça aide.