2008-08-18 8 views
4

Tout d'abord, je comprends que c'est une idée horrible d'exécuter des rapports extrêmement longs/longs. Je suis conscient que Microsoft a une règle de base indiquant qu'un rapport SSRS ne devrait pas prendre plus de 30 secondes à exécuter. Cependant, parfois les rapports gargantuesques sont un mal préféré en raison de forces externes telles que la conformité avec les lois de l'État.Optimisation de l'exportation PDF d'énormes rapports dans Sql Reporting Services 2005

A mon lieu de travail, nous avons un asp.net (2.0) application que nous avons migré de Crystal Reports à SSRS. En raison de la grande base d'utilisateurs et des exigences complexes de l'interface utilisateur de reporting, nous avons un ensemble d'écrans qui accepte les paramètres saisis par l'utilisateur et crée des plannings à exécuter pendant la nuit. Puisque l'application prend en charge plusieurs cadres de reporting, nous n'utilisons pas les fonctionnalités de planification/snapshot de SSRS. Tous les rapports dans le système sont générés par une application de console planifiée qui prend les paramètres entrés par l'utilisateur et génère les rapports avec les solutions de génération de rapports correspondantes avec lesquelles les rapports ont été créés. Dans le cas des rapports SSRS, l'application console génère les rapports SSRS et les exporte en tant que fichiers PDF via l'API du service Web SSRS.

Jusqu'à présent SSRS a été beaucoup plus facile à traiter que le cristal à l'exception d'un certain rapport 25 000 pages que nous avons récemment converti des rapports de cristal à SSRS. Le serveur SSRS est un serveur 64 bits 2003 avec 32 Go de RAM exécutant SSRS 2005. Tous nos plus petits rapports fonctionnent de manière fantastique, mais nous avons des problèmes avec nos rapports plus volumineux comme celui-ci. Malheureusement, nous ne pouvons pas générer le rapport susmentionné via l'API du service Web. L'erreur suivante se produit environ 30 à 35 minutes dans la génération/export:

Message d'exception: La connexion sous-jacente a été fermée: Une erreur inattendue est survenue sur une réception.

L'appel de service Web est quelque chose que je suis sûr que vous avez tous vu:

data = rs.Render(this.ReportPath, this.ExportFormat, null, deviceInfo, 
    selectedParameters, null, null, out encoding, out mimeType, out usedParameters, 
    out warnings, out streamIds); 

La chose étrange est que ce rapport courra/render/exportation si le rapport est exécuté directement sur le serveur de rapports en utilisant le gestionnaire de rapports. Le processus qui produit les données pour le rapport dure environ 5 minutes. Le rapport s'affiche au format natif SSRS dans le navigateur/visualiseur après environ 12 minutes. L'exportation en pdf via le navigateur/visualiseur dans le gestionnaire de rapports prend 55 minutes supplémentaires. Cela fonctionne de manière fiable et il produit un énorme pdf de 1,03 Go.

Voici quelques-unes des choses les plus évidentes, j'ai essayé d'obtenir le rapport de travail via l'API de service Web:

  • définissez les HttpRuntime ExecutionTimeout valeur à 3 heures sur le rapport serveur
  • désactivé http garder alive sur le serveur de rapports
  • a augmenté le délai d'attente de script sur le serveur de rapports
  • mis le rapport en temps jamais sur le serveur
  • définir le délai de rapport à plusieurs heures sur l'appel client

Des coups secs que j'ai essayé, je suis assez à l'aise de dire que tous les problèmes de délai d'attente ont été éliminés.

En fonction de mes recherches sur le message d'erreur, je crois que l'API de service Web n'envoie pas de réponses fragmentées par défaut. Cela signifie qu'il essaie d'envoyer tous les 1,3 Gb sur le fil en une seule réponse. À un moment donné, IIS jette l'éponge. Malheureusement, l'API fait abstraction de la configuration du service Web, de sorte que je n'arrive pas à trouver un moyen d'activer la segmentation des réponses.Est-ce que quelqu'un sait de toute façon réduire/optimiser la phase d'exportation PDF et/ou la taille du PDF sans réduire le nombre total de pages?

  • Existe-t-il un moyen d'activer la segmentation de réponse pour SSRS?
  • Est-ce que quelqu'un d'autre a d'autres théories quant à savoir pourquoi cela fonctionne sur le serveur, mais pas à travers l'API? EDIT: Après avoir lu le post de kcrumley, j'ai commencé à regarder la taille moyenne de la page en prenant la taille du fichier/nombre de pages. Il est intéressant de noter que sur les plus petits rapports, les mathématiques fonctionnent de sorte que chaque page est d'environ 5K. Fait intéressant, lorsque le rapport augmente, cette «moyenne» augmente. Un rapport de 8000 pages par exemple est en moyenne plus de 40K/page. Très étrange. J'ajouterai également que le nombre d'enregistrements par page est défini à l'exception de la dernière page de chaque regroupement. Il ne s'agit donc pas d'un cas où certaines pages contiennent plus d'enregistrements qu'un autre.

  • Répondre

    3
    1. Est-ce que quelqu'un sait de toute façon à réduire /optimiser la phase d'exportation PDF et ou la taille du PDF sans compter abaisser la page total?

    J'ai quelques idées et questions:
    1. Est-ce un rapport graphique-lourds? Si non, avez-vous des tables qui commencent sous forme de texte mais qui sont converties en graphique par le moteur de rendu PDF de SSRS (vérifiez si vous pouvez sélectionner le texte dans le PDF)? 41 Ko par page pourraient être plus que ce qui devrait être, ou peut-être pas, selon la densité de votre rapport. Mais nous avons eu des cas où nous avions des problèmes mineurs avec la mise en page d'un rapport, comme avoir une table dans les marges de la page, ce qui a fait que le moteur de rendu SSRS "lève les mains" et rend la table . Évidemment, moins il y a de graphiques dans votre rapport, plus la taille de votre fichier sera petite.
    2. Y a-t-il un moyen de décomposer facilement le rapport en morceaux? Par exemple, s'il s'agit d'un rapport de 10 emplacements, où Emplacement 1 est suivi de Lieu 2, etc., sur votre rapport final, pourriez-vous exécuter la partie Emplacement 1 indépendamment de la partie Emplacement 2, etc.? Si c'est le cas, vous pouvez joindre les 10 sous-rapports en un seul fichier PDF final en utilisant PDFSharp après les avoir tous reçus. Cela conduit à quelques difficultés avec la numérotation des pages, mais rien d'insurmontable.

    3. Est-ce que quelqu'un d'autre a d'autres théories pour expliquer pourquoi cela fonctionne sur le serveur mais pas via l'API?

    Ma conjecture serait la taille pure du rapport. Je ne me souviens pas de tout ce qui concerne un paramètre IIS et de ce qui est spécifique à SSRS, mais il se peut qu'il existe des paramètres IIS globaux (peut-être dans Metabase.xml) que vous devez mettre à jour pour autoriser la transmission de données.

    Vous pouvez isoler la question de savoir si le temps est le problème en prenant l'un de vos rapports de travail et la construction d'un long temps d'attente dans vos procédures stockées avec WAITFOR (en supposant SQL Server pour votre SGBD).

    Pas de solutions, en soi, mais des idées. J'espère que cela aide.

    2

    De toute évidence, c'est un énorme rapport, en fait, il est plus proche d'une base de données de 1,3 Go, qu'un rapport.

    Avez-vous pensé à trouver un moyen de le diviser en plusieurs morceaux, puis de les combiner ensemble? (Utiliser l'une de plusieurs façons différentes de combiner des fichiers PDF figurant sur ce site.)

    3

    Nous PRECISEE les grandes exportations PDF à partir de SSRS et trouvé 2 principaux coupables

    1) À moins d'images sont le type de couleur JPG ou PNG 3, ils sont étendus à BMP Voir here

    2) à moins de configurer SSRS à se comporter autrement (non recommandé), puis SSRS intégreront les polices ou les sous-ensembles de polices dans le PDF, sauf si elles sont l'un des 5 'standard' PDF fonts. Bien qu'aucune des polices standard (autres que Symbol je suppose) ne soit installée sur la plupart des systèmes d'exploitation Windows, nous avons constaté que si vous utilisez Times New Roman, Courier New, or Arial, la substitution de polices directe et inversée aura lieu. La manière la plus simple de convertir vos fichiers RDL consiste à les afficher en XML et à rechercher et remplacer les tags FontFamily.

    Si vous devez utiliser une police non standard, alors, vous pouvez toujours minimiser les dégâts:

    • Utilisation en tant que peu de polices que vous pouvez. Recherchez dans le RDL XML pour vous assurer qu'il n'y a pas de polices redondantes.
    • Utilisez les polices TTF si vous utilisez différentes tailles de police.
    • Essayez de ne pas mélanger les variantes normales, en gras et en italique de la police, sinon elle sera intégrée plusieurs fois.
    Questions connexes